# IDN Catalogue PREFIX : PREFIX dcat: PREFIX dcterms: PREFIX owl: PREFIX prov: PREFIX rdf: PREFIX rdfs: PREFIX sdo: PREFIX sh: PREFIX skos: PREFIX time: PREFIX xsd: a owl:Ontology ; dcterms:provenance "This validator for the IDN Catalogue Profile was made within the IDN's ID Catalogue project 2021 - 2022."@en ; owl:versionIRI ; owl:versionInfo "0.0.1" ; sdo:codeRespository "https://github.com/idn-au/idn-catalogue-profile/"^^xsd:anyURI ; sdo:copyrightHolder ; sdo:copyrightNotice "(c) Indigenous Data Network, 2022" ; sdo:copyrightYear "2022"^^xsd:gYear ; sdo:creator ; sdo:dateCreated "2022-07-18"^^xsd:date ; sdo:dateIssued "2022-07-19"^^xsd:date ; sdo:dateModified "2023-05-08"^^xsd:date ; sdo:description "A SHACL validator IDN Catalogue Profile."@en ; sdo:license "https://creativecommons.org/licenses/by/4.0/"^^xsd:anyURI ; sdo:name "IDN CP Validator"@en ; sdo:publisher ; . a sdo:Person ; sdo:name "Nicholas J. Car"@en ; sdo:email "nick@kurrawong.ai"^^xsd:anyURI ; sdo:affiliation ; . a sdo:Organization ; sdo:name "KurrawongAI" ; sdo:description "KurrawongAI is a small, Artificial Intelligence, company in Australia specialising in Knowledge Graphs." ; sdo:url "https://kurrawong.ai"^^xsd:anyURI ; . a sdo:Organization ; sdo:name "Indigenous Data Network" ; sdo:description "The IDN is within the University of Melbourne. It was established in 2018 to support and coordinate the governance of Indigenous data for Aboriginal and Torres Strait Islander peoples and empower Aboriginal and Torres Strait Islander communities to decide their own local data priorities." ; sdo:url "https://mspgh.unimelb.edu.au/centres-institutes/centre-for-health-equity/research-group/indigenous-data-network"^^xsd:anyURI ; . # # Node Shapes # :catalog a sh:NodeShape ; sh:targetClass dcat:Catalog ; rdfs:label "IDN shape for Catalog" ; sh:property :resource-identifier , :resource-title , :resource-description , :resource-created , :resource-modified , :resource-direct-roles , :catalog-hasPart ; . :resource a sh:NodeShape ; sh:targetClass dcat:Resource ; rdfs:label "IDN shape for Resource" ; sh:property :resource-identifier , :resource-title , :resource-description , :resource-created , :resource-modified , :resource-direct-roles , :resource-type ; sh:or ( [ sh:path [ sh:inversePath dcterms:hasPart ] ; sh:maxCount 1 ; sh:class dcat:Catalog ; ] [ sh:path dcterms:isPartOf ; sh:minCount 1 ; sh:maxCount 1 ; ] ) ; . :dataset a sh:NodeShape ; sh:targetClass dcat:Dataset ; rdfs:label "IDN shape for Dataset" ; sh:property :resource-identifier , :resource-title , :resource-description , :resource-created , :resource-modified , :resource-direct-roles , :resource-hasPart , :resource-type ; . :attribution a sh:NodeShape ; sh:targetClass prov:Attribution ; rdfs:label "IDN shape for Attribution" ; sh:property :attribution-agent , :attribution-hadRole ; . :agent a sh:NodeShape ; sh:targetClass prov:Agent ; rdfs:label "IDN shape for Agent" ; sh:property :agent-as-org-or-person , :agent-name , :agent-url , :agent-email , :agent-description , :agent-identifier ; . :organization a sh:NodeShape ; sh:targetClass sdo:Organization ; rdfs:label "IDN shape for Organization" ; sh:property :agent-name , :organization-url , :agent-description , :agent-identifier ; . :person a sh:NodeShape ; sh:targetClass sdo:Person ; rdfs:label "IDN shape for Person" ; sh:property :agent-name , :person-email , :agent-description , :agent-identifier ; . :concept a sh:NodeShape ; sh:targetClass skos:Concept ; rdfs:label "IDN shape for Concept" ; rdfs:comment "This profile implements no shapes for Concept but inherits those of the VocPub Profile of SKOS" ; . :conceptScheme a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; rdfs:label "IDN shape for ConceptScheme" ; rdfs:comment "This profile implements no shapes for ConceptScheme but inherits those of the VocPub Profile of SKOS" ; . # # Property Shapes # :resource-identifier a sh:PropertyShape ; rdfs:label "Resource persistent identifier" ; sh:path dcterms:identifier ; sh:datatype xsd:token ; sh:message "Req R1: Each Resource instance SHOULD indicate a persistent identifier to be used to gain access to its point-of-truth metadata. The PID SHOULD be used as the Dataset instance's IRI, if it is an HTTP/HTTPS IRI, or else it SHOULD be quoted as a literal value, indicated with the property dcterms:identifier of datatype xsd:token." ; . :resource-title a sh:PropertyShape ; rdfs:label "Catalog basic resource metadata" ; sh:path dcterms:title ; sh:minCount 1 ; sh:maxCount 1 ; sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString ] ) ; sh:message "Req R2: Each Resource instance MUST provide basic Resource metadata so that exactly one of each of the following properties is required with range value as per Resource requirements: title, description, created & modified. The particular validator violated here is for title." ; . :resource-description a sh:PropertyShape ; rdfs:label "Catalog basic resource metadata" ; sh:path dcterms:description ; sh:minCount 1 ; sh:maxCount 1 ; sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString ] ) ; sh:message "Req R2: Each Resource instance MUST provide basic Resource metadata so that exactly one of each of the following properties is required with range value as per Resource requirements: title, description, created & modified. The particular validator violated here is for description." ; . :resource-created a sh:PropertyShape ; rdfs:label "Catalog basic resource metadata" ; sh:path dcterms:created ; sh:minCount 1 ; sh:maxCount 1 ; sh:or ( [ sh:datatype xsd:dateTime ] [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTimeStamp ] [ sh:datatype time:Instant ] ) ; sh:message "Req R2: Each Resource instance MUST provide basic Resource metadata so that exactly one of each of the following properties is required with range value as per Resource requirements: title, description, created & modified. The particular validator violated here is for created. Req R3: Allowed Semantic Web date/time properties for created & modified properties are xsd:date, xsd:dateTime, xsd:dateTimeStamp, time:Interval" ; . :resource-modified a sh:PropertyShape ; rdfs:label "Catalog basic resource metadata" ; sh:path dcterms:modified ; sh:minCount 1 ; sh:maxCount 1 ; sh:or ( [ sh:datatype xsd:dateTime ] [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTimeStamp ] [ sh:datatype time:Instant ] ) ; sh:message "Req R2: Each Resource instance MUST provide basic Resource metadata so that exactly one of each of the following properties is required with range value as per Resource requirements: title, description, created & modified. The particular validator violated here is for modified. Req R3: Allowed Semantic Web date/time properties for created & modified properties are xsd:date, xsd:dateTime, xsd:dateTimeStamp, time:Interval" ; . :resource-direct-roles a sh:PropertyShape ; rdfs:label "Not direct Agent roles" ; sh:path [ sh:alternativePath ( dcterms:audience dcat:contactPoint dcterms:contributor dcterms:creator dcterms:mediator dcterms:publisher dcterms:rightsHolder ) ] ; sh:maxCount 0 ; sh:message "Req R4: Each Resource instance MUST NOT indicate Agent roles with direct DCAT properties (e.g. publisher) and MUST indicate them with the DCAT-recommended PROV qualified attribution pattern with each prov:Attribution indicated with the property prov:qualifiedAttribution." ; . :catalog-hasPart a sh:PropertyShape ; rdfs:label "Catalogue Parts" ; sh:path dcterms:hasPart ; sh:minCount 1 ; sh:or ( [ sh:class dcat:Resource ] [ sh:class dcat:Dataset ] ) ; sh:message "Req C2: Each Catalog instance MUST contain at least one Resource indicated by the hasPart property." ; . :resource-hasPart a sh:PropertyShape ; rdfs:label "Resource hasPart" ; sh:path [ sh:inversePath dcterms:hasPart ] ; sh:maxCount 1 ; sh:class dcat:Catalog ; sh:message "Req R5: Each Resource instance, if it is not a Catalog instance MUST, and if it is a Catalog instance MAY, indicate that it is within at least one Catalog instance with an in-bound hasPart property from a Catalog instance." ; . :resource-type a sh:PropertyShape ; rdfs:comment "Nothing to test" ; sh:path dcterms:type ; . :attribution-agent a sh:PropertyShape ; rdfs:label "Attribution Agent" ; sh:path prov:agent ; sh:minCount 1 ; sh:maxCount 1 ; sh:or ( [ sh:class sdo:Organization ] [ sh:class sdo:Person ] ) ; sh:message "Req A1: Each Attribution instance MUST indicate an Agent instance with the property prov:agent and a role for that Agent, as a skos:Concept, in relation to the attributing entity, with the hadRole property." ; . :attribution-hadRole a sh:PropertyShape ; rdfs:label "Attribution Role" ; sh:path dcat:hadRole ; sh:minCount 1 ; sh:class skos:Concept ; sh:message "Req A1: Each Attribution instance MUST indicate an Agent instance with the property prov:agent and a role for that Agent, as a skos:Concept, in relation to the attributing entity, with the hadRole property." ; . :agent-as-org-or-person a sh:PropertyShape ; rdfs:label "Agent as Org or Person" ; sh:path rdf:type ; sh:minCount 1 ; sh:maxCount 1 ; sh:or ( [ sh:class sdo:Organization ] [ sh:class sdo:Person ] ) ; sh:message "Req AG1: Each Agent instance MUST be either an sdo:Organization or a sdo:Person instance." ; . :agent-name a sh:PropertyShape ; rdfs:label "Agent name" ; sh:path sdo:name ; sh:minCount 1 ; sh:maxCount 1 ; sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString ] ) ; sh:message "Req AG2: Each Agent instance MUST be described with at least the sdo:name property and, if an sdo:Organization, also an sdo:url property with a xsd:anyURI value or, if a sdo:Person, an sdo:email property with a xsd:anyURI value." ; . :agent-url a sh:PropertyShape ; rdfs:label "Agent URL" ; sh:path sdo:url ; sh:datatype xsd:anyURI ; sh:message "Req AG2: Each Agent instance MUST be described with at least the sdo:name property and, if an sdo:Organization, also an sdo:url property with a xsd:anyURI value or, if a sdo:Person, an sdo:email property with a xsd:anyURI value." ; . :agent-email a sh:PropertyShape ; rdfs:label "Person email" ; sh:path sdo:email ; sh:datatype xsd:anyURI ; sh:message "Req AG2: Each Agent instance MUST be described with at least the sdo:name property and, if an sdo:Organization, also an sdo:url property with a xsd:anyURI value or, if a sdo:Person, an sdo:email property with a xsd:anyURI value." ; . :agent-description a sh:PropertyShape ; rdfs:label "Agent description" ; sh:path sdo:description ; sh:maxCount 1 ; sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString ] ) ; sh:message "Req AG3: Each Agent instance SHOULD be described with a sdo:description property and, if the Agent has them, identifiers for it should be indicated with dcterms:identifier with xsd:anyURI or xsd:token values." ; . :agent-identifier a sh:PropertyShape ; rdfs:label "Agent identifier" ; sh:path sdo:identifier ; sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString ] ) ; sh:message "Req AG3: Each Agent instance SHOULD be described with a sdo:description property and, if the Agent has them, identifiers for it should be indicated with sdo:identifier with xsd:anyURI or xsd:token values." ; . :organization-url a sh:PropertyShape ; rdfs:label "Organization URL" ; sh:path sdo:url ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:anyURI ; sh:message "Req AG2: (organization-email) Each Agent instance MUST be described with at least the sdo:name property and, if an sdo:Organization, also an sdo:url property with a xsd:anyURI value or, if a sdo:Person, an sdo:email property with a xsd:anyURI value." ; . :agent-identifier a sh:PropertyShape ; rdfs:label "Agent identifier" ; sh:path sdo:identifier ; sh:or ( [ sh:datatype xsd:token ] [ sh:datatype xsd:anyURI ] ) ; sh:message "Req R1: Each Resource instance SHOULD indicate a persistent identifier to be used to gain access to its point-of-truth metadata. The PID SHOULD be used as the Dataset instance's IRI, if it is an HTTP/HTTPS IRI, or else it SHOULD be quoted as a literal value, indicated with the property dcterms:identifier of datatype xsd:token." ; . :person-email a sh:PropertyShape ; rdfs:label "Person email" ; sh:path sdo:email ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:anyURI ; sh:message "Req AG2: (person-email) Each Agent instance MUST be described with at least the sdo:name property and, if an sdo:Organization, also an sdo:url property with a xsd:anyURI value or, if a sdo:Person, an sdo:email property with a xsd:anyURI value." ; .