PREFIX dcat: PREFIX dcterms: PREFIX owl: PREFIX prov: PREFIX reg: PREFIX rdf: PREFIX rdfs: PREFIX schema: PREFIX sh: PREFIX skos: PREFIX xsd: BASE a owl:Ontology ; schema:name "Vocabulary profile 'vp4Cat' Validator"@en ; schema:definition "SHACL validator for the vp4Cat Profile (based on VocPub Profile)"@en ; schema:creator ; schema:contributor ; schema:publisher ; schema:dateCreated "2020-06-14"^^xsd:date ; schema:dateModified "2026-08-27"^^xsd:date ; owl:versionIRI ; owl:versionInfo """vp4cat-5.3 has following modification vs. vocpub 5.2 vp4cat is versioned independently of vocpub from 5.3 on. This release is based on vocpub 5.2. - Modified Requirement-2.4.3b to allow schema:url as alternative to schema:email for Persons - Modified Requirement-2.3.4 to also accept prov:hadPrimarySource as alternative - Modified Requirement-2.2.2 to also accept for dcterms:provenance - Removed sh:maxCount on skos:prefLabel so that a concept can be labelled in several languages - Removed the VocEdit SHACL UI shapes, which reported every prefLabel and definition result twice - Changed IRI to https://w3id.org/nfdi4cat/vp4cat - Added contributor David Linke - Updated publisher to NFDI4Cat Vocpub 5.2 ChangeLog: 5.2 Implement Shape 2.1.2+3 using qualified shape pattern as this is supported by pySHACL 5.1 Remove targetNode -> ConceptScheme shape, use schema:, not schema: 5.0 Change IRI to linked.data.gov.au 4.11 Add VocEdit SHACL UI shapes and RDF statements 4.10 move all warning from PropertyShapes to NodeShapes 4.9 Fixed RDF syntax errors 4.8 Fixed Warning/Violation error for PropertyShapes 4.7 Fixed modified date alternate path listing bug 4.6 Fixed schema:historyNote->skos:historyNote bug 4.5 Added suggested predicates of license & copyrightHolder 4.4 Fixed versions across multiple Resources 4.3 Improved validator error messages by using more named Property Shapes 4.2: Included CONSTRUCT-based pre-validation inference in validator. First Git tagged version 4.1: Added Requirements 2.1.10, 2.1.11 & 2.1.12 and example RDF 4.0: Added a SPARQL function to allow for the inferenceing of skos:inScheme predicates, skos:broader / skos:narrower and skos:topConceptOf/skos:hasTopConcept pairs of inverse predicates 3.3: Converted validator metadata to schema.org, enabled bibliographic references for Concepts, enabled DCTERMS or schema.org for many ConceptScheme predicates; simplified 2.1.6 from two Requirements to one; included skos:topConceptOf in 2.1.8 for Concepts at the top of the hierarchy; collapsed title & definition requirement pairs to single requirements 3.2: Allowed dcterms:provenance and skos:historyNote; removed max restriction on dcterms:source & prov:wasDerivedFrom 3.1: Changed dcterms:provenance to skos:historyNote 3.0: Removed Requirement-2.3.5 (identifiers) as these are auto-generated in systems like VocPrez; Added Requirement-2.1.10 & 2.1.11 and sub parts to test for qualifiedDerivation and status of a ConceptScheme""" ; . a schema:Organization ; schema:name "NFDI4Cat Consortium for FAIR Research Data Management in Catalysis" ; schema:url "https://nfdi4cat.org"^^xsd:anyURI ; . a schema:Person ; schema:name "Nicholas J. Car" ; schema:email "nicholas.car@anu.edu.au"^^xsd:anyURI ; schema:identifier "https://orcid.org/0000-0002-8742-7730"^^xsd:anyURI ; . a schema:Person ; schema:name "David Linke" ; schema:url "https://github.com/dalito"^^xsd:anyURI ; schema:identifier "https://orcid.org/0000-0002-5898-1820"^^xsd:anyURI . # # Node Shapes # # # ConceptScheme # # Requirement-2.1.1 so far un-implemented in SHACL a sh:NodeShape ; sh:targetNode skos:ConceptScheme ; sh:property ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:message "Requirement 2.1.4 Each vocabulary MUST have exactly one title and at least one definition indicated using the skos:prefLabel and the skos:definition predicates respectively that must give textual literal values. Only one definition per language is allowed" ; sh:property , ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:message "Requirement 2.1.5 Each vocabulary MUST have exactly one created date and exactly one modified date indicated using the schema:dateCreated and schema:dateModified or dcterms:created and dcterms:modified predicates respectively that must be either an xsd:date, xsd:dateTime or xsd:dateTimeStamp literal value" ; sh:property , ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:message "Requirement 2.1.6 Each vocabulary MUST have at least one creator, indicated using schema:creator or dcterms:creator predicate and exactly one publisher, indicated using schema:publisher or dcterms:publisher, all of which MUST be IRIs indicating instances of schema:Person, or schema:Organization" ; sh:property , ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:message "Requirement 2.1.7 The origins of a Concept Scheme MUST be indicated by at least one of the following predicates: skos:historyNote, schema:citation, prov:wasDerivedFrom. dcterms:source MAY be used instead of schema:citation and dcterms:provenance MAY be used instead of skos:historyNote but the schema.org and SKOS predicates are preferred" ; sh:or ( ) ; . a sh:NodeShape ; sh:targetClass skos:Concept ; sh:property [ sh:message "Requirement 2.1.8 All Concept instances within a Concept Scheme MUST be contained in a single term hierarchy using skos:hasTopConcept / skos:topConceptOf predicates indicating the broadest Concepts in the vocabulary and then skos:broader and/or skos:narrower predicates for all non-broadest Concepts in a hierarchy that contains no cycles" ; sh:path skos:inScheme ; sh:minCount 1 ; sh:maxCount 1 ; sh:class skos:ConceptScheme ; ] ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:property [ sh:class skos:Concept ; sh:message "Requirement 2.1.9 Each vocabulary's Concept Scheme MUST link to at least one Concept within the vocabulary with the skos:hasTopConcept predicate" ; sh:path skos:hasTopConcept ; sh:minCount 1 ; sh:nodeKind sh:IRI ; ] ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:property [ sh:message "Requirement 2.1.10 The status of the vocabulary as a whole, according to the Registry Status standard, SHOULD be given with the predicate reg:status indicating a Concept from the Registry Statuses vocabulary (https://linked.data.gov.au/def/reg-statuses)" ; sh:path reg:status ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; ] ; sh:severity sh:Warning ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:property [ sh:message "Requirement 2.1.11 The derivation status of the vocabulary SHOULD be given should be given with the predicate prov:qualifiedDerivation indicating a Blank Node that contains the predicated prov:entity, to indicate the vocabulary derived from and prov:hadRole to indicate the mode of derivation which SHOULD be taken from the Vocabulary Derivation Modes vocabulary (https://linked.data.gov.au/def/vocdermods)" ; sh:path prov:qualifiedDerivation ; sh:nodeKind sh:BlankNodeOrIRI ; ] ; sh:severity sh:Warning ; . a sh:NodeShape ; sh:targetObjectsOf prov:qualifiedDerivation ; sh:property [ sh:message "Requirement 2.1.11 If a vocabulary has a qualified derivation given, it MUST then give a prove:entity predicate within the derivation" ; sh:path prov:entity ; sh:nodeKind sh:IRI ; sh:minCount 1 ; sh:maxCount 1 ; ] ; . a sh:NodeShape ; sh:targetObjectsOf prov:qualifiedDerivation ; sh:property [ sh:message "Requirement 2.1.11 If a vocabulary has a qualified derivation given, it MUST then give a prove:hadRole predicate within the derivation" ; sh:path prov:hadRole ; sh:nodeKind sh:IRI ; sh:minCount 1 ; sh:maxCount 1 ; ] ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:property [ sh:message "Requirement 2.1.12 High-level theming of a vocabulary SHOULD be given by using the schema:keywords predicate indicating Concepts from another vocabulary. Alternatively, dcat:theme MAY be used. Text literal values for either predicate SHOULD NOT be used" ; sh:path [ sh:alternativePath ( schema:keywords dcat:theme ) ; ] ; sh:nodeKind sh:IRI ; ] ; sh:severity sh:Warning ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:property [ sh:message "Requirement 2.1.13 Any licence pertaining to the reuse of a vocabulary's content SHOULD be given using the schema:license predicate preferentially indicating the IRI of a license if in RDF form or a literal URL (datatype xsd:anyURI) if online but not in RDF form. If the licence is expressed in text, a literal text field may be indicated" ; sh:path schema:license ; sh:nodeKind sh:IRI ; sh:or ( [ sh:nodeKind sh:IRI ] [ sh:datatype xsd:anyURI ] [ sh:datatype xsd:string ] ) ; sh:severity sh:Warning ; ] ; . a sh:NodeShape ; sh:targetClass skos:ConceptScheme ; sh:property [ sh:message "Requirement 2.1.14 The copyright holder for the vocabulary SHOULD be given using the schema:copyrightHolder predicate preferentially indicating the IRI of an Agent or a Blank Node instance of an Agent containing details as per Agent requirements. A prov:qualifiedAttribution predicate indicating an Agent with the prov:hadRole predicate indicating the value isorole:rightsHolder may be used instead of schema:copyrightHolder" ; sh:path schema:copyrightHolder ; sh:nodeKind sh:IRI ; ] ; sh:severity sh:Warning ; . # # Collections # a sh:NodeShape ; sh:targetClass skos:Collection ; sh:message "Requirement 2.1.4 Each Collection MUST have exactly one title and at least one definition indicated using the skos:prefLabel and the skos:definition predicates respectively that must give textual literal values. Only one definition per language is allowed" ; sh:property , ; . a sh:NodeShape ; sh:message "Requirement 2.2.2 The origins of a Collection, if different from its containing Concept Scheme, SHOULD be indicated by at least one of the following predicates: skos:historyNote, schema:citation, prov:wasDerivedFrom. dcterms:source MAY be used instead of schema:citation and dcterms:provenance MAY be used instead of skos:historyNote but the schema.org and SKOS predicates are preferred" ; sh:targetClass skos:Collection ; sh:or ( ) ; sh:severity sh:Warning ; . a sh:NodeShape ; sh:targetClass skos:Collection ; sh:property [ sh:path skos:inScheme ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "Requirement 2.2.3 A Collection exists within a vocabulary SHOULD indicate that it is within the vocabulary by use of the skos:inScheme predicate. If it is defined for the first time in the vocabulary, it should also indicate this with the rdfs:isDefinedBy predicate. This message is about skos:inScheme" ; ] , [ sh:path rdfs:isDefinedBy ; sh:minCount 1 ; sh:maxCount 1 ; sh:message "Requirement 2.2.3 A Collection exists within a vocabulary SHOULD indicate that it is within the vocabulary by use of the skos:inScheme predicate. If it is defined for the first time in the vocabulary, it should also indicate this with the rdfs:isDefinedBy predicate. This message is about rdfs:isDefinedBy" ; ] ; sh:severity sh:Warning ; . a sh:NodeShape ; sh:targetClass skos:Collection ; sh:property [ sh:path skos:member ; sh:minCount 1 ; sh:message "Requirement 2.2.4 A Collection MUST indicate at least one Concept instance that is within the collection with use of the skos:member predicate. The Concept need not be defined by the Concept Scheme that defines the Collection" ; sh:nodeKind sh:IRI ; ] ; . # # Concept # a sh:NodeShape ; sh:targetClass skos:Concept ; sh:message "Requirement 2.1.4 Each Concept MUST have exactly one title and at least one definition indicated using the skos:prefLabel and the skos:definition predicates respectively that must give textual literal values. Only one definition per language is allowed" ; sh:property , ; . a sh:NodeShape ; sh:targetClass skos:Concept ; sh:message "Requirement 2.3.2 Each Concept in a vocabulary MAY indicate the vocabulary that defines it by use of the rdfs:isDefinedBy predicate indicating a Concept Scheme instance. If no such predicate is given, the Concept Scheme in the file that a Concept is provided in is understood to be the defining Concept Scheme" ; sh:property [ sh:path rdfs:isDefinedBy ; sh:minCount 0 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; sh:severity sh:Warning ; ] ; . a sh:NodeShape ; sh:targetClass skos:Concept ; sh:property [ sh:path skos:inScheme ; sh:minCount 1 ; sh:nodeKind sh:IRI ; sh:message "Requirement 2.3.3 Each Concept in a vocabulary MUST indicate that it appears within that vocabulary's hierarchy of Concepts either directly by use of the skos:topConceptOf predicate indicating the vocabulary or indirectly by use of one or more skos:broader / skos:narrower predicates placing the Concept within a chain of other Concepts, the top concept of which uses the skos:topConceptOf predicate to indicate the vocabulary" ; ] ; . a sh:NodeShape ; sh:targetClass skos:Concept ; sh:message "Requirement 2.3.4 The origins of a Concept, if different from its containing Concept Scheme, SHOULD be indicated by at least one of the following predicates: skos:historyNote, schema:citation, prov:wasDerivedFrom, prov:hadPrimarySource. dcterms:source MAY be used instead of schema:citation and dcterms:provenance MAY be used instead of skos:historyNote but the schema.org and SKOS predicates are preferred" ; sh:or ( ) ; sh:severity sh:Warning ; . # # Agent # a sh:NodeShape ; sh:targetClass schema:Organization , schema:Person ; sh:property [ sh:path schema:name ; sh:minCount 1 ; sh:maxCount 1 ; sh:datatype xsd:string ; sh:message "Requirement 2.4.2 Each Agent MUST give exactly one name with the schema:name predicate indicating a literal text value" ; ] ; . a sh:NodeShape ; sh:targetClass schema:Organization ; sh:property [ sh:path schema:url ; sh:minCount 1 ; sh:datatype xsd:anyURI ; sh:message "Requirement 2.4.3 Each Agent MUST indicate either a schema:url (for organizations) or a schema:email (for people) predicate with a URL or email value. This error message is for Organizations" ; ] ; . a sh:NodeShape ; sh:targetClass schema:Person ; sh:property [ sh:path [ sh:alternativePath ( schema:email schema:url ) ; ] ; sh:minCount 1 ; sh:datatype xsd:anyURI ; sh:message "Requirement 2.4.3 Each Agent MUST indicate either a schema:url or a schema:email predicate with a URL or email value. This error message is for Persons" ; ] ; . # # Property Shapes # a sh:PropertyShape ; sh:path [ sh:inversePath rdf:type ] ; sh:message "Requirement 2.1.2 Each vocabulary MUST be presented as a single Concept Scheme object & Requirement 2.1.3 Each vocabulary MUST be presented in a single RDF file which does not contain information other than that which is directly part of the vocabulary" ; sh:qualifiedValueShape [ sh:path rdf:type ; sh:hasValue skos:ConceptScheme ; ] ; sh:qualifiedMinCount 1 ; sh:qualifiedMaxCount 2 ; . a sh:PropertyShape ; sh:message "Requirement 2.1.4, 2.2.1 or 2.3.1 Each vocabulary, Collection or Concept MUST have exactly one title and at least one definition indicated using the skos:prefLabel and the skos:definition predicates respectively that must give textual literal values. Only one definition per language is allowed" ; sh:path skos:prefLabel ; sh:minCount 1 ; # No sh:maxCount: SKOS allows one prefLabel per language and # sh:uniqueLang below already enforces that. See issue #366. sh:uniqueLang true ; sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString ] ) ; . a sh:PropertyShape ; sh:message "Requirement 2.1.4, 2.2.1 or 2.3.1 Each vocabulary, Collection or Concept MUST have exactly one title and at least one definition indicated using the skos:prefLabel and the skos:definition predicates respectively that must give textual literal values. Only one definition per language is allowed" ; sh:path skos:definition ; sh:minCount 1 ; sh:uniqueLang true ; sh:or ( [ sh:datatype xsd:string ] [ sh:datatype rdf:langString ] ) ; . a sh:PropertyShape ; sh:message "Requirement 2.15 - created date - violated" ; sh:path [ sh:alternativePath ( schema:dateCreated dcterms:created ) ; ] ; sh:minCount 1 ; sh:maxCount 1 ; sh:or ( [ sh:datatype xsd:dateTime ] [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTimeStamp ] ) ; . a sh:PropertyShape ; sh:message "Requirement 2.15 - modified date - violated" ; sh:path [ sh:alternativePath ( schema:dateModified dcterms:modified ) ; ] ; sh:minCount 1 ; sh:maxCount 1 ; sh:or ( [ sh:datatype xsd:dateTime ] [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTimeStamp ] ) ; . a sh:PropertyShape ; sh:message "Requirement 2.1.6 Each vocabulary MUST have at least one creator, indicated using schema:creator or dcterms:creator predicate and exactly one publisher, indicated using schema:publisher or dcterms:publisher, all of which MUST be IRIs indicating instances of schema:Person, or schema:Organization. This error message is for creator" ; sh:path [ sh:alternativePath ( schema:creator dcterms:creator ) ; ] ; sh:minCount 1 ; sh:or ( [ sh:class schema:Organization ] [ sh:class schema:Person ] ) ; . a sh:PropertyShape ; sh:path [ sh:alternativePath ( schema:publisher dcterms:publisher ) ; ] ; sh:minCount 1 ; sh:message "Requirement 2.1.6 Each vocabulary MUST have at least one creator, indicated using schema:creator or dcterms:creator predicate and exactly one publisher, indicated using schema:publisher or dcterms:publisher, all of which MUST be IRIs indicating instances of schema:Person, or schema:Organization. This error message is for publisher" ; sh:or ( [ sh:class schema:Organization ] [ sh:class schema:Person ] ) ; . a sh:PropertyShape ; sh:path prov:wasDerivedFrom ; sh:minCount 1 ; sh:nodeKind sh:IRI ; sh:severity sh:Warning ; . a sh:PropertyShape ; sh:path schema:citation ; sh:minCount 1 ; sh:or ( [ sh:datatype xsd:anyURI ] [ sh:datatype xsd:string ] ) ; sh:severity sh:Warning ; . a sh:PropertyShape ; sh:path dcterms:source ; sh:minCount 1 ; sh:or ( [ sh:datatype xsd:anyURI ] [ sh:datatype xsd:string ] ) ; sh:severity sh:Warning ; . a sh:PropertyShape ; sh:path skos:historyNote ; sh:minCount 1 ; sh:or ( [ sh:datatype rdf:langString ] [ sh:datatype xsd:string ] ) ; sh:severity sh:Warning ; . a sh:PropertyShape ; sh:path dcterms:provenance ; sh:minCount 1 ; sh:or ( [ sh:nodeKind sh:IRI ] [ sh:datatype rdf:langString ] [ sh:datatype xsd:string ] ) ; sh:severity sh:Warning ; . a sh:PropertyShape ; sh:path prov:hadPrimarySource ; sh:minCount 1 ; sh:nodeKind sh:IRI ; sh:severity sh:Warning ; .