diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..feb9535 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.cpcache +/.nrepl-port diff --git a/deps.edn b/deps.edn index ea3d3fd..5b0fa9f 100644 --- a/deps.edn +++ b/deps.edn @@ -1,15 +1,29 @@ -{:aliases {:pmd4 {:extra-deps {swirrl/validations.pmd4 {:local/root "pmd4"}}} - :pmd-qb {:extra-deps {swirrl/validations.pmd-qb {:local/root "pmd-qb"}}} - :misc {:extra-deps {swirrl/validations.pmd-qb {:local/root "misc"}}} - :validate {:extra-deps { swirrl/rdf-validator {:git/url "https://github.com/Swirrl/rdf-validator.git" - :sha "c85338c44be9f7f9726c30dca4aa47ef8bd9cfe6" - } - ;; Import log4j2 as the logging backend - org.apache.logging.log4j/log4j-api {:mvn/version "2.11.1"} - org.apache.logging.log4j/log4j-core {:mvn/version "2.11.1"} - org.apache.logging.log4j/log4j-slf4j-impl {:mvn/version "2.11.1"} +{ :aliases {:pmd4 {:extra-deps {swirrl/validations.pmd4 {:local/root "pmd4"}}} + :pmd-qb {:extra-deps {swirrl/validations.pmd-qb {:local/root "pmd-qb"}}} + :misc {:extra-deps {swirrl/validations.pmd-qb {:local/root "misc"}}} + :dev {:extra-deps { swirrl/rdf-validator {:git/url "https://github.com/Swirrl/rdf-validator.git" + :sha "c85338c44be9f7f9726c30dca4aa47ef8bd9cfe6"} + ;; Import log4j2 as the logging backend + org.apache.logging.log4j/log4j-api {:mvn/version "2.11.1"} + org.apache.logging.log4j/log4j-core {:mvn/version "2.11.1"} + org.apache.logging.log4j/log4j-slf4j-impl {:mvn/version "2.11.1"}} + :extra-paths ["." "test"]} + :test {:extra-deps {swirrl/rdf-validator {:git/url "https://github.com/Swirrl/rdf-validator.git" + :sha "c85338c44be9f7f9726c30dca4aa47ef8bd9cfe6"} + lambdaisland/kaocha {:mvn/version "1.0.887"} + ;; Import log4j2 as the logging backend + org.apache.logging.log4j/log4j-api {:mvn/version "2.11.1"} + org.apache.logging.log4j/log4j-core {:mvn/version "2.11.1"} + org.apache.logging.log4j/log4j-slf4j-impl {:mvn/version "2.11.1"}} + :main-opts ["-m" "kaocha.runner"] + :extra-paths ["." "test"]} - } - :extra-paths ["."] ;; for log4j2.xml - :main-opts ["-m" "rdf-validator.core"]}}} + :validate {:extra-deps {swirrl/rdf-validator {:git/url "https://github.com/Swirrl/rdf-validator.git" + :sha "c85338c44be9f7f9726c30dca4aa47ef8bd9cfe6"} + ;; Import log4j2 as the logging backend + org.apache.logging.log4j/log4j-api {:mvn/version "2.11.1"} + org.apache.logging.log4j/log4j-core {:mvn/version "2.11.1"} + org.apache.logging.log4j/log4j-slf4j-impl {:mvn/version "2.11.1"}} + :extra-paths ["."] ;; for log4j2.xml + :main-opts ["-m" "rdf-validator.core"]}}} diff --git a/pmd-qb/src/swirrl/validations/pmd-qb/16_SELECT_Dataset_With_MeasureDimension_Obs_Has_Exactly_1_Value.sparql b/pmd-qb/src/swirrl/validations/pmd-qb/16_SELECT_Dataset_With_MeasureDimension_Obs_Has_Exactly_1_Value.sparql index 1cfb812..8997253 100644 --- a/pmd-qb/src/swirrl/validations/pmd-qb/16_SELECT_Dataset_With_MeasureDimension_Obs_Has_Exactly_1_Value.sparql +++ b/pmd-qb/src/swirrl/validations/pmd-qb/16_SELECT_Dataset_With_MeasureDimension_Obs_Has_Exactly_1_Value.sparql @@ -26,7 +26,7 @@ WHERE { UNION { # Observations with more than one value of the same measure type - SELECT ?obs (COUNT(?val) AS ?count ) { + SELECT ?obs (COUNT(distinct ?val) AS ?count ) { ?obs qb:dataSet/qb:structure ?dsd ; qb:measureType ?measure . ?obs ?measure ?val . diff --git a/pmd-qb/src/swirrl/validations/pmd-qb/17_SELECT_All_Measures_Present_In_Measures_Dimension_Cube.sparql b/pmd-qb/src/swirrl/validations/pmd-qb/17_SELECT_All_Measures_Present_In_Measures_Dimension_Cube.sparql index a39bb10..c302638 100644 --- a/pmd-qb/src/swirrl/validations/pmd-qb/17_SELECT_All_Measures_Present_In_Measures_Dimension_Cube.sparql +++ b/pmd-qb/src/swirrl/validations/pmd-qb/17_SELECT_All_Measures_Present_In_Measures_Dimension_Cube.sparql @@ -12,11 +12,11 @@ PREFIX owl: # with the same non-measure dimension values for each of the declared measures. # Count number of other measures found at each point -SELECT ?obs1 ?numMeasures (COUNT(?obs2) AS ?count) +SELECT ?obs1 ?numMeasures (COUNT(DISTINCT ?obs2) AS ?count) WHERE { { # Find the DSDs and check how many measures they have - SELECT ?dsd (COUNT(?m) AS ?numMeasures) WHERE { + SELECT ?dsd (COUNT(DISTINCT ?m) AS ?numMeasures) WHERE { ?dsd qb:component/qb:measure ?m. } GROUP BY ?dsd } diff --git a/pmd-qb/src/swirrl/validations/pmd-qb/19_SELECT_Collection_Values_Must_Be_From_CodeList.sparql b/pmd-qb/src/swirrl/validations/pmd-qb/19_SELECT_Collection_Values_Must_Be_From_CodeList.sparql index 0e672e4..70fe443 100644 --- a/pmd-qb/src/swirrl/validations/pmd-qb/19_SELECT_Collection_Values_Must_Be_From_CodeList.sparql +++ b/pmd-qb/src/swirrl/validations/pmd-qb/19_SELECT_Collection_Values_Must_Be_From_CodeList.sparql @@ -7,7 +7,7 @@ PREFIX owl: SELECT ?obs ?dim (?v AS ?valueNotInCodeList) WHERE { - ?obs qb:dataSet/qb:structure/qb:component/qb:componentProperty ?dim . + ?obs qb:dataSet/qb:structure/qb:component/qb:dimension ?dim . ?dim a qb:DimensionProperty ; qb:codeList ?list . ?list a skos:Collection . @@ -22,4 +22,4 @@ WHERE { #### ORIGINAL ASK QUERY FROM SPEC IC-19 #### # # -####################################################################### \ No newline at end of file +####################################################################### diff --git a/pmd-qb/src/swirrl/validations/pmd-qb/19_SELECT_ConceptScheme_Values_Must_Be_From_CodeList.sparql b/pmd-qb/src/swirrl/validations/pmd-qb/19_SELECT_ConceptScheme_Values_Must_Be_From_CodeList.sparql index c965475..7e5ecde 100644 --- a/pmd-qb/src/swirrl/validations/pmd-qb/19_SELECT_ConceptScheme_Values_Must_Be_From_CodeList.sparql +++ b/pmd-qb/src/swirrl/validations/pmd-qb/19_SELECT_ConceptScheme_Values_Must_Be_From_CodeList.sparql @@ -7,7 +7,7 @@ PREFIX owl: SELECT ?obs ?dim (?v AS ?valueNotInCodeList) WHERE { - ?obs qb:dataSet/qb:structure/qb:component/qb:componentProperty ?dim . + ?obs qb:dataSet/qb:structure/qb:component/qb:dimension ?dim . ?dim a qb:DimensionProperty ; qb:codeList ?list . ?list a skos:ConceptScheme . @@ -22,4 +22,4 @@ WHERE { #### ORIGINAL ASK QUERY FROM SPEC IC-19 #### # # -####################################################################### \ No newline at end of file +####################################################################### diff --git a/pmd4/src/rdf-validator-suite.edn b/pmd4/src/rdf-validator-suite.edn index 9fa3f5a..be4ee4b 100644 --- a/pmd4/src/rdf-validator-suite.edn +++ b/pmd4/src/rdf-validator-suite.edn @@ -21,10 +21,6 @@ :source "swirrl/validations/pmd4/SELECT_ConceptSchemeExactlyOneLabel.sparql" :type :sparql :name "ConceptSchemeExactlyOneLabel"} - { - :source "swirrl/validations/pmd4/SELECT_ConceptSchemeMustHaveCatalogEntry.sparql" - :type :sparql - :name "ConceptSchemeMustHaveCatalogEntry"} { :source "swirrl/validations/pmd4/SELECT_ConceptSchemesMaxZeroConceptsAsMembers.sparql" :type :sparql @@ -41,26 +37,18 @@ :source "swirrl/validations/pmd4/SELECT_DatasetContentsIsCorrectType.sparql" :type :sparql :name "DatasetContentsIsCorrectType"} - { - :source "swirrl/validations/pmd4/SELECT_DatasetExactlyOneContents.sparql" - :type :sparql - :name "DatasetExactlyOneContents"} - { - :source "swirrl/validations/pmd4/SELECT_DatasetExactlyOneGraph.sparql" - :type :sparql - :name "DatasetExactlyOneGraph"} { :source "swirrl/validations/pmd4/SELECT_DatasetExactlyOneIssuedDate.sparql" :type :sparql :name "DatasetExactlyOneIssuedDate"} - { - :source "swirrl/validations/pmd4/SELECT_DatasetExactlyOneLabel.sparql" - :type :sparql - :name "DatasetExactlyOneLabel"} { :source "swirrl/validations/pmd4/SELECT_DatasetExactlyOneModifiedDate.sparql" :type :sparql :name "DatasetExactlyOneModifiedDate"} + { + :source "swirrl/validations/pmd4/SELECT_DatasetExactlyOneTitle.sparql" + :type :sparql + :name "DatasetExactlyOneTitle"} { :source "swirrl/validations/pmd4/SELECT_DatasetGraphIsIri.sparql" :type :sparql @@ -70,9 +58,9 @@ :type :sparql :name "DatasetMaxOneContactPoint"} { - :source "swirrl/validations/pmd4/SELECT_DatasetMaxOneContributor.sparql" + :source "swirrl/validations/pmd4/SELECT_DatasetMaxOneContents.sparql" :type :sparql - :name "DatasetMaxOneContributor"} + :name "DatasetMaxOneContents"} { :source "swirrl/validations/pmd4/SELECT_DatasetMaxOneCreator.sparql" :type :sparql @@ -89,6 +77,10 @@ :source "swirrl/validations/pmd4/SELECT_DatasetMaxOnePublisher.sparql" :type :sparql :name "DatasetMaxOnePublisher"} + { + :source "swirrl/validations/pmd4/SELECT_DatasetMinOneGraph.sparql" + :type :sparql + :name "DatasetMinOneGraph"} { :source "swirrl/validations/pmd4/SELECT_DimensionsExactlyOneLabel.sparql" :type :sparql @@ -105,10 +97,6 @@ :source "swirrl/validations/pmd4/SELECT_RecordExactlyOneIssuedDate.sparql" :type :sparql :name "RecordExactlyOneIssuedDate"} - { - :source "swirrl/validations/pmd4/SELECT_RecordExactlyOneLabel.sparql" - :type :sparql - :name "RecordExactlyOneLabel"} { :source "swirrl/validations/pmd4/SELECT_RecordExactlyOneMetadataGraph.sparql" :type :sparql diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptExactlyOneLabel.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptExactlyOneLabel.sparql index 038c023..6eb5565 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptExactlyOneLabel.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptExactlyOneLabel.sparql @@ -5,11 +5,11 @@ PREFIX rdfs: SELECT ?concept ?count { { - SELECT ?concept (COUNT(?lbl) AS ?count) + SELECT ?concept (COUNT(DISTINCT ?lbl) AS ?count) WHERE { - { + { ?concept a skos:Concept . - ?concept rdfs:label ?lbl + ?concept rdfs:label ?lbl } } GROUP BY ?concept diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptMaxOneComment.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptMaxOneComment.sparql index 9cad44b..6fb0f4d 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptMaxOneComment.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptMaxOneComment.sparql @@ -4,12 +4,12 @@ PREFIX ui: PREFIX rdfs: -SELECT ?concept (COUNT(?comment) AS ?count) +SELECT ?concept (COUNT(DISTINCT ?comment) AS ?count) WHERE { - { + { ?concept a skos:Concept . ?concept rdfs:comment ?comment } } GROUP BY ?concept - HAVING (?count > 1) \ No newline at end of file + HAVING (?count > 1) diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptMaxOneNotation.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptMaxOneNotation.sparql index 123dd3e..91cc78c 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptMaxOneNotation.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptMaxOneNotation.sparql @@ -2,13 +2,13 @@ PREFIX qb: PREFIX skos: PREFIX ui: -SELECT ?concept (COUNT(?n) AS ?count) +SELECT ?concept (COUNT(DISTINCT ?n) AS ?count) WHERE { - { + { ?concept a skos:Concept . ?concept skos:notation ?n . } } GROUP BY ?concept HAVING (?count > 1) - LIMIT 10 \ No newline at end of file + LIMIT 10 diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptSchemeExactlyOneLabel.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptSchemeExactlyOneLabel.sparql index b7cd700..2110cfd 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptSchemeExactlyOneLabel.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptSchemeExactlyOneLabel.sparql @@ -5,15 +5,15 @@ PREFIX rdfs: SELECT ?scheme ?count ?lbl { { - SELECT ?scheme ?lbl (COUNT(?lbl) AS ?count) + SELECT ?scheme ?lbl (COUNT(DISTINCT ?lbl) AS ?count) WHERE { - { + { ?scheme a skos:ConceptScheme . ?scheme rdfs:label ?lbl, ?lbl2 FILTER(?lbl != ?lbl2) } } - GROUP BY ?scheme ?lbl + GROUP BY ?scheme ?lbl HAVING (?count > 1) } UNION { diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptSchemeMustHaveCatalogEntry.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptSchemeMustHaveCatalogEntry.sparql deleted file mode 100644 index 86b0e0a..0000000 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptSchemeMustHaveCatalogEntry.sparql +++ /dev/null @@ -1,11 +0,0 @@ -PREFIX qb: -PREFIX skos: -PREFIX ui: - -SELECT ?scheme { - ?scheme a skos:ConceptScheme . - FILTER NOT EXISTS { - ?entry ?scheme . - } - -} \ No newline at end of file diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptsMaxOfOneSortPriority.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptsMaxOfOneSortPriority.sparql index efac2c5..6f9b6d9 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptsMaxOfOneSortPriority.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_ConceptsMaxOfOneSortPriority.sparql @@ -2,9 +2,9 @@ PREFIX qb: PREFIX skos: PREFIX ui: -SELECT ?concept (COUNT(?sp) AS ?count) ?scheme +SELECT ?concept (COUNT(DISTINCT ?sp) AS ?count) ?scheme WHERE { - { + { ?concept a skos:Concept ; ui:sortPriority ?sp . ?concept skos:inScheme ?scheme . @@ -13,4 +13,4 @@ WHERE { GROUP BY ?concept ?scheme HAVING (?count > 1) ORDER BY ?scheme ?concept -LIMIT 10 \ No newline at end of file +LIMIT 10 diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetContentsIsCorrectType.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetContentsIsCorrectType.sparql index 77bae5e..e869212 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetContentsIsCorrectType.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetContentsIsCorrectType.sparql @@ -3,29 +3,30 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: PREFIX pmdcat: SELECT ?dataset { - ?dataset a pmdcat:Dataset . + ?dataset a pmdcat:Dataset ; + pmdcat:datasetContents ?contents . FILTER( NOT EXISTS { SELECT ?dataset { - ?dataset a pmdcat:Dataset . - ?dataset pmdcat:datasetContents ?contents . + ?dataset a pmdcat:Dataset ; + pmdcat:datasetContents ?contents . ?contents a ?type . FILTER(?type IN ( - pmdcat:Dataset, - pmdcat:FileDataset, - pmdcat:URLDataset, - pmdcat:LinkedDataset, - pmdcat:DataCube, - pmdcat:GraphDatasetContents, - pmdcat:Ontology, + pmdcat:Dataset, + pmdcat:FileDataset, + pmdcat:URLDataset, + pmdcat:LinkedDataset, + pmdcat:DataCube, + pmdcat:GraphDatasetContents, + pmdcat:Ontology, pmdcat:ConceptScheme )) } } ) -} \ No newline at end of file +} diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneGraph.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneGraph.sparql deleted file mode 100644 index 510ced8..0000000 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneGraph.sparql +++ /dev/null @@ -1,28 +0,0 @@ -PREFIX qb: -PREFIX skos: -PREFIX ui: -PREFIX dcat: -PREFIX foaf: -PREFIX dct: -PREFIX pmdcat: - -SELECT ?dataset ?count { - { - SELECT ?dataset (COUNT(?o) AS ?count) - WHERE { - ?dataset a pmdcat:Dataset . - ?dataset pmdcat:graph ?o - } - GROUP BY ?dataset - HAVING (?count > 1) - } - UNION { - SELECT ?dataset ?count { - ?dataset a pmdcat:Dataset . - FILTER NOT EXISTS { - ?dataset pmdcat:graph ?o - } - BIND(0 AS ?count) - } - } -} diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneLabel.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneTitle.sparql similarity index 74% rename from pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneLabel.sparql rename to pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneTitle.sparql index 7d4acab..5598f20 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneLabel.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneTitle.sparql @@ -3,17 +3,17 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: PREFIX pmdcat: PREFIX rdfs: SELECT ?dataset ?count { { - SELECT ?dataset (COUNT(?lbl1) AS ?count) + SELECT ?dataset (COUNT(DISTINCT ?title1) AS ?count) WHERE { ?dataset a pmdcat:Dataset . - ?dataset rdfs:label ?lbl1, ?lbl2 . - FILTER(?lbl1 != ?lbl2) + ?dataset dct:title ?title1, ?title2 . + FILTER(?title1 != ?title2) } GROUP BY ?dataset HAVING (?count > 1) @@ -22,7 +22,7 @@ SELECT ?dataset ?count { SELECT ?dataset ?count { ?dataset a pmdcat:Dataset . FILTER NOT EXISTS { - ?dataset rdfs:label ?o + ?dataset dct:title ?o } BIND(0 AS ?count) } diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContactPoint.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContactPoint.sparql index 1dfd2d5..bbcac31 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContactPoint.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContactPoint.sparql @@ -3,13 +3,13 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: PREFIX pmdcat: -SELECT ?dataset (COUNT(?o) AS ?count) +SELECT ?dataset (COUNT(DISTINCT ?o) AS ?count) WHERE { ?dataset a pmdcat:Dataset . ?dataset dcat:contactPoint ?o } GROUP BY ?dataset -HAVING (?count > 1) \ No newline at end of file +HAVING (?count > 1) diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneContents.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContents.sparql similarity index 60% rename from pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneContents.sparql rename to pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContents.sparql index c181ada..15a02b9 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneContents.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContents.sparql @@ -3,12 +3,12 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: PREFIX pmdcat: SELECT ?dataset ?count { { - SELECT ?dataset (COUNT(?o) AS ?count) + SELECT ?dataset (COUNT(DISTINCT ?o) AS ?count) WHERE { ?dataset a pmdcat:Dataset . ?dataset pmdcat:datasetContents ?o @@ -16,13 +16,4 @@ SELECT ?dataset ?count { GROUP BY ?dataset HAVING (?count > 1) } - UNION { - SELECT ?dataset ?count { - ?dataset a pmdcat:Dataset . - FILTER NOT EXISTS { - ?dataset pmdcat:datasetContents ?o - } - BIND(0 AS ?count) - } - } } diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneCreator.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneCreator.sparql index f048f06..16a4d57 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneCreator.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneCreator.sparql @@ -3,13 +3,13 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: PREFIX pmdcat: -SELECT ?dataset (COUNT(?o) AS ?count) +SELECT ?dataset (COUNT(DISTINCT ?o) AS ?count) WHERE { ?dataset a pmdcat:Dataset . ?dataset dct:creator ?o } GROUP BY ?dataset -HAVING (?count > 1) \ No newline at end of file +HAVING (?count > 1) diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneLicense.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneLicense.sparql index 1525236..56edfd2 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneLicense.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneLicense.sparql @@ -3,13 +3,13 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: PREFIX pmdcat: -SELECT ?dataset (COUNT(?o) AS ?count) +SELECT ?dataset (COUNT(DISTINCT ?o) AS ?count) WHERE { ?dataset a pmdcat:Dataset . ?dataset dct:license ?o } GROUP BY ?dataset -HAVING (?count > 1) \ No newline at end of file +HAVING (?count > 1) diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneMarkdownDesc.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneMarkdownDesc.sparql index 7ee6422..0f638b7 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneMarkdownDesc.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneMarkdownDesc.sparql @@ -3,13 +3,13 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: PREFIX pmdcat: -SELECT ?dataset (COUNT(?o) AS ?count) +SELECT ?dataset (COUNT(DISTINCT ?o) AS ?count) WHERE { ?dataset a pmdcat:Dataset . ?dataset pmdcat:markdownDescription ?o } GROUP BY ?dataset -HAVING (?count > 1) \ No newline at end of file +HAVING (?count > 1) diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOnePublisher.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOnePublisher.sparql index 2f56c46..6c75555 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOnePublisher.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOnePublisher.sparql @@ -3,13 +3,13 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: PREFIX pmdcat: -SELECT ?dataset (COUNT(?o) AS ?count) +SELECT ?dataset (COUNT(DISTINCT ?o) AS ?count) WHERE { ?dataset a pmdcat:Dataset . ?dataset dct:publisher ?o } GROUP BY ?dataset -HAVING (?count > 1) \ No newline at end of file +HAVING (?count > 1) diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContributor.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMinOneGraph.sparql similarity index 76% rename from pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContributor.sparql rename to pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMinOneGraph.sparql index b02abdf..9c845a8 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContributor.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMinOneGraph.sparql @@ -6,10 +6,10 @@ PREFIX foaf: PREFIX dct: PREFIX pmdcat: -SELECT ?dataset (COUNT(?o) AS ?count) -WHERE { +SELECT ?dataset { ?dataset a pmdcat:Dataset . - ?dataset dct:contributor ?o + FILTER NOT EXISTS { + ?dataset pmdcat:graph ?o + } } -GROUP BY ?dataset -HAVING (?count > 1) \ No newline at end of file + diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_DimensionsExactlyOneLabel.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_DimensionsExactlyOneLabel.sparql index 1511e97..e41c098 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_DimensionsExactlyOneLabel.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_DimensionsExactlyOneLabel.sparql @@ -3,13 +3,13 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: PREFIX pmdcat: PREFIX rdfs: SELECT ?dim ?count { { - SELECT ?dim (COUNT(?lbl1) AS ?count) + SELECT ?dim (COUNT(DISTINCT ?lbl1) AS ?count) WHERE { ?dim a qb:DimensionProperty . ?dim rdfs:label ?lbl1, ?lbl2 . @@ -22,7 +22,7 @@ SELECT ?dim ?count { SELECT ?dim ?count { ?dim a qb:DimensionProperty . FILTER NOT EXISTS { - ?dim rdfs:label ?o + ?dim rdfs:label ?o } BIND(0 AS ?count) } diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneIssuedDate.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneIssuedDate.sparql index c2519f2..f5c2037 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneIssuedDate.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneIssuedDate.sparql @@ -3,14 +3,14 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: SELECT ?record ?count { { - SELECT ?record (COUNT(?o) AS ?count) + SELECT ?record (COUNT(DISTINCT ?o) AS ?count) WHERE { ?record a dcat:CatalogRecord . - ?record dct:issued ?o + ?record dct:issued ?o } GROUP BY ?record HAVING (?count > 1) @@ -19,7 +19,7 @@ SELECT ?record ?count { SELECT ?record ?count { ?record a dcat:CatalogRecord . FILTER NOT EXISTS { - ?record dct:issued ?o + ?record dct:issued ?o } BIND(0 AS ?count) } diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneLabel.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneLabel.sparql deleted file mode 100644 index 275ef0a..0000000 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneLabel.sparql +++ /dev/null @@ -1,29 +0,0 @@ -PREFIX qb: -PREFIX skos: -PREFIX ui: -PREFIX dcat: -PREFIX foaf: -PREFIX dct: -PREFIX rdfs: - -SELECT ?record ?count { - { - SELECT ?record (COUNT(?lbl1) AS ?count) - WHERE { - ?record a dcat:CatalogRecord . - ?record rdfs:label ?lbl1, ?lbl2 - FILTER(?lbl1 != ?lbl2) - } - GROUP BY ?record - HAVING (?count > 1) - } - UNION { - SELECT ?record ?count { - ?record a dcat:CatalogRecord . - FILTER NOT EXISTS { - ?record rdfs:label ?o - } - BIND(0 AS ?count) - } - } -} diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneModifiedDate.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneModifiedDate.sparql index 7a8fc61..6d03c6e 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneModifiedDate.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOneModifiedDate.sparql @@ -3,14 +3,14 @@ PREFIX skos: PREFIX ui: PREFIX dcat: PREFIX foaf: -PREFIX dct: +PREFIX dct: SELECT ?record ?count { { - SELECT ?record (COUNT(?o) AS ?count) + SELECT ?record (COUNT(DISTINCT ?o) AS ?count) WHERE { ?record a dcat:CatalogRecord . - ?record dct:modified ?o + ?record dct:modified ?o } GROUP BY ?record HAVING (?count > 1) @@ -19,7 +19,7 @@ SELECT ?record ?count { SELECT ?record ?count { ?record a dcat:CatalogRecord . FILTER NOT EXISTS { - ?record dct:modified ?o + ?record dct:modified ?o } BIND(0 AS ?count) } diff --git a/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOnePrimaryTopic.sparql b/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOnePrimaryTopic.sparql index 2a5e1f4..3006349 100644 --- a/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOnePrimaryTopic.sparql +++ b/pmd4/src/swirrl/validations/pmd4/SELECT_RecordExactlyOnePrimaryTopic.sparql @@ -6,7 +6,7 @@ PREFIX foaf: SELECT ?record ?count { { - SELECT ?record (COUNT(?pt) AS ?count) + SELECT ?record (COUNT(DISTINCT ?pt) AS ?count) WHERE { ?record a dcat:CatalogRecord . ?record foaf:primaryTopic ?pt . diff --git a/test/pmd4/swirrl/validations/pmd4/SELECT_DatasetExactlyOneTitle.ttl b/test/pmd4/swirrl/validations/pmd4/SELECT_DatasetExactlyOneTitle.ttl new file mode 100644 index 0000000..dbfdf2c --- /dev/null +++ b/test/pmd4/swirrl/validations/pmd4/SELECT_DatasetExactlyOneTitle.ttl @@ -0,0 +1,12 @@ +@prefix pmdcat: . +@prefix dct: . + + a pmdcat:Dataset . + + a pmdcat:Dataset ; + dct:title "I have but one title!" . + + a pmdcat:Dataset ; + dct:title "I have two titles!" ; + dct:title "They are different!" . + diff --git a/test/pmd4/swirrl/validations/pmd4/SELECT_DatasetMaxOneContents.ttl b/test/pmd4/swirrl/validations/pmd4/SELECT_DatasetMaxOneContents.ttl new file mode 100644 index 0000000..10df442 --- /dev/null +++ b/test/pmd4/swirrl/validations/pmd4/SELECT_DatasetMaxOneContents.ttl @@ -0,0 +1,14 @@ +@prefix pmdcat: . + + a pmdcat:DatasetContents . + a pmdcat:DatasetContents . + + a pmdcat:Dataset . + + a pmdcat:Dataset ; + pmdcat:datasetContents . + + a pmdcat:Dataset ; + pmdcat:datasetContents ; + pmdcat:datasetContents . + diff --git a/test/pmd4/swirrl/validations/pmd4/SELECT_DatasetMinOneGraph.ttl b/test/pmd4/swirrl/validations/pmd4/SELECT_DatasetMinOneGraph.ttl new file mode 100644 index 0000000..11864f7 --- /dev/null +++ b/test/pmd4/swirrl/validations/pmd4/SELECT_DatasetMinOneGraph.ttl @@ -0,0 +1,11 @@ +@prefix pmdcat: . + + a pmdcat:Dataset . + + a pmdcat:Dataset ; + pmdcat:graph . + + a pmdcat:Dataset ; + pmdcat:graph ; + pmdcat:graph . + diff --git a/test/pmd4/swirrl/validations/pmd4/removed.ttl b/test/pmd4/swirrl/validations/pmd4/removed.ttl new file mode 100644 index 0000000..0d4740a --- /dev/null +++ b/test/pmd4/swirrl/validations/pmd4/removed.ttl @@ -0,0 +1,64 @@ +@prefix pmdcat: . +@prefix qb: . +@prefix skos: . +@prefix ui: . +@prefix rdfs: . +@prefix dct: . +@prefix foaf: . + +# When removing validations, put stuff in here that would not have passed the suite before removal. + +# DatasetExactlyOneLabel + + a pmdcat:Dataset ; + dct:title "DatasetExactlyOneLabel 0" ; + dct:issued "yesterday" ; + dct:modified "yesterday" ; + pmdcat:graph ; + pmdcat:datasetContents . + + a pmdcat:Dataset ; + rdfs:label "I have two different labels" ; + rdfs:label "I have two labels that are not the same" ; + dct:title "DatasetExactlyOneLabel 2" ; + dct:issued "yesterday" ; + dct:modified "yesterday" ; + pmdcat:graph ; + pmdcat:datasetContents . + + +# DatasetMaxOneContributor + + a pmdcat:Dataset ; + dct:contributor ; + dct:contributor ; + dct:title "DatasetMaxOneContributor 0" ; + dct:issued "yesterday" ; + dct:modified "yesterday" ; + pmdcat:graph ; + pmdcat:datasetContents . + + +# RecordExactlyOneLabel + + a dcat:CatalogRecord ; + pmdcat:metadataGraph ; + dcat:record ; + foaf:primaryTopic ; + dct:modified "yesterday" ; + dct:issued "yesterday" . + + a dcat:CatalogRecord ; + rdfs:label "My labels, they are numbered twice" ; + rdfs:label "Two is the number of labels for me" ; + pmdcat:metadataGraph ; + dcat:record ; + foaf:primaryTopic ; + dct:modified "yesterday" ; + dct:issued "yesterday" . + +# ConceptSchemeMustHaveCatalogEntry + + a skos:ConceptScheme ; + rdfs:label "No catalog entries for me" . + diff --git a/test/pmd_validations/pmd4_test.clj b/test/pmd_validations/pmd4_test.clj new file mode 100644 index 0000000..7720187 --- /dev/null +++ b/test/pmd_validations/pmd4_test.clj @@ -0,0 +1,35 @@ +(ns pmd-validations.pmd4-test + (:require [clojure.test :refer [deftest is]] + [pmd-validations.test-validation + :refer [test-validation run-validation-suite]] + [rdf-validator.endpoint :as ep] + [rdf-validator.core :as rv]) + (:import [java.net URI])) + +(deftest dataset-max-one-contents + (test-validation + "pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMaxOneContents.sparql" + "test/pmd4/swirrl/validations/pmd4/SELECT_DatasetMaxOneContents.ttl" + #{{:count 2N :dataset (URI. "http://test/dataset/2#fail")}})) + +(deftest dataset-exactly-one-title + (test-validation + "pmd4/src/swirrl/validations/pmd4/SELECT_DatasetExactlyOneTitle.sparql" + "test/pmd4/swirrl/validations/pmd4/SELECT_DatasetExactlyOneTitle.ttl" + #{{:count 0N :dataset (URI. "http://test/dataset/0#fail")} + {:count 2N :dataset (URI. "http://test/dataset/2#fail")}})) + +(deftest dataset-min-one-graph + (test-validation + "pmd4/src/swirrl/validations/pmd4/SELECT_DatasetMinOneGraph.sparql" + "test/pmd4/swirrl/validations/pmd4/SELECT_DatasetMinOneGraph.ttl" + #{{:dataset (URI. "http://test/dataset/0#fail")}})) + +; Run the whole suite against removed validations. +(deftest removed-validations + (let [[summary results] + (run-validation-suite "pmd4/src/rdf-validator-suite.edn" + "test/pmd4/swirrl/validations/pmd4/removed.ttl")] + (is (= [] (vec (filter #(not= :passed (:result %)) results)))) + (is (= {:passed 33 :failed 0 :errored 0 :ignored 0} summary)))) + diff --git a/test/pmd_validations/test_validation.clj b/test/pmd_validations/test_validation.clj new file mode 100644 index 0000000..c8b3a6b --- /dev/null +++ b/test/pmd_validations/test_validation.clj @@ -0,0 +1,38 @@ +(ns pmd-validations.test-validation + (:require [clojure.test :refer [is]] + [clojure.java.io :as io] + [rdf-validator.endpoint :as ep] + [rdf-validator.test-cases :as tc] + [rdf-validator.core :as rv])) + +(defn run-validation + "Run the sparql query in query-file against the data in ttl-data-file." + [query-file ttl-data-file] + (let [test-case {:source query-file} + repository (ep/parse-repository ttl-data-file) + endpoint (ep/create-endpoint repository [])] + (rv/run-test-case test-case {} endpoint))) + +(defn test-validation + "Check the (unordered) errors from run-validation are the same as expected." + [query-file ttl-data-file expected] + (let [result (run-validation query-file ttl-data-file)] + (is (= expected (set (:errors result)))))) + +(defn run-validation-suite + "Run the validation in suite-source-file (e.g. rdf-validator-suite.edn) + against the data in ttl-data-file. + Returns [summary test-results]." + [suite-source-file ttl-data-file] + (let [suite-source (io/file suite-source-file) + repository (ep/parse-repository ttl-data-file) + endpoint (ep/create-endpoint repository []) + suites (tc/resolve-test-suites [suite-source]) + test-cases (tc/suite-tests suites []) + test-results (rv/run-test-cases test-cases {} endpoint) + summary (reduce (fn [summary {:keys [result]}] + (update summary result inc)) + {:failed 0 :passed 0 :errored 0 :ignored 0} + test-results)] + [summary test-results])) + diff --git a/tests.edn b/tests.edn new file mode 100644 index 0000000..a989eda --- /dev/null +++ b/tests.edn @@ -0,0 +1,2 @@ +#kaocha/v1 +{:tests [{:id :unit :kaocha/source-paths []}]}