diff --git a/skohub.shacl.ttl b/skohub.shacl.ttl
index ce45c6d..84ca58d 100644
--- a/skohub.shacl.ttl
+++ b/skohub.shacl.ttl
@@ -9,6 +9,7 @@
@prefix dct: .
@prefix sdo: .
@prefix vann: .
+@prefix dc: .
# rdfs:comment holds info with what file under ./tests/invalid/skohub.shacl.ttl
# the constraint is tested
@@ -17,14 +18,32 @@
:ConceptSchemeShape
a sh:NodeShape ;
sh:targetClass skos:ConceptScheme ;
- sh:property [
- sh:path dct:title ;
- sh:minCount 1;
- sh:datatype rdf:langString ;
- sh:message "Concept Scheme has no dct:title with a language tag!" ;
- sh:severity sh:Violation ;
- rdfs:comment "Tested with 01_cs_no_title.ttl" ;
- ] ;
+ sh:or (
+ [
+ sh:path dct:title ;
+ sh:minCount 1;
+ sh:datatype rdf:langString ;
+ sh:message "Concept Scheme has no dct:title with a language tag!" ;
+ sh:severity sh:Violation ;
+ rdfs:comment "Tested with 01_cs_no_title.ttl" ;
+ ]
+ [
+ sh:path skos:prefLabel ;
+ sh:minCount 1;
+ sh:datatype rdf:langString ;
+ sh:message "Concept Scheme has no skos:prefLabel with a language tag!" ;
+ sh:severity sh:Violation ;
+ rdfs:comment "Tested with 01_cs_no_title.ttl" ;
+ ]
+ [
+ sh:path dc:title ;
+ sh:minCount 1;
+ sh:datatype rdf:langString ;
+ sh:message "Concept Scheme has no dc:title with a language tag!" ;
+ sh:severity sh:Violation ;
+ rdfs:comment "Tested with 01_cs_no_title.ttl" ;
+ ]
+ );
sh:property [
sh:path skos:hasTopConcept ;
sh:minCount 1 ;
@@ -40,15 +59,26 @@
sh:message "The target class for hasTopConcept should be skos:Concept" ;
rdfs:comment "Tested with 03_cs_target_class_hasTopConcept.ttl" ;
] ;
- sh:property [
- sh:path dct:description ;
- sh:datatype rdf:langString ;
- sh:severity sh:Warning ;
- sh:minCount 1 ;
- sh:message: "A description of the Concept Scheme should be provided." ;
- rdfs:comment "Tested with 04_cs_no_description.ttl" ;
- rdfs:comment "Tested with 05_cs_description_no_langstring.ttl" ;
- ] ;
+ sh:or (
+ [
+ sh:path dct:description ;
+ sh:datatype rdf:langString ;
+ sh:severity sh:Warning ;
+ sh:minCount 1 ;
+ sh:message: "A description of the Concept Scheme should be provided." ;
+ rdfs:comment "Tested with 04_cs_no_description.ttl" ;
+ rdfs:comment "Tested with 05_cs_description_no_langstring.ttl" ;
+ ]
+ [
+ sh:path dc:description ;
+ sh:datatype rdf:langString ;
+ sh:severity sh:Warning ;
+ sh:minCount 1 ;
+ sh:message: "A description of the Concept Scheme should be provided." ;
+ rdfs:comment "Tested with 04_cs_no_description.ttl" ;
+ rdfs:comment "Tested with 05_cs_description_no_langstring.ttl" ;
+ ]
+ ) ;
sh:property [
sh:path dct:license ;
sh:minCount 1 ;
diff --git a/tests/valid/skohub.shacl.ttl/02_valid_skohub_file_cs_prefLabel.ttl b/tests/valid/skohub.shacl.ttl/02_valid_skohub_file_cs_prefLabel.ttl
new file mode 100644
index 0000000..ff7e0b2
--- /dev/null
+++ b/tests/valid/skohub.shacl.ttl/02_valid_skohub_file_cs_prefLabel.ttl
@@ -0,0 +1,56 @@
+@base .
+@prefix dct: .
+@prefix skos: .
+@prefix schema: .
+@prefix vann: .
+
+# This Concept Scheme has a skos:prefLabel
+
+<> a skos:ConceptScheme ;
+ skos:prefLabel "Test Vokabular"@de, "Test Vocabulary"@en ;
+ dct:description "Test Beschreibung"@de, "Test Description"@en ;
+ dct:issued "2019-12-11" ;
+ dct:publisher ;
+ dct:license ;
+ vann:preferredNamespaceUri "https://w3id.org/test" ;
+ skos:hasTopConcept .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 1"@de, "Concept 1"@en ;
+ skos:altLabel "Alternativbezeichnung 1"@de, "Alternativbezeichnung 2"@de, "Alt Label 1"@en ;
+ skos:hiddenLabel "Verstecktes Label 1"@de, "Verstecktes Label 2"@de ;
+ skos:definition "Meine Definition"@de ;
+ skos:scopeNote "Meine Scope Note"@de ;
+ skos:note "Meine Anmerkung"@de ;
+ skos:notation "1", "notation" ;
+ skos:example "Ein Beispiel"@de ;
+ skos:narrower ;
+ skos:narrowerTransitive ;
+ skos:narrowMatch ;
+ skos:related ;
+ skos:relatedMatch ;
+ skos:closeMatch ;
+ skos:exactMatch ;
+ skos:topConceptOf <> .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 2"@de, "Concept 2"@en ;
+ skos:narrower ;
+ skos:broader ;
+ skos:broaderTransitive ;
+ skos:broadMatch ;
+ skos:inScheme <> .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 3"@de ;
+ skos:broader ;
+ skos:inScheme <> .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 4"@de ;
+ skos:broader ;
+ skos:inScheme <> .
+
+ a skos:Collection ;
+ skos:prefLabel "Meine Collection"@de, "My Collection"@en ;
+ skos:member , .
diff --git a/tests/valid/skohub.shacl.ttl/03_valid_skohub_file_cs_dctitle.ttl b/tests/valid/skohub.shacl.ttl/03_valid_skohub_file_cs_dctitle.ttl
new file mode 100644
index 0000000..7a52b89
--- /dev/null
+++ b/tests/valid/skohub.shacl.ttl/03_valid_skohub_file_cs_dctitle.ttl
@@ -0,0 +1,57 @@
+@base .
+@prefix dct: .
+@prefix skos: .
+@prefix schema: .
+@prefix vann: .
+@prefix dc: .
+
+# This Concept Scheme has a dc:title field
+
+<> a skos:ConceptScheme ;
+ dc:title "Test Vokabular"@de, "Test Vocabulary"@en ;
+ dct:description "Test Beschreibung"@de, "Test Description"@en ;
+ dct:issued "2019-12-11" ;
+ dct:publisher ;
+ dct:license ;
+ vann:preferredNamespaceUri "https://w3id.org/test" ;
+ skos:hasTopConcept .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 1"@de, "Concept 1"@en ;
+ skos:altLabel "Alternativbezeichnung 1"@de, "Alternativbezeichnung 2"@de, "Alt Label 1"@en ;
+ skos:hiddenLabel "Verstecktes Label 1"@de, "Verstecktes Label 2"@de ;
+ skos:definition "Meine Definition"@de ;
+ skos:scopeNote "Meine Scope Note"@de ;
+ skos:note "Meine Anmerkung"@de ;
+ skos:notation "1", "notation" ;
+ skos:example "Ein Beispiel"@de ;
+ skos:narrower ;
+ skos:narrowerTransitive ;
+ skos:narrowMatch ;
+ skos:related ;
+ skos:relatedMatch ;
+ skos:closeMatch ;
+ skos:exactMatch ;
+ skos:topConceptOf <> .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 2"@de, "Concept 2"@en ;
+ skos:narrower ;
+ skos:broader ;
+ skos:broaderTransitive ;
+ skos:broadMatch ;
+ skos:inScheme <> .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 3"@de ;
+ skos:broader ;
+ skos:inScheme <> .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 4"@de ;
+ skos:broader ;
+ skos:inScheme <> .
+
+ a skos:Collection ;
+ skos:prefLabel "Meine Collection"@de, "My Collection"@en ;
+ skos:member , .
diff --git a/tests/valid/skohub.shacl.ttl/04_valid_skohub_file_dc_description.ttl b/tests/valid/skohub.shacl.ttl/04_valid_skohub_file_dc_description.ttl
new file mode 100644
index 0000000..2db25cb
--- /dev/null
+++ b/tests/valid/skohub.shacl.ttl/04_valid_skohub_file_dc_description.ttl
@@ -0,0 +1,57 @@
+@base .
+@prefix dct: .
+@prefix skos: .
+@prefix schema: .
+@prefix vann: .
+@prefix dc: .
+
+# Concept Scheme has a dc:description
+
+<> a skos:ConceptScheme ;
+ dct:title "Test Vokabular"@de, "Test Vocabulary"@en ;
+ dc:description "Test Beschreibung"@de, "Test Description"@en ;
+ dct:issued "2019-12-11" ;
+ dct:publisher ;
+ dct:license ;
+ vann:preferredNamespaceUri "https://w3id.org/test" ;
+ skos:hasTopConcept .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 1"@de, "Concept 1"@en ;
+ skos:altLabel "Alternativbezeichnung 1"@de, "Alternativbezeichnung 2"@de, "Alt Label 1"@en ;
+ skos:hiddenLabel "Verstecktes Label 1"@de, "Verstecktes Label 2"@de ;
+ skos:definition "Meine Definition"@de ;
+ skos:scopeNote "Meine Scope Note"@de ;
+ skos:note "Meine Anmerkung"@de ;
+ skos:notation "1", "notation" ;
+ skos:example "Ein Beispiel"@de ;
+ skos:narrower ;
+ skos:narrowerTransitive ;
+ skos:narrowMatch ;
+ skos:related ;
+ skos:relatedMatch ;
+ skos:closeMatch ;
+ skos:exactMatch ;
+ skos:topConceptOf <> .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 2"@de, "Concept 2"@en ;
+ skos:narrower ;
+ skos:broader ;
+ skos:broaderTransitive ;
+ skos:broadMatch ;
+ skos:inScheme <> .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 3"@de ;
+ skos:broader ;
+ skos:inScheme <> .
+
+ a skos:Concept ;
+ skos:prefLabel "Konzept 4"@de ;
+ skos:broader ;
+ skos:inScheme <> .
+
+ a skos:Collection ;
+ skos:prefLabel "Meine Collection"@de, "My Collection"@en ;
+ skos:member , .