diff --git a/services/src/main/java/org/fao/geonet/api/records/ShaclValidationApi.java b/services/src/main/java/org/fao/geonet/api/records/ShaclValidationApi.java new file mode 100644 index 000000000000..aa975a592b37 --- /dev/null +++ b/services/src/main/java/org/fao/geonet/api/records/ShaclValidationApi.java @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.api.records; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import jeeves.server.context.ServiceContext; +import jeeves.services.ReadWriteController; +import org.fao.geonet.api.ApiParams; +import static org.fao.geonet.api.ApiParams.API_CLASS_RECORD_OPS; +import static org.fao.geonet.api.ApiParams.API_CLASS_RECORD_TAG; +import static org.fao.geonet.api.ApiParams.API_PARAM_RECORD_UUID; +import org.fao.geonet.api.ApiUtils; +import org.fao.geonet.api.tools.i18n.LanguageUtils; +import org.fao.geonet.domain.AbstractMetadata; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +@RequestMapping(value = {"/{portal}/api/records"}) +@Tag(name = API_CLASS_RECORD_TAG, description = API_CLASS_RECORD_OPS) +@Controller("shaclValidationApi") +@PreAuthorize("hasAuthority('Editor')") +@ReadWriteController +public class ShaclValidationApi { + + @Autowired + LanguageUtils languageUtils; + + @Autowired + ShaclValidationService shaclValidationService; + + @io.swagger.v3.oas.annotations.Operation( + summary = "Validate a record using [SHACL](https://www.w3.org/TR/shacl/)", + description = "User MUST be able to edit the record to validate it.\n" + + "\n" + + "Use a testsuite (preferred) OR define one or more SHACL shapes to validate the record.\n" + + "Validation is done using the [JENA library](https://jena.apache.org/documentation/shacl/)." + ) + @RequestMapping( + value = "/{metadataUuid}/validate/shacl", + method = { + RequestMethod.GET, + }, + produces = { + MediaType.APPLICATION_XML_VALUE, + MediaType.APPLICATION_JSON_VALUE, + "application/ld+json", + "text/turtle", + "application/rdf+xml" + } + ) + @ResponseStatus(HttpStatus.OK) + @PreAuthorize("hasAuthority('Editor')") + @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Validation report."), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT)}) + public @ResponseBody + String validateRecordUsingShacl( + @Parameter(description = API_PARAM_RECORD_UUID, required = true) + @PathVariable + String metadataUuid, + @Parameter(description = "Formatter to validate", + examples = { + @ExampleObject( + name = "DCAT", + value = "dcat" + ), + @ExampleObject( + name = "EU DCAT AP", + value = "eu-dcat-ap" + ), + @ExampleObject( + name = "EU DCAT HVD", + value = "eu-dcat-ap-hvd" + ) + }, + required = false) + @RequestParam(required = false, defaultValue = "dcat") + String formatter, + @Parameter(description = "SHACL testsuite to use", + examples = { + @ExampleObject( + name = "EU DCAT AP 3.0.1 - Base Zero (no background knowledge)", + value = "EU DCAT AP 3.0.1 - Base Zero (no background knowledge)" + ), + @ExampleObject( + name = "EU DCAT AP 3.0.1 - Ranges Zero (no background knowledge)", + value = "EU DCAT AP 3.0.1 - Ranges Zero (no background knowledge)" + ), + @ExampleObject( + name = "EU DCAT AP 3.0.1 - Full (no background knowledge)", + value = "EU DCAT AP 3.0.1 - Full (no background knowledge)" + ) + }, + required = false) + @RequestParam(required = false) String testsuite, + @Parameter(description = "SHACL shapes to use", required = false) + @RequestParam(required = false) List shapeModel, + @Parameter(description = "Save validation status. When set to true, the validation status will be saved in the database with a validation type set as `shacl-{formatter}-{testsuite_or_shapeshash}`.", + required = false) + @RequestParam(required = false, defaultValue = "false") boolean isSavingValidationStatus, + HttpServletRequest request, + @Parameter(hidden = true) + @RequestHeader(value = HttpHeaders.ACCEPT, defaultValue = MediaType.APPLICATION_XML_VALUE) + String acceptHeader) throws Exception { + AbstractMetadata metadata = ApiUtils.canEditRecord(metadataUuid, request); + + ServiceContext context = ApiUtils.createServiceContext(request); + return shaclValidationService.validate(formatter, metadata, testsuite, shapeModel, context, acceptHeader, isSavingValidationStatus); + } + + + @io.swagger.v3.oas.annotations.Operation( + summary = "Get available SHACL testsuites", + description = "Returns a list of available SHACL testsuites (configured in `config-shacl-validator.xml`). " + + "A testsuite is a set of SHACL shapes. " + + "Rules are common for all schemas and a proper formatter MUST be used to validate metadata (eg. use `eu-dcat-ap` formatter to apply `eu-dcat-ap-300` testsuite). " + ) + @RequestMapping( + value = "/{metadataUuid}/validate/shacl/testsuites", + method = RequestMethod.GET, + produces = { + MediaType.APPLICATION_JSON_VALUE + } + ) + @ResponseStatus(HttpStatus.OK) + @PreAuthorize("hasAuthority('Editor')") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "List of SHACL testsuites."), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT)}) + public @ResponseBody + List getShaclTestsuites() throws Exception { + return shaclValidationService.getShaclValidationTestsuites(); + } + + + @io.swagger.v3.oas.annotations.Operation( + summary = "Get available SHACL shapes", + description = "Returns a list of available SHACL shapes (files with .ttl extension in the shacl directory). " + + "Rules are common for all schemas and a proper formatter MUST be used to validate metadata (eg. use `eu-dcat-ap` formatter to apply `eu-dcat-ap-300` testsuite). " + ) + @RequestMapping( + value = "/{metadataUuid}/validate/shacl/testsuites/shapes", + method = RequestMethod.GET, + produces = { + MediaType.APPLICATION_JSON_VALUE + } + ) + @ResponseStatus(HttpStatus.OK) + @PreAuthorize("hasAuthority('Editor')") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "List of SHACL rules."), + @ApiResponse(responseCode = "403", description = ApiParams.API_RESPONSE_NOT_ALLOWED_CAN_EDIT)}) + public @ResponseBody + List getShaclShapes() throws Exception { + return shaclValidationService.getShaclValidationFiles(); + } +} diff --git a/services/src/main/java/org/fao/geonet/api/records/ShaclValidationService.java b/services/src/main/java/org/fao/geonet/api/records/ShaclValidationService.java new file mode 100644 index 000000000000..ffee90fde083 --- /dev/null +++ b/services/src/main/java/org/fao/geonet/api/records/ShaclValidationService.java @@ -0,0 +1,201 @@ +package org.fao.geonet.api.records; + +import java.io.StringReader; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import javax.annotation.Resource; +import jeeves.server.context.ServiceContext; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.compose.MultiUnion; +import org.apache.jena.rdf.model.Model; +import org.apache.jena.rdf.model.ModelFactory; +import org.apache.jena.reasoner.Reasoner; +import org.apache.jena.reasoner.ReasonerRegistry; +import org.apache.jena.riot.Lang; +import org.apache.jena.riot.RDFDataMgr; +import org.apache.jena.shacl.ShaclValidator; +import org.apache.jena.shacl.Shapes; +import org.apache.jena.shacl.ValidationReport; +import org.apache.jena.shacl.lib.ShLib; +import org.fao.geonet.api.records.formatters.FormatType; +import org.fao.geonet.api.records.formatters.FormatterApi; +import org.fao.geonet.api.records.formatters.FormatterWidth; +import org.fao.geonet.api.records.formatters.cache.Key; +import org.fao.geonet.constants.Geonet; +import org.fao.geonet.domain.AbstractMetadata; +import org.fao.geonet.domain.MetadataValidation; +import org.fao.geonet.domain.MetadataValidationId; +import org.fao.geonet.domain.MetadataValidationStatus; +import org.fao.geonet.kernel.GeonetworkDataDirectory; +import org.fao.geonet.kernel.datamanager.IMetadataIndexer; +import org.fao.geonet.repository.MetadataValidationRepository; +import org.fao.geonet.utils.Log; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; + +@Component +public class ShaclValidationService { + + private static final Map OUTPUT_MAP = Map.of( + MediaType.APPLICATION_JSON_VALUE, Lang.JSONLD, + "application/ld+json", Lang.JSONLD, + MediaType.APPLICATION_XML_VALUE, Lang.RDFXML, + "application/rdf+xml", Lang.RDFXML, + "text/turtle", Lang.TURTLE, + "text/n3", Lang.N3, + "application/n-triples", Lang.NTRIPLES + ); + + @Resource(name = "shaclValidatorTestsuites") + private Map testsuites; + + @Autowired + MetadataValidationRepository metadataValidationRepository; + + @Autowired + private IMetadataIndexer metadataIndexer; + + @Autowired + private GeonetworkDataDirectory dataDirectory; + + public String convertMetadataToRdf(AbstractMetadata metadata, String formatter, ServiceContext context) { + try { + Key key = new Key(metadata.getId(), "eng", FormatType.xml, formatter, true, FormatterWidth._100); + byte[] data = new FormatterApi().new FormatMetadata(context, key, null).call().data; + return new String(data, StandardCharsets.UTF_8); + } catch (Exception e) { + return "Error loading metadata: " + e.getMessage(); + } + } + + public List getShaclValidationFiles() { + Path shaclRulesFolder = dataDirectory.getConfigDir().resolve("shacl"); + try (Stream paths = Files.walk(shaclRulesFolder)) { + return paths.filter(path -> path.toString().endsWith(".ttl")) + .map(path -> shaclRulesFolder.relativize(path).toString()) + .collect(Collectors.toList()); + } catch (Exception e) { + return List.of(); + } + } + + public List getShaclValidationTestsuites() { + return testsuites.keySet().stream() + .collect(Collectors.toList()); + } + + public String validate(String formatter, AbstractMetadata metadata, + String testsuite, List shaclShapes, + ServiceContext context, + String outputFormat, boolean isSavingValidationStatus) { + String rdfToValidate = convertMetadataToRdf(metadata, formatter, context); + + shaclShapes = getShaclShapes(testsuite, shaclShapes); + Shapes shapes = parseShapesFromFiles(shaclShapes); + Reasoner reasoner = configureReasoner(shapes.getImports()); + + Model dataModel = ModelFactory.createDefaultModel(); + try (StringReader reader = new StringReader(rdfToValidate)) { + RDFDataMgr.read(dataModel, reader, null, Lang.RDFXML); + } catch (Exception e) { + return buildStatusResponse("Document is not valid RDF/XML: " + e.getMessage(), false); + } + + long violationCount = 0; + String validationReportKey = buildValidationReportKey(formatter, testsuite, shaclShapes); + + Model infModel = ModelFactory.createInfModel(reasoner, dataModel); + ValidationReport report = ShaclValidator.get().validate(shapes, infModel.getGraph()); + + if (!report.conforms()) { + violationCount = report.getEntries().stream() + .filter(e -> e.severity().level().getURI().equals("http://www.w3.org/ns/shacl#Violation")) + .count(); + + if (isSavingValidationStatus) { + saveValidationStatus(metadata, validationReportKey, violationCount); + } + + ShLib.printReport(report); + StringWriter writer = new StringWriter(); + RDFDataMgr.write(writer, report.getModel(), OUTPUT_MAP.getOrDefault(outputFormat, Lang.RDFXML)); + return writer.toString(); + } + + if (isSavingValidationStatus) { + saveValidationStatus(metadata, validationReportKey, violationCount); + } + + return buildStatusResponse(String.format("Document in format %s is valid according to testsuite %s.", formatter, testsuite), true); + } + + private List getShaclShapes(String testsuite, List shaclShapes) { + List testSuiteShapes = testsuite == null ? List.of() : List.of(testsuites.get(testsuite)); + if (!testSuiteShapes.isEmpty()){ + shaclShapes = testSuiteShapes; + } + return shaclShapes; + } + + private Shapes parseShapesFromFiles(List shaclFiles) { + MultiUnion shapesGraph = new MultiUnion(); + for (String shaclFile : shaclFiles) { + Path shaclPath = dataDirectory.getConfigDir().resolve("shacl").resolve(shaclFile); + if (!Files.exists(shaclPath)) { + throw new IllegalArgumentException("SHACL shape file not found: " + shaclPath); + } + shapesGraph.addGraph(RDFDataMgr.loadGraph(shaclPath.toString())); + } + return Shapes.parse(shapesGraph); + } + + private Reasoner configureReasoner(Collection imports) { + Reasoner reasoner = ReasonerRegistry.getRDFSReasoner(); + Model combinedOntologyModel = ModelFactory.createDefaultModel(); + + for (Node importedShape : imports) { + Model model = ModelFactory.createOntologyModel(); + combinedOntologyModel.add(model.read(importedShape.getURI().toString())); + } + return reasoner.bindSchema(combinedOntologyModel); + } + + private static String buildStatusResponse(String message, boolean isValid) { + return String.format("{\"valid\": %s, \"message\": \"%s\"}", isValid, message); + } + + private static String buildValidationReportKey(String formatter, String testsuite, List shaclShapes) { + return String.format("shacl-%s-%s", + formatter, + StringUtils.isNotEmpty(testsuite) ? testsuite : + // Use a hash of the shapes to create a unique key + // Shorten to 8 first characters + DigestUtils.sha256Hex(shaclShapes.stream().sorted().collect(Collectors.joining())).substring(0, 8) + ); + } + + private void saveValidationStatus(AbstractMetadata metadata, String validationReportKey, long violationCount) { + MetadataValidation validation = new MetadataValidation().setId(new MetadataValidationId(metadata.getId(), validationReportKey)) + .setStatus(violationCount > 0 ? MetadataValidationStatus.INVALID : MetadataValidationStatus.VALID) + .setRequired(true) + .setNumTests(1) + .setNumFailures((int) violationCount); + metadataValidationRepository.save(validation); + + try { + metadataIndexer.indexMetadata(List.of(metadata.getId() + "")); + } catch (Exception e) { + Log.debug(Geonet.DATA_MANAGER, "Exception while indexing metadata after SHACL validation: {}", e.getMessage(), e); + } + } +} diff --git a/web-ui/src/main/resources/catalog/components/validationtools/GnmdInspireValidationDirective.js b/web-ui/src/main/resources/catalog/components/validationtools/GnmdInspireValidationDirective.js index 8c9a7e601b12..162d23769e5f 100644 --- a/web-ui/src/main/resources/catalog/components/validationtools/GnmdInspireValidationDirective.js +++ b/web-ui/src/main/resources/catalog/components/validationtools/GnmdInspireValidationDirective.js @@ -61,6 +61,8 @@ scope.isDownloadedRecord = false; scope.isEnabled = false; scope.testSuites = {}; + scope.shaclTestsuites = {}; + scope.shaclReport = {}; scope.$watch("gnCurrentEdit.uuid", function (newValue, oldValue) { if (newValue == undefined) { @@ -69,6 +71,7 @@ scope.isEnabled = true; scope.inspMdUuid = newValue; scope.md = gnCurrentEdit.metadata; + $http({ method: "GET", url: "../api/records/" + scope.inspMdUuid + "/validate/inspire/testsuites" @@ -76,6 +79,13 @@ scope.testsuites = r.data; }); + $http({ + method: "GET", + url: "../api/records/" + scope.inspMdUuid + "/validate/shacl/testsuites" + }).then(function (r) { + scope.shaclTestsuites = r.data; + }); + gnConfigService.load().then(function (c) { // INSPIRE validator only support ISO19139/115-3 records. // This assume that those schema have and ISO19139 formatter @@ -90,6 +100,81 @@ }); }); + scope.validateShacl = function (formatter, testsuite) { + scope.shaclReport = {}; + var formatterUrl = + "../api/records/" + scope.inspMdUuid + "/formatters/" + formatter; + $http + .get( + "../api/records/" + + scope.inspMdUuid + + "/validate/shacl" + + "?formatter=" + + formatter + + "&testsuite=" + + testsuite, + { + headers: { + Accept: "application/json" + } + } + ) + .then(function (response) { + scope.shaclReport = response.data; + // Count failure with sh:resultSeverity"]["@id"] in shaclReport @graph + scope.shaclFailureCount = scope.shaclReport["@graph"] + ? scope.shaclReport["@graph"].filter(function (g) { + return ( + g["sh:resultSeverity"] && + g["sh:resultSeverity"]["@id"].match("sh:Violation|sh:Warning") + ); + }).length + : 0; + + gnPopup.createModal( + { + class: "disclaimer-popup", + title: + $translate.instant("shaclValidationPopupReportTitle") + + " (" + + testsuite + + ")", + content: + "
" + + "shaclValidationFormat " + + formatter + + "
" + + "
sh:Violation: {{shaclFailureCount}}
" + + "
{{shaclReport.message}}
" + + "
{{shaclReport.message}}
" + + "
" + + "" + + " " + + " " + + ' ' + + " " + + " " + + " " + + " " + + "
shaclSeverityshaclContextshaclMessageshaclNode
{{severity | translate}}{{g['sh:resultPath']['@id']}}{{g['sh:resultMessage']}}{{g['sh:focusNode']['@id']}}" + + "
" + + ' SHACL rule id: {{g["sh:sourceShape"]["@id"]}}' + + "
" + + "
" + }, + scope + ); + }), + function (error) { + console.error("Error during SHACL validation:", error); + }; + }; + scope.validateInspire = function (test, mode) { if (scope.isEnabled) { scope.isDownloadingRecord = true; diff --git a/web-ui/src/main/resources/catalog/components/validationtools/partials/mdValidationTools.html b/web-ui/src/main/resources/catalog/components/validationtools/partials/mdValidationTools.html index cf2791d33d80..283e1b4d66b7 100644 --- a/web-ui/src/main/resources/catalog/components/validationtools/partials/mdValidationTools.html +++ b/web-ui/src/main/resources/catalog/components/validationtools/partials/mdValidationTools.html @@ -86,5 +86,24 @@ reportLink - {{reportStatus}} + +
  • + +
  • + +   + {{t}} + +
  • diff --git a/web-ui/src/main/resources/catalog/locales/en-editor.json b/web-ui/src/main/resources/catalog/locales/en-editor.json index fb2843fc7db9..d1d180f83986 100644 --- a/web-ui/src/main/resources/catalog/locales/en-editor.json +++ b/web-ui/src/main/resources/catalog/locales/en-editor.json @@ -305,6 +305,15 @@ "setCRS": "Set coordinate reference system", "setDynamicGraphicOverview": "Set graphic overview (using GetMap request URL)", "setExtent": "Set extent", + "shaclValidation": "DCAT validation", + "shaclValidationPopupReportTitle": "SHACL validation report", + "shaclValidationFormat": "Format validated: ", + "shaclSeverity": "Severity", + "shaclContext": "Context", + "shaclMessage": "Message", + "shaclNode": "Node", + "sh:Violation": "Error", + "sh:Warning": "Warning", "share": "Share", "share-help": "Define who can view this record", "sharingSettings": "Sharing settings", diff --git a/web/src/main/webResources/WEB-INF/config-spring-geonetwork.xml b/web/src/main/webResources/WEB-INF/config-spring-geonetwork.xml index 1d414a56bd56..ddf8e5f8c5aa 100644 --- a/web/src/main/webResources/WEB-INF/config-spring-geonetwork.xml +++ b/web/src/main/webResources/WEB-INF/config-spring-geonetwork.xml @@ -44,6 +44,7 @@ + diff --git a/web/src/main/webapp/WEB-INF/config-shacl-validator.xml b/web/src/main/webapp/WEB-INF/config-shacl-validator.xml new file mode 100644 index 000000000000..72889f7f080b --- /dev/null +++ b/web/src/main/webapp/WEB-INF/config-shacl-validator.xml @@ -0,0 +1,85 @@ + + + + + + + + + + eu-dcat-ap-3.0.1/shapes.ttl + + + + + + eu-dcat-ap-3.0.1/range.ttl + + + + + + eu-dcat-ap-3.0.1/imports.ttl + eu-dcat-ap-3.0.1/range.ttl + + + + + eu-dcat-ap-3.0.1/shapes_recommended.ttl + + + + + eu-dcat-ap-3.0.1/imports.ttl + eu-dcat-ap-3.0.1/shapes_recommended.ttl + + + + + eu-dcat-ap-3.0.1/shapes.ttl + eu-dcat-ap-3.0.1/shapes_recommended.ttl + eu-dcat-ap-3.0.1/range.ttl + + + + + eu-dcat-ap-3.0.1/imports.ttl + eu-dcat-ap-3.0.1/shapes.ttl + eu-dcat-ap-3.0.1/shapes_recommended.ttl + eu-dcat-ap-3.0.1/range.ttl + + + + + eu-dcat-ap-3.0.1/imports.ttl + eu-dcat-ap-3.0.1/mdr_imports.ttl + eu-dcat-ap-3.0.1/mdr-vocabularies.shape.ttl + + + + diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-base.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-base.ttl new file mode 100644 index 000000000000..463619aa7715 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-base.ttl @@ -0,0 +1,501 @@ +@prefix dc: . +@prefix dcat: . +@prefix foaf: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix shacl: . +@prefix skos: . +@prefix vcard: . +@prefix xsd: . + + rdfs:member , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + ; + shacl:targetClass dcat:CatalogRecord . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#CatalogueRecord.primarytopic"; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:name "primary topic"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path foaf:primaryTopic; + "The expected value for primary topic is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#CatalogueRecord.primarytopic"; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:minCount 1; + shacl:name "primary topic"@en; + shacl:path foaf:primaryTopic; + "Minimally 1 values are expected for primary topic"@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#CatalogueRecord.primarytopic"; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:maxCount 1; + shacl:name "primary topic"@en; + shacl:path foaf:primaryTopic; + "Maximally 1 values allowed for primary topic"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + , + ; + shacl:targetClass dcat:Catalog . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.dataset"; + shacl:description "A Dataset that is part of the Catalogue."@en; + shacl:name "dataset"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:dataset; + "The expected value for dataset is a rdfs:Resource (URI or blank node)"@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.record"; + shacl:description "A Catalogue Record that is part of the Catalogue"@en; + shacl:name "record"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:record; + "The expected value for record is a rdfs:Resource (URI or blank node)"@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.service"; + shacl:description "A site or end-point (Data Service) that is listed in the Catalogue."@en; + shacl:name "service"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:service; + "The expected value for service is a rdfs:Resource (URI or blank node)"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dcat:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass skos:Concept . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:DataService . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Data Service."@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for applicable legislation is a rdfs:Resource (URI or blank node)"@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointURL"; + shacl:description "The root location or primary endpoint of the service (an IRI)."@en; + shacl:name "endpoint URL"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:endpointURL; + "The expected value for endpoint URL is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.HVDcategory"; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:name "HVD category"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for HVD category is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointdescription"; + shacl:description "A description of the services available via the end-points, including their operations, parameters etc."@en; + shacl:name "endpoint description"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:endpointDescription; + "The expected value for endpoint description is a rdfs:Resource (URI or blank node)"@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.contactpoint"; + shacl:description "Contact information that can be used for sending comments about the Data Service."@en; + shacl:minCount 1; + shacl:name "contact point"@en; + shacl:path dcat:contactPoint; + "Minimally 1 values are expected for contact point"@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointURL"; + shacl:description "The root location or primary endpoint of the service (an IRI)."@en; + shacl:minCount 1; + shacl:name "endpoint URL"@en; + shacl:path dcat:endpointURL; + "Minimally 1 values are expected for endpoint URL"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.documentation"; + shacl:description "A page that provides additional information about the Data Service."@en; + shacl:minCount 1; + shacl:name "documentation"@en; + shacl:path foaf:page; + "Minimally 1 values are expected for documentation"@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.documentation"; + shacl:description "A page that provides additional information about the Data Service."@en; + shacl:name "documentation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path foaf:page; + "The expected value for documentation is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.contactpoint"; + shacl:description "Contact information that can be used for sending comments about the Data Service."@en; + shacl:name "contact point"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:contactPoint; + "The expected value for contact point is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.licence"; + shacl:description "A licence under which the Data service is made available."@en; + shacl:maxCount 1; + shacl:name "licence"@en; + shacl:path dc:license; + "Maximally 1 values allowed for licence"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.rights"; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:rights; + "The expected value for rights is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.servesdataset"; + shacl:description "This property refers to a collection of data that this data service can distribute."@en; + shacl:name "serves dataset"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:servesDataset; + "The expected value for serves dataset is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Data Service."@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path ; + "Minimally 1 values are expected for applicable legislation"@en . + + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.licence"; + shacl:description "A licence under which the Data service is made available."@en; + shacl:name "licence"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:license; + "The expected value for licence is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.HVDcategory"; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:minCount 1; + shacl:name "HVD category"@en; + shacl:path ; + "Minimally 1 values are expected for HVD category"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + ; + shacl:targetClass dcat:DatasetSeries . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset Series."@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:minCount 1; + shacl:name "HVD Category"@en; + shacl:path . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset Series."@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:Dataset . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.conformsto"; + shacl:description "An implementing rule or other specification."@en; + shacl:name "conforms to"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:conformsTo; + "The expected value for conforms to is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset."@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for applicable legislation is a rdfs:Resource (URI or blank node)"@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.datasetdistribution"; + shacl:description "An available Distribution for the Dataset."@en; + shacl:minCount 1; + shacl:name "dataset distribution"@en; + shacl:path dcat:distribution; + "Minimally 1 values are expected for dataset distribution"@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.inseries"; + shacl:description "A dataset series of which the dataset is part."@en; + shacl:name "in series"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:inSeries . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for HVD Category is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.contactpoint"; + shacl:description "Contact information that can be used for sending comments about the Dataset."@en; + shacl:name "contact point"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:contactPoint; + "The expected value for contact point is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:minCount 1; + shacl:name "HVD Category"@en; + shacl:path ; + "Minimally 1 values are expected for HVD Category"@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset."@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path ; + "Minimally 1 values are expected for applicable legislation"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.datasetdistribution"; + shacl:description "An available Distribution for the Dataset."@en; + shacl:name "dataset distribution"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:distribution; + "The expected value for dataset distribution is a rdfs:Resource (URI or blank node)"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:Distribution . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Distribution"@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for applicable legislation is a rdfs:Resource (URI or blank node)"@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessservice"; + shacl:description "A data service that gives access to the distribution of the dataset"@en; + shacl:name "access service"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:accessService; + "The expected value for access service is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.linkedschemas"; + shacl:description "An established schema to which the described Distribution conforms."@en; + shacl:name "linked schemas"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:conformsTo; + "The expected value for linked schemas is a rdfs:Resource (URI or blank node)"@en . + + + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.licence"; + shacl:description "A licence under which the Distribution is made available."@en; + shacl:maxCount 1; + shacl:name "licence"@en; + shacl:path dc:license; + "Maximally 1 values allowed for licence"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessURL"; + shacl:description "A URL that gives access to a Distribution of the Dataset."@en; + shacl:name "access URL"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:accessURL; + "The expected value for access URL is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.rights"; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:rights; + "The expected value for rights is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Distribution"@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path ; + "Minimally 1 values are expected for applicable legislation"@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessURL"; + shacl:description "A URL that gives access to a Distribution of the Dataset."@en; + shacl:minCount 1; + shacl:name "access URL"@en; + shacl:path dcat:accessURL; + "Minimally 1 values are expected for access URL"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.licence"; + shacl:description "A licence under which the Distribution is made available."@en; + shacl:name "licence"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:license; + "The expected value for licence is a rdfs:Resource (URI or blank node)"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dcat:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:LicenseDocument . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:RightsStatement . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:Standard . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass foaf:Document . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass rdfs:Literal . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass rdfs:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass skos:Concept . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + , + , + ; + shacl:targetClass vcard:Kind . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.email"; + shacl:description """A email address via which contact can be made."""@en; + shacl:name "email"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path vcard:hasEmail; + "The expected value for email is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.contactpage"; + shacl:description "A webpage that either allows to make contact (i.e. a webform) or the information contains how to get into contact. "@en; + shacl:name "contact page"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path vcard:hasURL; + "The expected value for contact page is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.contactpage"; + shacl:description "A webpage that either allows to make contact (i.e. a webform) or the information contains how to get into contact. "@en; + shacl:maxCount 1; + shacl:name "contact page"@en; + shacl:path vcard:hasURL; + "Maximally 1 values allowed for contact page"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.email"; + shacl:description """A email address via which contact can be made."""@en; + shacl:maxCount 1; + shacl:name "email"@en; + shacl:path vcard:hasEmail; + "Maximally 1 values allowed for email"@en . + + diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-full.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-full.ttl new file mode 100644 index 000000000000..11004878c055 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-full.ttl @@ -0,0 +1,912 @@ +@prefix dc: . +@prefix dcat: . +@prefix foaf: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix shacl: . +@prefix skos: . +@prefix vcard: . +@prefix xsd: . + + rdfs:member , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + ; + shacl:targetClass dcat:CatalogRecord . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#CatalogueRecord.primarytopic"; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:name "primary topic"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path foaf:primaryTopic; + "The expected value for primary topic is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#CatalogueRecord.primarytopic"; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:minCount 1; + shacl:name "primary topic"@en; + shacl:path foaf:primaryTopic; + "Minimally 1 values are expected for primary topic"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#CatalogueRecord.primarytopic"; + shacl:class dcat:Resource; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:name "primary topic"@en; + shacl:path foaf:primaryTopic; + "The range of primary topic must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#CatalogueRecord.primarytopic"; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:maxCount 1; + shacl:name "primary topic"@en; + shacl:path foaf:primaryTopic; + "Maximally 1 values allowed for primary topic"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + ; + shacl:targetClass dcat:Catalog . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.dataset"; + shacl:description "A Dataset that is part of the Catalogue."@en; + shacl:name "dataset"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:dataset; + "The expected value for dataset is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.record"; + shacl:class dcat:CatalogRecord; + shacl:description "A Catalogue Record that is part of the Catalogue"@en; + shacl:name "record"@en; + shacl:path dcat:record; + "The range of record must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.record"; + shacl:description "A Catalogue Record that is part of the Catalogue"@en; + shacl:name "record"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:record; + "The expected value for record is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.dataset"; + shacl:class dcat:Dataset; + shacl:description "A Dataset that is part of the Catalogue."@en; + shacl:name "dataset"@en; + shacl:path dcat:dataset; + "The range of dataset must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.service"; + shacl:class dcat:DataService; + shacl:description "A site or end-point (Data Service) that is listed in the Catalogue."@en; + shacl:name "service"@en; + shacl:path dcat:service; + "The range of service must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.service"; + shacl:description "A site or end-point (Data Service) that is listed in the Catalogue."@en; + shacl:name "service"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:service; + "The expected value for service is a rdfs:Resource (URI or blank node)"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dcat:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass skos:Concept . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:DataService . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Data Service."@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for applicable legislation is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.servesdataset"; + shacl:class dcat:Dataset; + shacl:description "This property refers to a collection of data that this data service can distribute."@en; + shacl:name "serves dataset"@en; + shacl:path dcat:servesDataset; + "The range of serves dataset must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.HVDcategory"; + shacl:class skos:Concept; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + "The range of HVD category must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointURL"; + shacl:description "The root location or primary endpoint of the service (an IRI)."@en; + shacl:name "endpoint URL"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:endpointURL; + "The expected value for endpoint URL is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.HVDcategory"; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:name "HVD category"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for HVD category is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointdescription"; + shacl:description "A description of the services available via the end-points, including their operations, parameters etc."@en; + shacl:name "endpoint description"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:endpointDescription; + "The expected value for endpoint description is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.documentation"; + shacl:class foaf:Document; + shacl:description "A page that provides additional information about the Data Service."@en; + shacl:name "documentation"@en; + shacl:path foaf:page; + "The range of documentation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.contactpoint"; + shacl:description "Contact information that can be used for sending comments about the Data Service."@en; + shacl:minCount 1; + shacl:name "contact point"@en; + shacl:path dcat:contactPoint; + "Minimally 1 values are expected for contact point"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Data Service."@en; + shacl:name "applicable legislation"@en; + shacl:path ; + "The range of applicable legislation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.contactpoint"; + shacl:class vcard:Kind; + shacl:description "Contact information that can be used for sending comments about the Data Service."@en; + shacl:name "contact point"@en; + shacl:path dcat:contactPoint; + "The range of contact point must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointURL"; + shacl:description "The root location or primary endpoint of the service (an IRI)."@en; + shacl:minCount 1; + shacl:name "endpoint URL"@en; + shacl:path dcat:endpointURL; + "Minimally 1 values are expected for endpoint URL"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.documentation"; + shacl:description "A page that provides additional information about the Data Service."@en; + shacl:minCount 1; + shacl:name "documentation"@en; + shacl:path foaf:page; + "Minimally 1 values are expected for documentation"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.rights"; + shacl:class dc:RightsStatement; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:path dc:rights; + "The range of rights must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.documentation"; + shacl:description "A page that provides additional information about the Data Service."@en; + shacl:name "documentation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path foaf:page; + "The expected value for documentation is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.contactpoint"; + shacl:description "Contact information that can be used for sending comments about the Data Service."@en; + shacl:name "contact point"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:contactPoint; + "The expected value for contact point is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.licence"; + shacl:description "A licence under which the Data service is made available."@en; + shacl:maxCount 1; + shacl:name "licence"@en; + shacl:path dc:license; + "Maximally 1 values allowed for licence"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.rights"; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:rights; + "The expected value for rights is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.servesdataset"; + shacl:description "This property refers to a collection of data that this data service can distribute."@en; + shacl:name "serves dataset"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:servesDataset; + "The expected value for serves dataset is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Data Service."@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path ; + "Minimally 1 values are expected for applicable legislation"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.licence"; + shacl:class dc:LicenseDocument; + shacl:description "A licence under which the Data service is made available."@en; + shacl:name "licence"@en; + shacl:path dc:license; + "The range of licence must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointdescription"; + shacl:class rdfs:Resource; + shacl:description "A description of the services available via the end-points, including their operations, parameters etc."@en; + shacl:name "endpoint description"@en; + shacl:path dcat:endpointDescription . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointURL"; + shacl:class rdfs:Resource; + shacl:description "The root location or primary endpoint of the service (an IRI)."@en; + shacl:name "endpoint URL"@en; + shacl:path dcat:endpointURL . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.licence"; + shacl:description "A licence under which the Data service is made available."@en; + shacl:name "licence"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:license; + "The expected value for licence is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.HVDcategory"; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:minCount 1; + shacl:name "HVD category"@en; + shacl:path ; + "Minimally 1 values are expected for HVD category"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + ; + shacl:targetClass dcat:DatasetSeries . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset Series."@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Dataset Series."@en; + shacl:name "applicable legislation"@en; + shacl:path . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.HVDCategory"; + shacl:class skos:Concept; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:path . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:minCount 1; + shacl:name "HVD Category"@en; + shacl:path . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset Series."@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:Dataset . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.conformsto"; + shacl:description "An implementing rule or other specification."@en; + shacl:name "conforms to"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:conformsTo; + "The expected value for conforms to is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset."@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for applicable legislation is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.datasetdistribution"; + shacl:class dcat:Distribution; + shacl:description "An available Distribution for the Dataset."@en; + shacl:name "dataset distribution"@en; + shacl:path dcat:distribution; + "The range of dataset distribution must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.datasetdistribution"; + shacl:description "An available Distribution for the Dataset."@en; + shacl:minCount 1; + shacl:name "dataset distribution"@en; + shacl:path dcat:distribution; + "Minimally 1 values are expected for dataset distribution"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.inseries"; + shacl:class dcat:DatasetSeries; + shacl:description "A dataset series of which the dataset is part."@en; + shacl:name "in series"@en; + shacl:path dcat:inSeries . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Dataset."@en; + shacl:name "applicable legislation"@en; + shacl:path ; + "The range of applicable legislation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.contactpoint"; + shacl:class vcard:Kind; + shacl:description "Contact information that can be used for sending comments about the Dataset."@en; + shacl:name "contact point"@en; + shacl:path dcat:contactPoint; + "The range of contact point must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.inseries"; + shacl:description "A dataset series of which the dataset is part."@en; + shacl:name "in series"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:inSeries . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.HVDCategory"; + shacl:class skos:Concept; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:path ; + "The range of HVD Category must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for HVD Category is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.contactpoint"; + shacl:description "Contact information that can be used for sending comments about the Dataset."@en; + shacl:name "contact point"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:contactPoint; + "The expected value for contact point is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.HVDCategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:minCount 1; + shacl:name "HVD Category"@en; + shacl:path ; + "Minimally 1 values are expected for HVD Category"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.conformsto"; + shacl:class dc:Standard; + shacl:description "An implementing rule or other specification."@en; + shacl:name "conforms to"@en; + shacl:path dc:conformsTo; + "The range of conforms to must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Dataset."@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path ; + "Minimally 1 values are expected for applicable legislation"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.datasetdistribution"; + shacl:description "An available Distribution for the Dataset."@en; + shacl:name "dataset distribution"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:distribution; + "The expected value for dataset distribution is a rdfs:Resource (URI or blank node)"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:Distribution . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Distribution"@en; + shacl:name "applicable legislation"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path ; + "The expected value for applicable legislation is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.linkedschemas"; + shacl:class dc:Standard; + shacl:description "An established schema to which the described Distribution conforms."@en; + shacl:name "linked schemas"@en; + shacl:path dc:conformsTo; + "The range of linked schemas must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessservice"; + shacl:description "A data service that gives access to the distribution of the dataset"@en; + shacl:name "access service"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:accessService; + "The expected value for access service is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.linkedschemas"; + shacl:description "An established schema to which the described Distribution conforms."@en; + shacl:name "linked schemas"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:conformsTo; + "The expected value for linked schemas is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessURL"; + shacl:class rdfs:Resource; + shacl:description "A URL that gives access to a Distribution of the Dataset."@en; + shacl:name "access URL"@en; + shacl:path dcat:accessURL . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Distribution"@en; + shacl:name "applicable legislation"@en; + shacl:path ; + "The range of applicable legislation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessservice"; + shacl:class dcat:DataService; + shacl:description "A data service that gives access to the distribution of the dataset"@en; + shacl:name "access service"@en; + shacl:path dcat:accessService; + "The range of access service must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.rights"; + shacl:class dc:RightsStatement; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:path dc:rights; + "The range of rights must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.licence"; + shacl:description "A licence under which the Distribution is made available."@en; + shacl:maxCount 1; + shacl:name "licence"@en; + shacl:path dc:license; + "Maximally 1 values allowed for licence"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessURL"; + shacl:description "A URL that gives access to a Distribution of the Dataset."@en; + shacl:name "access URL"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:accessURL; + "The expected value for access URL is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.rights"; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:rights; + "The expected value for rights is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.applicablelegislation"; + shacl:description "The legislation that mandates the creation or management of the Distribution"@en; + shacl:minCount 1; + shacl:name "applicable legislation"@en; + shacl:path ; + "Minimally 1 values are expected for applicable legislation"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.licence"; + shacl:class dc:LicenseDocument; + shacl:description "A licence under which the Distribution is made available."@en; + shacl:name "licence"@en; + shacl:path dc:license; + "The range of licence must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessURL"; + shacl:description "A URL that gives access to a Distribution of the Dataset."@en; + shacl:minCount 1; + shacl:name "access URL"@en; + shacl:path dcat:accessURL; + "Minimally 1 values are expected for access URL"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.licence"; + shacl:description "A licence under which the Distribution is made available."@en; + shacl:name "licence"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dc:license; + "The expected value for licence is a rdfs:Resource (URI or blank node)"@en . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dcat:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:LicenseDocument . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:RightsStatement . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:Standard . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass foaf:Document . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass rdfs:Literal . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass rdfs:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass skos:Concept . + + a shacl:NodeShape; + shacl:closed false; + shacl:property , + , + , + , + , + ; + shacl:targetClass vcard:Kind . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.email"; + shacl:class rdfs:Resource; + shacl:description """A email address via which contact can be made."""@en; + shacl:name "email"@en; + shacl:path vcard:hasEmail . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.contactpage"; + shacl:class rdfs:Resource; + shacl:description "A webpage that either allows to make contact (i.e. a webform) or the information contains how to get into contact. "@en; + shacl:name "contact page"@en; + shacl:path vcard:hasURL . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.email"; + shacl:description """A email address via which contact can be made."""@en; + shacl:name "email"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path vcard:hasEmail; + "The expected value for email is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.contactpage"; + shacl:description "A webpage that either allows to make contact (i.e. a webform) or the information contains how to get into contact. "@en; + shacl:name "contact page"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path vcard:hasURL; + "The expected value for contact page is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.contactpage"; + shacl:description "A webpage that either allows to make contact (i.e. a webform) or the information contains how to get into contact. "@en; + shacl:maxCount 1; + shacl:name "contact page"@en; + shacl:path vcard:hasURL; + "Maximally 1 values allowed for contact page"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.email"; + shacl:description """A email address via which contact can be made."""@en; + shacl:maxCount 1; + shacl:name "email"@en; + shacl:path vcard:hasEmail; + "Maximally 1 values allowed for email"@en . + + + +@prefix dc: . +@prefix dcat: . +@prefix foaf: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix shacl: . +@prefix skos: . +@prefix vcard: . +@prefix xsd: . + + rdfs:member + , + , + , + , + , + , + , + . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + , + ; + shacl:targetClass dcat:Dataset . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + ; + shacl:targetClass dcat:DataService . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + ; + shacl:targetClass dcat:DatasetSeries . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + + ; + shacl:targetClass dcat:Distribution . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd/#Kind"; + shacl:description """It is recommended to provide at least either an email or a contact form from e.g. a service desk. """@en; + shacl:or ( + [ + shacl:path vcard:hasEmail; + shacl:minCount 1 ; + ] + [ + shacl:path vcard:hasURL; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass vcard:Kind ; + shacl:severity shacl:Warning ; + "It is recommended to provide at least either an email or a contact form from e.g. a service desk. "@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd/#c3"; + shacl:description """It is mandatory to provide legal information."""@en; + shacl:or ( + [ + shacl:path dc:license; + shacl:minCount 1 ; + ] + [ + shacl:path dc:rights; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass dcat:Distribution; + "It is mandatory to provide legal information."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd/#c3"; + shacl:description """It is mandatory to provide legal information."""@en; + shacl:or ( + [ + shacl:path dc:license; + shacl:minCount 1 ; + ] + [ + shacl:path dc:rights; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass dcat:DataService; + "It is mandatory to provide legal information."@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + + rdf:type owl:Ontology ; + owl:imports . + + + + a shacl:NodeShape ; + rdfs:comment "HVD Category Restriction" ; + rdfs:label "HVD Category Restriction" ; + shacl:property [ + shacl:hasValue ; + shacl:minCount 1 ; + shacl:nodeKind shacl:IRI ; + shacl:path skos:inScheme + ] . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.HVDcategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + shacl:node ; + "The range of HVD category must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.HVDcategory"; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + shacl:node ; + "The range of HVD category must be in scheme ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.HVDcategory"; + shacl:description "The HVD category to which this Dataset Series belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + shacl:node ; + "The range of HVD category must be in scheme ."@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#/#apis-are-mandatory"; + shacl:description "HVD Datasets are accessible via an API."@en; + shacl:name "API exists"@en; + shacl:path [ shacl:alternativePath ( [ shacl:inversePath dcat:servesDataset ] ( dcat:distribution dcat:accessService ) )]; + shacl:nodeKind shacl:IRI ; + shacl:minCount 1 ; + shacl:severity shacl:Violation ; + "A HVD dataset has an API"@en. + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd/#assessment-support-for-licences"; + shacl:description """It is recommended to provide an indication how the licence is related with other licences. """@en; + shacl:or ( + [ + shacl:path skos:exactMatch; + shacl:minCount 1 ; + ] + [ + shacl:path owl:sameAs; + shacl:minCount 1 ; + ] + [ + shacl:path skos:broadMatch; + shacl:minCount 1 ; + ] + [ + shacl:path skos:narrowMatch; + shacl:minCount 1 ; + ] + [ + shacl:path skos:closeMatch; + shacl:minCount 1 ; + ] + [ + shacl:path rdfs:seeAlso; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass dc:LicenseDocument ; + shacl:severity shacl:Warning ; + "It is recommended to provide an indication how the licence is related with other licences. "@en . diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-ranges.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-ranges.ttl new file mode 100644 index 000000000000..7def9a5d5df1 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-ranges.ttl @@ -0,0 +1,384 @@ +@prefix dc: . +@prefix dcat: . +@prefix foaf: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix shacl: . +@prefix skos: . +@prefix vcard: . +@prefix xsd: . + + rdfs:member , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + ; + shacl:targetClass dcat:CatalogRecord . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#CatalogueRecord.primarytopic"; + shacl:class dcat:Resource; + shacl:description "A link to the Dataset, Data service or Catalog described in the record."@en; + shacl:name "primary topic"@en; + shacl:path foaf:primaryTopic; + "The range of primary topic must be of type ."@en . + + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + , + ; + shacl:targetClass dcat:Catalog . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.record"; + shacl:class dcat:CatalogRecord; + shacl:description "A Catalogue Record that is part of the Catalogue"@en; + shacl:name "record"@en; + shacl:path dcat:record; + "The range of record must be of type ."@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.dataset"; + shacl:class dcat:Dataset; + shacl:description "A Dataset that is part of the Catalogue."@en; + shacl:name "dataset"@en; + shacl:path dcat:dataset; + "The range of dataset must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Catalogue.service"; + shacl:class dcat:DataService; + shacl:description "A site or end-point (Data Service) that is listed in the Catalogue."@en; + shacl:name "service"@en; + shacl:path dcat:service; + "The range of service must be of type ."@en . + + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dcat:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass skos:Concept . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + , + , + , + , + , + , + , + , + ; + shacl:targetClass dcat:DataService . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.servesdataset"; + shacl:class dcat:Dataset; + shacl:description "This property refers to a collection of data that this data service can distribute."@en; + shacl:name "serves dataset"@en; + shacl:path dcat:servesDataset; + "The range of serves dataset must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.HVDcategory"; + shacl:class skos:Concept; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + "The range of HVD category must be of type ."@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointdescription"; + shacl:description "A description of the services available via the end-points, including their operations, parameters etc."@en; + shacl:name "endpoint description"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:endpointDescription; + "The expected value for endpoint description is a rdfs:Resource (URI or blank node)"@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.documentation"; + shacl:class foaf:Document; + shacl:description "A page that provides additional information about the Data Service."@en; + shacl:name "documentation"@en; + shacl:path foaf:page; + "The range of documentation must be of type ."@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Data Service."@en; + shacl:name "applicable legislation"@en; + shacl:path ; + "The range of applicable legislation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.contactpoint"; + shacl:class vcard:Kind; + shacl:description "Contact information that can be used for sending comments about the Data Service."@en; + shacl:name "contact point"@en; + shacl:path dcat:contactPoint; + "The range of contact point must be of type ."@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.rights"; + shacl:class dc:RightsStatement; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:path dc:rights; + "The range of rights must be of type ."@en . + + + + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.licence"; + shacl:class dc:LicenseDocument; + shacl:description "A licence under which the Data service is made available."@en; + shacl:name "licence"@en; + shacl:path dc:license; + "The range of licence must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointdescription"; + shacl:class rdfs:Resource; + shacl:description "A description of the services available via the end-points, including their operations, parameters etc."@en; + shacl:name "endpoint description"@en; + shacl:path dcat:endpointDescription . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.endpointURL"; + shacl:class rdfs:Resource; + shacl:description "The root location or primary endpoint of the service (an IRI)."@en; + shacl:name "endpoint URL"@en; + shacl:path dcat:endpointURL . + + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + ; + shacl:targetClass dcat:DatasetSeries . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Dataset Series."@en; + shacl:name "applicable legislation"@en; + shacl:path . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.HVDCategory"; + shacl:class skos:Concept; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:path . + + + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + , + , + , + , + , + ; + shacl:targetClass dcat:Dataset . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.datasetdistribution"; + shacl:class dcat:Distribution; + shacl:description "An available Distribution for the Dataset."@en; + shacl:name "dataset distribution"@en; + shacl:path dcat:distribution; + "The range of dataset distribution must be of type ."@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.inseries"; + shacl:class dcat:DatasetSeries; + shacl:description "A dataset series of which the dataset is part."@en; + shacl:name "in series"@en; + shacl:path dcat:inSeries . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Dataset."@en; + shacl:name "applicable legislation"@en; + shacl:path ; + "The range of applicable legislation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.contactpoint"; + shacl:class vcard:Kind; + shacl:description "Contact information that can be used for sending comments about the Dataset."@en; + shacl:name "contact point"@en; + shacl:path dcat:contactPoint; + "The range of contact point must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.inseries"; + shacl:description "A dataset series of which the dataset is part."@en; + shacl:name "in series"@en; + shacl:nodeKind shacl:BlankNodeOrIRI; + shacl:path dcat:inSeries . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.HVDCategory"; + shacl:class skos:Concept; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD Category"@en; + shacl:path ; + "The range of HVD Category must be of type ."@en . + + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.conformsto"; + shacl:class dc:Standard; + shacl:description "An implementing rule or other specification."@en; + shacl:name "conforms to"@en; + shacl:path dc:conformsTo; + "The range of conforms to must be of type ."@en . + + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + , + , + , + , + ; + shacl:targetClass dcat:Distribution . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.linkedschemas"; + shacl:class dc:Standard; + shacl:description "An established schema to which the described Distribution conforms."@en; + shacl:name "linked schemas"@en; + shacl:path dc:conformsTo; + "The range of linked schemas must be of type ."@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessURL"; + shacl:class rdfs:Resource; + shacl:description "A URL that gives access to a Distribution of the Dataset."@en; + shacl:name "access URL"@en; + shacl:path dcat:accessURL . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.applicablelegislation"; + shacl:class ; + shacl:description "The legislation that mandates the creation or management of the Distribution"@en; + shacl:name "applicable legislation"@en; + shacl:path ; + "The range of applicable legislation must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.accessservice"; + shacl:class dcat:DataService; + shacl:description "A data service that gives access to the distribution of the dataset"@en; + shacl:name "access service"@en; + shacl:path dcat:accessService; + "The range of access service must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.rights"; + shacl:class dc:RightsStatement; + shacl:description "A statement that specifies rights associated with the Distribution."@en; + shacl:name "rights"@en; + shacl:path dc:rights; + "The range of rights must be of type ."@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.licence"; + shacl:class dc:LicenseDocument; + shacl:description "A licence under which the Distribution is made available."@en; + shacl:name "licence"@en; + shacl:path dc:license; + "The range of licence must be of type ."@en . + + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dcat:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:LicenseDocument . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:RightsStatement . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass dc:Standard . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass foaf:Document . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass rdfs:Literal . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass rdfs:Resource . + + a shacl:NodeShape; + shacl:closed false; + shacl:targetClass skos:Concept . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + ; + shacl:targetClass vcard:Kind . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.email"; + shacl:class rdfs:Resource; + shacl:description """A email address via which contact can be made."""@en; + shacl:name "email"@en; + shacl:path vcard:hasEmail . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Kind.contactpage"; + shacl:class rdfs:Resource; + shacl:description "A webpage that either allows to make contact (i.e. a webform) or the information contains how to get into contact. "@en; + shacl:name "contact page"@en; + shacl:path vcard:hasURL . + + + + + + + + diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-usagenotes.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-usagenotes.ttl new file mode 100644 index 000000000000..137e909923aa --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0-hvd/hvd-SHACL-usagenotes.ttl @@ -0,0 +1,219 @@ +@prefix dc: . +@prefix dcat: . +@prefix foaf: . +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix shacl: . +@prefix skos: . +@prefix vcard: . +@prefix xsd: . + + rdfs:member + , + , + , + , + , + , + , + . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + , + ; + shacl:targetClass dcat:Dataset . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + ; + shacl:targetClass dcat:DataService . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + , + ; + shacl:targetClass dcat:DatasetSeries . + + a shacl:NodeShape; + shacl:closed false; + shacl:property + + ; + shacl:targetClass dcat:Distribution . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd/#Kind"; + shacl:description """It is recommended to provide at least either an email or a contact form from e.g. a service desk. """@en; + shacl:or ( + [ + shacl:path vcard:hasEmail; + shacl:minCount 1 ; + ] + [ + shacl:path vcard:hasURL; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass vcard:Kind ; + shacl:severity shacl:Warning ; + "It is recommended to provide at least either an email or a contact form from e.g. a service desk. "@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd/#c3"; + shacl:description """It is mandatory to provide legal information."""@en; + shacl:or ( + [ + shacl:path dc:license; + shacl:minCount 1 ; + ] + [ + shacl:path dc:rights; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass dcat:Distribution; + "It is mandatory to provide legal information."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd/#c3"; + shacl:description """It is mandatory to provide legal information."""@en; + shacl:or ( + [ + shacl:path dc:license; + shacl:minCount 1 ; + ] + [ + shacl:path dc:rights; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass dcat:DataService; + "It is mandatory to provide legal information."@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Distribution.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.applicablelegislation"; + shacl:description "The applicable legislation must be set to the HVD IR ELI."@en; + shacl:path ; + shacl:hasValue ; + "The applicable legislation must be set to the HVD IR ELI."@en . + + + rdf:type owl:Ontology ; + owl:imports . + + + + a shacl:NodeShape ; + rdfs:comment "HVD Category Restriction" ; + rdfs:label "HVD Category Restriction" ; + shacl:property [ + shacl:hasValue ; + shacl:minCount 1 ; + shacl:nodeKind shacl:IRI ; + shacl:path skos:inScheme + ] . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#Dataset.HVDcategory"; + shacl:description "The HVD category to which this Dataset belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + shacl:node ; + "The range of HVD category must be of type ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DataService.HVDcategory"; + shacl:description "The HVD category to which this Data Service belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + shacl:node ; + "The range of HVD category must be in scheme ."@en . + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#DatasetSeries.HVDcategory"; + shacl:description "The HVD category to which this Dataset Series belongs."@en; + shacl:name "HVD category"@en; + shacl:path ; + shacl:node ; + "The range of HVD category must be in scheme ."@en . + + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd#/#apis-are-mandatory"; + shacl:description "HVD Datasets are accessible via an API."@en; + shacl:name "API exists"@en; + shacl:path [ shacl:alternativePath ( [ shacl:inversePath dcat:servesDataset ] ( dcat:distribution dcat:accessService ) )]; + shacl:nodeKind shacl:BlankNodeOrIRI ; + shacl:minCount 1 ; + shacl:severity shacl:Violation ; + "A HVD dataset has an API"@en. + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd/#Dataset.datasetdistribution"; + shacl:description "HVD Datasets are accessible via a bulk download."@en; + shacl:name "Bulk download distribution is strongly recommended"@en; + shacl:path dcat:distribution; + shacl:nodeKind shacl:BlankNodeOrIRI ; + shacl:minCount 1 ; + shacl:severity shacl:Violation ; + "A HVD dataset mostly has a bulk download."@en. + + + rdfs:seeAlso "https://semiceu.github.io/DCAT-AP/releases/3.0.0-hvd/#assessment-support-for-licences"; + shacl:description """It is recommended to provide an indication how the licence is related with other licences. """@en; + shacl:or ( + [ + shacl:path skos:exactMatch; + shacl:minCount 1 ; + ] + [ + shacl:path owl:sameAs; + shacl:minCount 1 ; + ] + [ + shacl:path skos:broadMatch; + shacl:minCount 1 ; + ] + [ + shacl:path skos:narrowMatch; + shacl:minCount 1 ; + ] + [ + shacl:path skos:closeMatch; + shacl:minCount 1 ; + ] + [ + shacl:path rdfs:seeAlso; + shacl:minCount 1 ; + ] + ) ; + a shacl:NodeShape ; + shacl:targetClass dc:LicenseDocument ; + shacl:severity shacl:Warning ; + "It is recommended to provide an indication how the licence is related with other licences. "@en . diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl new file mode 100644 index 000000000000..c02a5bd853e9 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/deprecateduris.ttl @@ -0,0 +1,123 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + +#------------------------------------------------------------------------- +# The shapes in this file cover all URI changes that require attention +# by the catalogue owner. +# +# deprecated by the transition from version 1.x to 2.x +# +#------------------------------------------------------------------------- + +:PeriodOfTimeDeprecation_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime Deprecation properties"@en ; + sh:property [ + sh:path schema:endDate ; + sh:severity sh:Warning ; + sh:message "replace property schema:endDate with dcat:endDate"@en + ], [ + sh:path schema:startDate ; + sh:severity sh:Warning ; + sh:message "replace property schema:startDate with dcat:startDate"@en + ] ; + sh:targetClass dct:PeriodOfTime . + + +#------------------------------------------------------------------------- +# The shapes in this file cover all URI changes that require attention +# by the catalogue owner. +# +# deprecated by the transition from version 1.x to 2.x +# +#------------------------------------------------------------------------- + + +:DatasetDeprecation_Shape + a sh:NodeShape ; + rdfs:label "Dataset Deprecation properties"@en ; + sh:property [ + sh:path dct:hasVersion ; + sh:severity sh:Warning ; + sh:message "replace property dct:hasVersion with dcat:hasVersion"@en + + ], [ + sh:path dct:isVersionOf ; + sh:severity sh:Warning ; + sh:message "replace dct:isVersionOf with dcat:isVersionOf"@en + ], [ + sh:path owl:versionInfo ; + sh:severity sh:Warning ; + sh:message "replace owl:versionInfo with dcat:version"@en + ]; + sh:targetClass dcat:Dataset . + + +#------------------------------------------------------------------------- +# The shapes in this file cover all URI changes that require attention +# by the catalogue owner. +# +# deprecated by the transition from version 2.x to 3.x +# +#------------------------------------------------------------------------- + + +:DatasetInverseProperties_Shape + a sh:NodeShape ; + rdfs:label "Dataset Deprecation properties"@en ; + sh:property [ + sh:path dcat:isVersionOf ; + sh:severity sh:Warning ; + sh:message "dcat:isVersionOf is an inverse property and should only be used if dcat:hasVersion is present."@en + ]; + sh:targetClass dcat:Dataset . + + + + + rdf:type owl:Ontology ; + owl:imports . + + +:StatusRestrictionADMS + a sh:NodeShape ; + rdfs:comment "Status restriction" ; + rdfs:label "Status restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + + +:Distribution_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :StatusRestrictionADMS ; + sh:nodeKind sh:IRI ; + sh:path adms:status ; + sh:description "The codelist of adms:status has changed from DCAT-AP 2.1 to DCAT-AP 3.0.0" ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Distribution. diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/imports.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/imports.ttl new file mode 100644 index 000000000000..47cc2efc3500 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/imports.ttl @@ -0,0 +1,28 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + +# +# This file provides the imports that are implicitly the result of reusing them in the DCAT-AP application profile. +# The imports point to the URL of the RDF serializations (mostly the turtle serializations) as not all ontology URIs have content negotation implemented. +# The RDF format is required for the ISA testbed validator. +# The following imports have been outcommented: +# owl:imports ; import is excluded because the shacl shape for Category applies to all instances of skos:Concept and the skos:Concepts in the ODRL do not comply to this. + + + + rdf:type owl:Ontology ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports + . + + diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/mdr-vocabularies.shape.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/mdr-vocabularies.shape.ttl new file mode 100644 index 000000000000..e7228a9ede81 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/mdr-vocabularies.shape.ttl @@ -0,0 +1,441 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + + dcat:accessURL ; + dcat:downloadURL ; + dcatap:availability ; + dct:format ; + dct:conformsTo ; + dct:creator [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Bert Van Nuffelen" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Natasa Sofou" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Eugeniu Costetchi" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Makx Dekkers" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Nikolaos Loutas" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Vassilios Peristeras" + ] ; + dct:license ; + cc:attributionURL ; + dct:modified "2021-12-01"^^xsd:date ; + dct:publisher ; + dct:relation ; + dct:description "This document specifies the controlled vocabulary constraints on properties expressed by DCAT-AP in SHACL."@en ; + dct:title "Controlled Vocabulary Constraints of DCAT Application Profile for Data Portals in Europe"@en ; + owl:versionInfo "2.1.1" ; + foaf:homepage ; + foaf:maker [ + foaf:mbox ; + foaf:name "DCAT-AP Working Group" ; + foaf:page , + ] . + +:AvailabilityRestriction + a sh:NodeShape ; + rdfs:comment "Availability restriction" ; + rdfs:label "Availability restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:ContinentRestriction + a sh:NodeShape ; + rdfs:comment "Continent restriction" ; + rdfs:label "Continent restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:CorporateBodyRestriction + a sh:NodeShape ; + rdfs:comment "Corporate Body Restriction" ; + rdfs:label "Corporate Body Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:CountryRestriction + a sh:NodeShape ; + rdfs:comment "Country restriction" ; + rdfs:label "Country restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:DataThemeRestriction + a sh:NodeShape ; + rdfs:comment "Data Theme Restriction" ; + rdfs:label "Data Theme Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:AccessRightRestriction + a sh:NodeShape ; + rdfs:comment "Access Rights Restriction" ; + rdfs:label "Data Theme Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:DatasetTypeRestriction + a sh:NodeShape ; + rdfs:comment "Dataset Type Restriction" ; + rdfs:label "Dataset Type Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + + +:FileTypeRestriction + a sh:NodeShape ; + rdfs:comment "File Type Restriction" ; + rdfs:label "File Type Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:FrequencyRestriction + a sh:NodeShape ; + rdfs:comment "Frequency Restriction" ; + rdfs:label "Frequency Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:GeoNamesRestrictionRegexURI + rdfs:comment "Geonames restriction - base itself on URI structure" ; + rdfs:label "Geonames restriction" ; + a sh:NodeShape ; + sh:pattern "^https://sws.geonames.org" . + + +:LanguageRestriction + a sh:NodeShape ; + rdfs:comment "Language Restriction" ; + rdfs:label "Language Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:LicenceTypeRestriction + a sh:NodeShape ; + rdfs:comment "Licence type restriction" ; + rdfs:label "Licence type restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:PlaceRestriction + a sh:NodeShape ; + rdfs:comment "Place restriction" ; + rdfs:label "Place restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:PublisherTypeRestriction + a sh:NodeShape ; + rdfs:comment "Publisher type restriction" ; + rdfs:label "Publisher type restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:IANARestrictionRegexURI + rdfs:comment "IANA restriction - base itself on URL structure" ; + rdfs:label "IANA restriction" ; + a sh:NodeShape ; + sh:pattern "^http.*://www.iana.org/assignments/media-types/" . + +:StatusRestriction + a sh:NodeShape ; + rdfs:comment "Status restriction" ; + rdfs:label "Status restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:ChecksumAlgorithmRestriction + a sh:NodeShape ; + rdfs:comment "Checksum algorithm restriction" ; + rdfs:label "Checksum algorithm restriction" ; + sh:pattern "^https://spdx.org/rdf/terms" ; + sh:class . + +:Checksum_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :ChecksumAlgorithmRestriction ; + sh:nodeKind sh:IRI ; + sh:path spdx:algorithm + ] ; + sh:targetClass spdx:Checksum. + +:LicenseDocument_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :LicenceTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:type + ] ; + sh:targetClass dct:LicenseDocument. + + + +:Catalog_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :LanguageRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:language ; + sh:description "A non EU managed concept is used to indicate a language. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ], [ + sh:node :CorporateBodyRestriction ; + sh:node :Publisher_ShapeCV ; + sh:nodeKind sh:IRI ; + sh:path dct:publisher ; + sh:description "A non EU managed concept is used to indicate the publisher, check if a corresponding exists in the EU corporates bodies NAL" ; + sh:severity sh:Warning + ], [ + sh:node [ + a sh:NodeShape ; + sh:or (:CountryRestriction + :PlaceRestriction + :ContinentRestriction + :GeoNamesRestrictionRegexURI + ) + ] ; + sh:nodeKind sh:IRI ; + sh:path dct:spatial ; + sh:description "A non managed concept is used to indicate a spatial description, check if a corresponding exists" ; + sh:severity sh:Warning + ], [ + sh:hasValue ; + sh:nodeKind sh:IRI ; + sh:path dcat:themeTaxonomy ; + sh:description "Multiple themes can be used but at least should be present" ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Catalog. + +:Dataset_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :FrequencyRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accrualPeriodicity ; + sh:description "A non EU managed concept is used to indicate the accrualPeriodicity frequency. If no corresponding can be found inform the maintainer of the EU frequency NAL" ; + sh:severity sh:Violation + ], [ + sh:node :LanguageRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:language ; + sh:description "A non EU managed concept is used to indicate a language. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ], [ + sh:node :CorporateBodyRestriction ; + sh:node :Publisher_ShapeCV ; + sh:nodeKind sh:IRI ; + sh:path dct:publisher ; + sh:description "A non EU managed concept is used to indicate the publisher, check if a corresponding exists in the EU corporates bodies NAL" ; + sh:severity sh:Warning + ], [ + sh:node [ + a sh:NodeShape ; + sh:or (:CountryRestriction + :PlaceRestriction + :ContinentRestriction + :GeoNamesRestrictionRegexURI + ) + ] ; + sh:nodeKind sh:IRI ; + sh:path dct:spatial ; + sh:description "A non managed concept is used to indicate a spatial description, check if a corresponding exists" ; + sh:severity sh:Warning + ], [ + sh:node :DataThemeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:description "Multiple themes can be used but at least one concept of should be present" ; + sh:severity sh:Warning + ], [ + sh:node :DatasetTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:type ; + sh:description "Multiple types can be used but it is recommended to also provide at least one concept of should be present" ; + sh:severity sh:Warning + ], [ + sh:node :AccessRightRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accessRights ; + sh:description "A non EU managed concept is used to indicate the access right. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset. + +# ------------------------------------------------------------------------------------------------------------------ +# The constraints for dcat:mediaType, dcat:compressFormat, dcat:packageFormat which are limited to the IANA codelist +# cannot be expressed in SHACL unless a copy in RDF for the IANA codelist is being created. +# A less formal check is provided based upon the assumption that the IANIA codelist is hosted on a known URL domain. +# This check is sensitive to the publication strategy of IANA. +# ------------------------------------------------------------------------------------------------------------------ +:Distribution_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :FileTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:format ; + sh:description "A non EU managed concept is used to indicate the format of the distribution. If no corresponding can be found inform the maintainer of the fileformat NAL." ; + sh:severity sh:Violation + ], [ + sh:node :LanguageRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:language ; + sh:description "A non EU managed concept is used to indicate a language. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ], [ + sh:node :StatusRestriction ; + sh:nodeKind sh:IRI ; + sh:path adms:status ; + sh:description "A non EU managed concept is used to indicate the status of the distribution. If no corresponding can be found inform the maintainer of the adms:status codelist." ; + sh:severity sh:Violation + ], [ + sh:node :AvailabilityRestriction ; + sh:nodeKind sh:IRI ; + sh:path dcatap:availability ; + sh:description "A non EU managed concept is used to indicate the availability of the distribution. If no corresponding can be found inform the maintainer of the DCAT-AP availability codelist." ; + sh:severity sh:Violation + ], [ + sh:node :IANARestrictionRegexURI; + sh:nodeKind sh:IRI ; + sh:path dcat:mediaType ; + sh:description "A mediaType expects a value from IANA. This check uses the URLs from IANA to perform the check as there is no IANA codelist downloadable." ; + sh:severity sh:Warning + ], [ + sh:node :IANARestrictionRegexURI; + sh:nodeKind sh:IRI ; + sh:path dcat:compressFormat ; + sh:description "A compressFormat expects a value from IANA. This check uses the URLs from IANA to perform the check as there is no IANA codelist downloadable." ; + sh:severity sh:Warning + ], [ + sh:node :IANARestrictionRegexURI; + sh:nodeKind sh:IRI ; + sh:path dcat:packageFormat ; + sh:description "A packageFormat expects a value from IANA. This check uses the URLs from IANA to perform the check as there is no IANA codelist downloadable." ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Distribution. + +:DataService_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :AccessRightRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accessRights ; + sh:description "A non EU managed concept is used to indicate the access right. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution. + + +:Publisher_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :PublisherTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:type ; + sh:description "A non EU managed concept is used to indicate the type of the publisher. If no corresponding can be found inform the maintainer of the adms:publishertype codelist." ; + sh:severity sh:Violation + ] . + diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/mdr_imports.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/mdr_imports.ttl new file mode 100644 index 000000000000..a5363b31df83 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/mdr_imports.ttl @@ -0,0 +1,29 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + +# +# This file provides the imports of the codelists recommended by the DCAT-AP application profile. +# http://publications.europa.eu/resource/authority/dataset-type (TODO) + + + + rdf:type owl:Ontology ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports +. + +# import of the checksum vocabulary +# owl:imports ; diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/range.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/range.ttl new file mode 100644 index 000000000000..56440f2fe72b --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/range.ttl @@ -0,0 +1,449 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + dct:description "This file contains the class range constraints for all properties in DCAT-AP"@en. + + + + +#------------------------------------------------------------------------- +# The shapes in this file cover all class range constraints in DCAT-AP +# +# Depending on the exchange agreements these may be necessary to be part +# of the validation process. However they mostly figure in the semantical +# understanding of the ranges. +# +#------------------------------------------------------------------------- + +:Agent_Shape + a sh:NodeShape ; + rdfs:label "Agent"@en ; + sh:property [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + rdfs:label "Catalog Record"@en ; + sh:property [ + sh:node :DcatResource_Shape ; + sh:path foaf:primaryTopic ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path adms:status ; + sh:severity sh:Violation + ], [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:class dcat:CatalogRecord ; + sh:path dct:source ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:CatalogRecord . + +:Catalog_Shape + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:property [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class dct:LicenseDocument ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:class dct:Location ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:class dcat:Catalog ; + sh:path dct:hasPart ; + sh:severity sh:Violation + ], [ + sh:class dcat:Catalog ; + sh:path dct:isPartOf ; + sh:severity sh:Violation + ], [ + sh:class dct:RightsStatement ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:class dcat:CatalogRecord ; + sh:path dcat:record ; + sh:severity sh:Violation + ], [ + sh:class skos:ConceptScheme ; + sh:path dcat:themeTaxonomy ; + sh:severity sh:Violation + ], [ + sh:class dcat:DataService ; + sh:path dcat:service ; + sh:severity sh:Violation + ], [ + sh:class dcat:Catalog ; + sh:path dcat:catalog ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dcat:dataset ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path foaf:homepage ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Catalog . + + +:DataService_Shape + a sh:NodeShape ; + rdfs:label "Data Service"@en ; + sh:property [ + sh:class dct:RightsStatement ; + sh:path dct:accessRights ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class vcard:Kind ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaTypeOrExtent ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:class dct:LicenseDocument ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:path dct:publisher ; + sh:class foaf:Agent; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dcat:servesDataset ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dcat:theme ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DataService . + + +:Dataset_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:class dct:RightsStatement ; + sh:path dct:accessRights ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class vcard:Kind ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:class dcat:Distribution ; + sh:path dcat:distribution ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:path dct:accrualPeriodicity; + sh:class dct:Frequency; + sh:severity sh:Violation + ], [ + sh:class dct:Location ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dct:hasVersion ; + sh:severity sh:Violation + ], [ + sh:class dcat:DatasetSeries ; + sh:path dcat:inSeries ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:class adms:Identifier ; + sh:path adms:identifier ; + sh:severity sh:Violation + ], [ + sh:class dct:ProvenanceStatement ; + sh:path dct:provenance ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:class prov:Attribution ; + sh:path prov:qualifiedAttribution ; + sh:severity sh:Violation + ], [ + sh:class dcat:Relationship ; + sh:path dcat:qualifiedRelation ; + sh:severity sh:Violation + ], [ + sh:class dcat:Distribution ; + sh:path adms:sample ; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dct:source ; + sh:severity sh:Violation + ], [ + sh:class dct:PeriodOfTime ; + sh:path dct:temporal ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dcat:theme ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:severity sh:Violation + ], [ + sh:class prov:Activity ; + sh:path prov:wasGeneratedBy ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset . + + +:DcatResource_Shape + a sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset, DataService or Dataset Series" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset, DataService or a Dataset Series" ; + sh:or ([ + sh:class dcat:Catalog + ] + [ + sh:class dcat:Dataset + ] + [ + sh:class dcat:DataService + ] + [ + sh:class dcat:DatasetSeries + ] + ) . + +:Distribution_Shape + a sh:NodeShape ; + rdfs:label "Distribution"@en ; + sh:property [ + sh:class dcat:DataService ; + sh:path dcat:accessService ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dcatap:availability ; + sh:severity sh:Violation + ], [ + sh:class spdx:Checksum ; + sh:path spdx:checksum ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaType ; + sh:path dcat:compressFormat ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaTypeOrExtent ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:class odrl:Policy ; + sh:path odrl:hasPolicy ; + sh:severity sh:Violation + ], [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:class dct:LicenseDocument ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaType ; + sh:path dcat:mediaType ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaType ; + sh:path dcat:packageFormat ; + sh:severity sh:Violation + ], [ + sh:class dct:RightsStatement ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path adms:status ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution . + + +:LicenceDocument_Shape + a sh:NodeShape ; + rdfs:label "Licence Document"@en ; + sh:property [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:LicenseDocument . + + +:PeriodOfTime_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime"@en ; + sh:property [ + sh:class time:Instant ; + sh:path time:hasBeginning ; + sh:severity sh:Violation + ], [ + sh:class time:Instant ; + sh:path time:hasEnd ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:PeriodOfTime . + +:Relationship_Shape + a sh:NodeShape ; + rdfs:label "Relationship"@en ; + sh:property [ + sh:node :DcatResource_Shape ; + sh:path dct:relation ; + sh:severity sh:Violation + ], [ + sh:class dcat:Role ; + sh:path dcat:hadRole ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Relationship . + +:DatasetSeries_Shape + a sh:NodeShape ; + rdfs:label "Dataset Series"@en ; + sh:property [ + sh:class dcat:Dataset ; + sh:path [ sh:inversePath dcat:inSeries; ]; + sh:severity sh:Warning + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:path dcat:contactPoint; + sh:class vcard:Kind; + sh:severity sh:Violation + ], [ + sh:path dct:accrualPeriodicity; + sh:class dct:Frequency; + sh:severity sh:Violation + ], [ + sh:path dct:spatial; + sh:class dct:Location; + sh:severity sh:Violation + ], [ + sh:path dct:publisher ; + sh:class foaf:Agent; + sh:severity sh:Violation + ], [ + sh:path dct:temporal; + sh:class dct:PeriodOfTime; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DatasetSeries . diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/shapes.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/shapes.ttl new file mode 100644 index 000000000000..8874894fa1b2 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/shapes.ttl @@ -0,0 +1,746 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + dct:format ; + dct:conformsTo ; + dct:description "This files specifies the core constraints on properties and classes expressed by DCAT-AP in SHACL."@en. + + + +#------------------------------------------------------------------------- +# The shapes in this file cover all classes in DCAT-AP 3.0.0 +# It covers all constraints that must be satisfied except those verifying +# the class ranges. This can be found in a separate file. +# +#------------------------------------------------------------------------- + +:Agent_Shape + a sh:NodeShape ; + rdfs:label "Agent"@en ; + sh:property [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path foaf:name ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + rdfs:label "Catalog Record"@en ; + sh:property [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:node :DcatResource_Shape ; + sh:path foaf:primaryTopic ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path dct:modified ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:maxCount 1 ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path adms:status ; + sh:severity sh:Violation + ], [ + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:source ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:CatalogRecord . + +:Catalog_Shape + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:property [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:nodeKind sh:IRI; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:hasPart ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:modified ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:record ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:themeTaxonomy ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:service ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:catalog ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:dataset ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path foaf:homepage ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Catalog . + +:CategoryScheme_Shape + a sh:NodeShape ; + rdfs:label "Category Scheme"@en ; + sh:property [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ] ; + sh:targetClass skos:ConceptScheme . + +:Category_Shape + a sh:NodeShape ; + rdfs:label "Category"@en ; + sh:property [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path skos:prefLabel ; + sh:severity sh:Violation + ] ; + sh:targetClass skos:Concept . + +:Checksum_Shape + a sh:NodeShape ; + rdfs:label "Checksum"@en ; + sh:property [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path spdx:algorithm ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:hexBinary ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path spdx:checksumValue ; + sh:severity sh:Violation + ] ; + sh:targetClass spdx:Checksum . + +:DataService_Shape + a sh:NodeShape ; + rdfs:label "Data Service"@en ; + sh:property [ + sh:maxCount 1 ; + sh:path dct:accessRights ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:nodeKind sh:IRI; + sh:severity sh:Violation + ], [ + sh:path dct:conformsTo ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:endpointURL ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:endpointDescription ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dcat:keyword ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:servesDataset ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DataService . + +:Dataset_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:accessRights ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcatap:applicableLegislation; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:distribution ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:accrualPeriodicity; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:hasVersion ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:identifier ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:inSeries ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:isReferencedBy ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dcat:keyword ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:modified ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path adms:identifier ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:provenance ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path prov:qualifiedAttribution ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:qualifiedRelation ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:relation ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:issued ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path adms:sample ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:source ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:spatialResolutionInMeters ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:temporal ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:duration ; + sh:maxCount 1 ; + sh:path dcat:temporalResolution ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:type ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:version ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path adms:versionNotes ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path prov:wasGeneratedBy ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset . + +:DateOrDateTimeDataType_Shape + a sh:NodeShape ; + rdfs:comment "Date time date disjunction shape checks that a datatype property receives a temporal value: date, dateTime, gYear or gYearMonth literal" ; + rdfs:label "Date time date disjunction" ; + sh:message "The values must be data typed as either xsd:date, xsd:dateTime, xsd:gYear or xsd:gYearMonth" ; + sh:or ([ + sh:datatype xsd:date + ] + [ + sh:datatype xsd:dateTime + ] + [ + sh:datatype xsd:gYear + ] + [ + sh:datatype xsd:gYearMonth + ] + ) . + +:DcatResource_Shape + a sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset and DataService" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset or a DataService" ; + sh:or ([ + sh:class dcat:Catalog + ] + [ + sh:class dcat:Dataset + ] + [ + sh:class dcat:DataService + ] + [ + sh:class dcat:DatasetSeries + ] + ) . + +:Distribution_Shape + a sh:NodeShape ; + rdfs:label "Distribution"@en ; + sh:property [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:accessService ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dcat:accessURL ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcatap:applicableLegislation; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcatap:availability ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:byteSize ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path spdx:checksum ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:compressFormat ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dcat:downloadURL ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path odrl:hasPolicy ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:mediaType ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:modified ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:packageFormat ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:spatialResolutionInMeters ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path adms:status ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:duration ; + sh:maxCount 1 ; + sh:path dcat:temporalResolution ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution . + +:Identifier_Shape + a sh:NodeShape ; + rdfs:label "Identifier"@en ; + sh:property [ + sh:maxCount 1 ; + sh:path skos:notation ; + sh:severity sh:Violation + ] ; + sh:targetClass adms:Identifier . + +:LicenceDocument_Shape + a sh:NodeShape ; + rdfs:label "Licence Document"@en ; + sh:property [ + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:LicenseDocument . + +:Location_Shape + a sh:NodeShape ; + rdfs:label "Location"@en ; + sh:property [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:bbox ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:centroid ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path lcon:geometry ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:Location . + +:PeriodOfTime_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime"@en ; + sh:property [ + sh:maxCount 1 ; + sh:path dcat:endDate ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:maxCount 1 ; + sh:path time:hasBeginning ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path time:hasEnd ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dcat:startDate ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ] ; + sh:targetClass dct:PeriodOfTime . + +:Relationship_Shape + a sh:NodeShape ; + rdfs:label "Relationship"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:relation ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:path dcat:hadRole ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Relationship . + +:DatasetSeries_Shape + a sh:NodeShape ; + rdfs:label "Dataset Series"@en ; + sh:property [ + sh:minCount 1; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path [ sh:inversePath dcat:inSeries; ]; + sh:severity sh:Warning + ], [ + sh:nodeKind sh:IRI; + sh:path dcatap:applicableLegislation; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dcat:contactPoint; + sh:severity sh:Violation + ], [ + sh:minCount 1; + sh:nodeKind sh:Literal; + sh:path dct:description; + sh:severity sh:Violation + ], [ + sh:maxCount 1; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:accrualPeriodicity; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:spatial; + sh:severity sh:Violation + ], [ + sh:node :DateOrDateTimeDataType_Shape ; + sh:maxCount 1; + sh:nodeKind sh:Literal; + sh:path dct:modified; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:node :DateOrDateTimeDataType_Shape ; + sh:maxCount 1; + sh:nodeKind sh:Literal; + sh:path dct:issued; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:temporal; + sh:severity sh:Violation + ], [ + sh:minCount 1; + sh:nodeKind sh:Literal; + sh:path dct:title; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DatasetSeries . diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/shapes_recommended.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/shapes_recommended.ttl new file mode 100644 index 000000000000..07f55954f3a4 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.0/shapes_recommended.ttl @@ -0,0 +1,337 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + dcat:accessURL ; + dcat:downloadURL ; + dcatap:availability ; + dct:format ; + dct:conformsTo ; + dct:creator [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Bert Van Nuffelen" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Natasa Sofou" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Eugeniu Costetchi" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Makx Dekkers" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Nikolaos Loutas" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Vassilios Peristeras" + ] ; + dct:license ; + cc:attributionURL ; + dct:modified "2021-12-01"^^xsd:date ; + dct:publisher ; + dct:relation ; + dct:description "This document specifies the constraints on properties and classes expressed by DCAT-AP in SHACL."@en ; + dct:title "The constraints of DCAT Application Profile for Data Portals in Europe"@en ; + owl:versionInfo "2.1.1" ; + foaf:homepage ; + foaf:maker [ + foaf:mbox ; + foaf:name "DCAT-AP Working Group" ; + foaf:page , + ] . + + + +#------------------------------------------------------------------------- +# The shapes in this file cover all recommendations in DCAT-AP 2.1.1. +# +# +#------------------------------------------------------------------------- + +:Agent_Shape + a sh:NodeShape ; + rdfs:label "Agent"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:type ; + sh:severity sh:Warning + ] ; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + rdfs:label "Catalog Record"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:conformsTo ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:issued ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path adms:status ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:CatalogRecord . + + +:Catalog_Shape + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:language ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:issued ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:license; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:spatial ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:modified ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:themeTaxonomy ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path foaf:homepage ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Catalog . + +:Catalog_Shape2 + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:or ( + [ + sh:path dcat:dataset ; + sh:minCount 1 ; + ] + [ + sh:path dcat:service ; + sh:minCount 1 ; + ] + ) ; + sh:severity sh:Warning; + sh:targetClass dcat:Catalog . + +:DataService_Shape + a sh:NodeShape ; + rdfs:label "Data Service"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:servesDataset ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:endpointDescription ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:contactPoint ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:theme ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:conformsTo ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:keyword ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:DataService . + +:Dataset_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:contactPoint ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:distribution ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:keyword ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:spatial ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:temporal ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:theme ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Dataset . + +:DatasetSeries_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:contactPoint ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:DatasetSeries . + +:DateOrDateTimeDataType_Shape + a sh:NodeShape ; + rdfs:comment "Date time date disjunction shape checks that a datatype property receives a date or a dateTime literal" ; + rdfs:label "Date time date disjunction" ; + sh:message "The values must be data typed as either xsd:date or xsd:dateTime" ; + sh:or ([ + sh:datatype xsd:date + ] + [ + sh:datatype xsd:dateTime + ] + ) . + +:DcatResource_Shape + a sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset and DataService" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset or a DataService" ; + sh:or ([ + sh:class dcat:Catalog + ] + [ + sh:class dcat:Dataset + ] + [ + sh:class dcat:DataService + ] + [ + sh:class dcat:DatasetSeries + ] + ) . + +:Distribution_Shape + a sh:NodeShape ; + rdfs:label "Distribution"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:description ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcatap:availability ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:format ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:license ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Distribution . + +:LicenceDocument_Shape + a sh:NodeShape ; + rdfs:label "Licence Document"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:type ; + sh:severity sh:Warning + ] ; + sh:targetClass dct:LicenseDocument . + +:Location_Shape + a sh:NodeShape ; + rdfs:label "Location"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:bbox ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:centroid ; + sh:severity sh:Warning + ] ; + sh:targetClass dct:Location . + +:PeriodOfTime_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:endDate ; + sh:severity sh:Warning ; + ], [ + sh:minCount 1 ; + sh:path dcat:startDate ; + sh:severity sh:Warning ; + ] ; + sh:targetClass dct:PeriodOfTime . + + diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/README.md b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/README.md new file mode 100644 index 000000000000..fea202001d98 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/README.md @@ -0,0 +1 @@ +SHACL from https://semiceu.github.io/DCAT-AP/releases/3.0.1/#validation-of-dcat-ap diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/imports.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/imports.ttl new file mode 100644 index 000000000000..01fcbf75e2ed --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/imports.ttl @@ -0,0 +1,36 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + +# +# This file provides the imports that are implicitly the result of reusing them in the DCAT-AP application profile. +# The imports point to the URL of the RDF serializations (mostly the turtle serializations) as not all ontology URIs have content negotation implemented. +# The RDF format is required for the ISA testbed validator. +# The following imports have been outcommented: +# owl:imports ; import is excluded because the shacl shape for Category applies to all instances of skos:Concept and the skos:Concepts in the ODRL do not comply to this. + + + rdf:type owl:Ontology ; + owl:imports ; + owl:imports ; + + ## LegalResource > Work > F1_Work + # owl:imports ; + # owl:imports ; + + # owl:imports ; + # owl:imports ; + # owl:imports ; + # owl:imports ; + + # Loaded imported shapes: https://schema.org/version/latest/schema.ttl + #ERROR [geonetwork] - 404 - Not Found + #org.apache.jena.atlas.web.HttpException: 404 - Not Found + # owl:imports ; + + # owl:imports ; + # owl:imports ; + # owl:imports +. + diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/mdr-vocabularies.shape.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/mdr-vocabularies.shape.ttl new file mode 100644 index 000000000000..35e58739fa96 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/mdr-vocabularies.shape.ttl @@ -0,0 +1,490 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + + dcat:accessURL ; + dcat:downloadURL ; + dcatap:availability ; + dct:format ; + dct:conformsTo ; + dct:creator [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Bert Van Nuffelen" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Natasa Sofou" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Eugeniu Costetchi" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Makx Dekkers" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Nikolaos Loutas" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Vassilios Peristeras" + ] ; + dct:license ; + cc:attributionURL ; + dct:modified "2021-12-01"^^xsd:date ; + dct:publisher ; + dct:relation ; + dct:description "This document specifies the controlled vocabulary constraints on properties expressed by DCAT-AP in SHACL."@en ; + dct:title "Controlled Vocabulary Constraints of DCAT Application Profile for Data Portals in Europe"@en ; + owl:versionInfo "2.1.1" ; + foaf:homepage ; + foaf:maker [ + foaf:mbox ; + foaf:name "DCAT-AP Working Group" ; + foaf:page , + ] . + +:AvailabilityRestriction + a sh:NodeShape ; + rdfs:comment "Availability restriction" ; + rdfs:label "Availability restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:ContinentRestriction + a sh:NodeShape ; + rdfs:comment "Continent restriction" ; + rdfs:label "Continent restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:CorporateBodyRestriction + a sh:NodeShape ; + rdfs:comment "Corporate Body Restriction" ; + rdfs:label "Corporate Body Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:CountryRestriction + a sh:NodeShape ; + rdfs:comment "Country restriction" ; + rdfs:label "Country restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:DataThemeRestriction + a sh:NodeShape ; + rdfs:comment "Data Theme Restriction" ; + rdfs:label "Data Theme Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:AccessRightRestriction + a sh:NodeShape ; + rdfs:comment "Access Rights Restriction" ; + rdfs:label "Data Theme Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:DatasetTypeRestriction + a sh:NodeShape ; + rdfs:comment "Dataset Type Restriction" ; + rdfs:label "Dataset Type Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + + +:FileTypeRestriction + a sh:NodeShape ; + rdfs:comment "File Type Restriction" ; + rdfs:label "File Type Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:FrequencyRestriction + a sh:NodeShape ; + rdfs:comment "Frequency Restriction" ; + rdfs:label "Frequency Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:GeoNamesRestrictionRegexURI + rdfs:comment "Geonames restriction - base itself on URI structure" ; + rdfs:label "Geonames restriction" ; + a sh:NodeShape ; + sh:pattern "^https://sws.geonames.org" . + + +:LanguageRestriction + a sh:NodeShape ; + rdfs:comment "Language Restriction" ; + rdfs:label "Language Restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:LicenceTypeRestriction + a sh:NodeShape ; + rdfs:comment "Licence type restriction" ; + rdfs:label "Licence type restriction" ; + sh:property [ + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:PlaceRestriction + a sh:NodeShape ; + rdfs:comment "Place restriction" ; + rdfs:label "Place restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:PublisherTypeRestriction + a sh:NodeShape ; + rdfs:comment "Publisher type restriction" ; + rdfs:label "Publisher type restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:IANARestrictionRegexURI + rdfs:comment "IANA restriction - base itself on URL structure" ; + rdfs:label "IANA restriction" ; + a sh:NodeShape ; + sh:pattern "^http.*://www.iana.org/assignments/media-types/" . + +:StatusRestriction + a sh:NodeShape ; + rdfs:comment "Status restriction" ; + rdfs:label "Status restriction" ; + sh:property [ + sh:class skos:ConceptScheme ; + sh:hasValue ; + sh:minCount 1 ; + sh:nodeKind sh:IRI ; + sh:path skos:inScheme + ] . + +:ChecksumAlgorithmRestriction + a sh:NodeShape ; + rdfs:comment "Checksum algorithm restriction" ; + rdfs:label "Checksum algorithm restriction" ; + sh:pattern "^https://spdx.org/rdf/terms" ; + sh:class . + +:Checksum_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :ChecksumAlgorithmRestriction ; + sh:nodeKind sh:IRI ; + sh:path spdx:algorithm + ] ; + sh:targetClass spdx:Checksum. + +:LicenseDocument_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :LicenceTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:type + ] ; + sh:targetClass dct:LicenseDocument. + + + +:Catalog_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :LanguageRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:language ; + sh:description "A non EU managed concept is used to indicate a language. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ], [ + sh:node :CorporateBodyRestriction ; + sh:node :Publisher_ShapeCV ; + sh:nodeKind sh:IRI ; + sh:path dct:publisher ; + sh:description "A non EU managed concept is used to indicate the publisher, check if a corresponding exists in the EU corporates bodies NAL" ; + sh:severity sh:Warning + ], [ + sh:node [ + a sh:NodeShape ; + sh:or (:CountryRestriction + :PlaceRestriction + :ContinentRestriction + :GeoNamesRestrictionRegexURI + ) + ] ; + sh:nodeKind sh:IRI ; + sh:path dct:spatial ; + sh:description "A non managed concept is used to indicate a spatial description, check if a corresponding exists" ; + sh:severity sh:Warning + ], [ + sh:hasValue ; + sh:nodeKind sh:IRI ; + sh:path dcat:themeTaxonomy ; + sh:description "Multiple themes can be used but at least should be present" ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Catalog. + +:Dataset_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :FrequencyRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accrualPeriodicity ; + sh:description "A non EU managed concept is used to indicate the accrualPeriodicity frequency. If no corresponding can be found inform the maintainer of the EU frequency NAL" ; + sh:severity sh:Violation + ], [ + sh:node :LanguageRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:language ; + sh:description "A non EU managed concept is used to indicate a language. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ], [ + sh:node :CorporateBodyRestriction ; + sh:node :Publisher_ShapeCV ; + sh:nodeKind sh:IRI ; + sh:path dct:publisher ; + sh:description "A non EU managed concept is used to indicate the publisher, check if a corresponding exists in the EU corporates bodies NAL" ; + sh:severity sh:Warning + ], [ + sh:node [ + a sh:NodeShape ; + sh:or (:CountryRestriction + :PlaceRestriction + :ContinentRestriction + :GeoNamesRestrictionRegexURI + ) + ] ; + sh:nodeKind sh:IRI ; + sh:path dct:spatial ; + sh:description "A non managed concept is used to indicate a spatial description, check if a corresponding exists" ; + sh:severity sh:Warning + ], [ + sh:node :DataThemeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:description "Multiple themes can be used but at least one concept of should be present" ; + sh:severity sh:Warning + ], [ + sh:node :DatasetTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:type ; + sh:description "Multiple types can be used but it is recommended to also provide at least one concept of should be present" ; + sh:severity sh:Warning + ], [ + sh:node :AccessRightRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accessRights ; + sh:description "A non EU managed concept is used to indicate the access right. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Dataset. + +:DatasetSeries_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :FrequencyRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accrualPeriodicity ; + sh:description "A non EU managed concept is used to indicate the accrualPeriodicity frequency. If no corresponding can be found inform the maintainer of the EU frequency NAL" ; + sh:severity sh:Violation + ], [ + sh:node :CorporateBodyRestriction ; + sh:node :Publisher_ShapeCV ; + sh:nodeKind sh:IRI ; + sh:path dct:publisher ; + sh:description "A non EU managed concept is used to indicate the publisher, check if a corresponding exists in the EU corporates bodies NAL" ; + sh:severity sh:Warning + ], [ + sh:node [ + a sh:NodeShape ; + sh:or (:CountryRestriction + :PlaceRestriction + :ContinentRestriction + :GeoNamesRestrictionRegexURI + ) + ] ; + sh:nodeKind sh:IRI ; + sh:path dct:spatial ; + sh:description "A non managed concept is used to indicate a spatial description, check if a corresponding exists" ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:DatasetSeries. + +# ------------------------------------------------------------------------------------------------------------------ +# The constraints for dcat:mediaType, dcat:compressFormat, dcat:packageFormat which are limited to the IANA codelist +# cannot be expressed in SHACL unless a copy in RDF for the IANA codelist is being created. +# A less formal check is provided based upon the assumption that the IANIA codelist is hosted on a known URL domain. +# This check is sensitive to the publication strategy of IANA. +# ------------------------------------------------------------------------------------------------------------------ +:Distribution_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :FileTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:format ; + sh:description "A non EU managed concept is used to indicate the format of the distribution. If no corresponding can be found inform the maintainer of the fileformat NAL." ; + sh:severity sh:Violation + ], [ + sh:node :LanguageRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:language ; + sh:description "A non EU managed concept is used to indicate a language. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Violation + ], [ + sh:node :StatusRestriction ; + sh:nodeKind sh:IRI ; + sh:path adms:status ; + sh:description "A non EU managed concept is used to indicate the status of the distribution. If no corresponding can be found inform the maintainer of the adms:status codelist." ; + sh:severity sh:Violation + ], [ + sh:node :AvailabilityRestriction ; + sh:nodeKind sh:IRI ; + sh:path dcatap:availability ; + sh:description "A non EU managed concept is used to indicate the availability of the distribution. If no corresponding can be found inform the maintainer of the DCAT-AP availability codelist." ; + sh:severity sh:Violation + ], [ + sh:node :IANARestrictionRegexURI; + sh:nodeKind sh:IRI ; + sh:path dcat:mediaType ; + sh:description "A mediaType expects a value from IANA. This check uses the URLs from IANA to perform the check as there is no IANA codelist downloadable." ; + sh:severity sh:Violation + ], [ + sh:node :IANARestrictionRegexURI; + sh:nodeKind sh:IRI ; + sh:path dcat:compressFormat ; + sh:description "A compressFormat expects a value from IANA. This check uses the URLs from IANA to perform the check as there is no IANA codelist downloadable." ; + sh:severity sh:Violation + ], [ + sh:node :IANARestrictionRegexURI; + sh:nodeKind sh:IRI ; + sh:path dcat:packageFormat ; + sh:description "A packageFormat expects a value from IANA. This check uses the URLs from IANA to perform the check as there is no IANA codelist downloadable." ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution. + +:DataService_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :FileTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:format ; + sh:description "A non EU managed concept is used to indicate the format the data service supports. If no corresponding can be found inform the maintainer of the fileformat NAL." ; + sh:severity sh:Violation + ], [ + sh:node :DataThemeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:description "Multiple themes can be used but at least one concept of should be present" ; + sh:severity sh:Warning + ], [ + sh:node :CorporateBodyRestriction ; + sh:node :Publisher_ShapeCV ; + sh:nodeKind sh:IRI ; + sh:path dct:publisher ; + sh:description "A non EU managed concept is used to indicate the publisher, check if a corresponding exists in the EU corporates bodies NAL" ; + sh:severity sh:Warning + ], [ + sh:node :AccessRightRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:accessRights ; + sh:description "A non EU managed concept is used to indicate the access right. If no corresponding can be found inform the maintainer of the EU language NAL" ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:DataService. + + +:Publisher_ShapeCV + a sh:NodeShape ; + sh:property [ + sh:node :PublisherTypeRestriction ; + sh:nodeKind sh:IRI ; + sh:path dct:type ; + sh:description "A non EU managed concept is used to indicate the type of the publisher. If no corresponding can be found inform the maintainer of the adms:publishertype codelist." ; + sh:severity sh:Violation + ] . diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/mdr_imports.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/mdr_imports.ttl new file mode 100644 index 000000000000..f0095518bad3 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/mdr_imports.ttl @@ -0,0 +1,29 @@ +@prefix owl: . +@prefix rdf: . +@prefix rdfs: . +@prefix xsd: . + +# +# This file provides the imports of the codelists recommended by the DCAT-AP application profile. +# http://publications.europa.eu/resource/authority/dataset-type (TODO) + + + + rdf:type owl:Ontology ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports ; + owl:imports +. + +# import of the checksum vocabulary +# owl:imports ; diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/range.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/range.ttl new file mode 100644 index 000000000000..78af09bb6c27 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/range.ttl @@ -0,0 +1,449 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + dct:description "This file contains the class range constraints for all properties in DCAT-AP"@en. + + + + +#------------------------------------------------------------------------- +# The shapes in this file cover all class range constraints in DCAT-AP +# +# Depending on the exchange agreements these may be necessary to be part +# of the validation process. However they mostly figure in the semantical +# understanding of the ranges. +# +#------------------------------------------------------------------------- + +:Agent_Shape + a sh:NodeShape ; + rdfs:label "Agent"@en ; + sh:property [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + rdfs:label "Catalog Record"@en ; + sh:property [ + sh:node :DcatResource_Shape ; + sh:path foaf:primaryTopic ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path adms:status ; + sh:severity sh:Violation + ], [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:class dcat:CatalogRecord ; + sh:path dct:source ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:CatalogRecord . + +:Catalog_Shape + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:property [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class dct:LicenseDocument ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:class dct:Location ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:class dcat:Catalog ; + sh:path dct:hasPart ; + sh:severity sh:Violation + ], [ + sh:class dcat:Catalog ; + sh:path dct:isPartOf ; + sh:severity sh:Violation + ], [ + sh:class dct:RightsStatement ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:class dcat:CatalogRecord ; + sh:path dcat:record ; + sh:severity sh:Violation + ], [ + sh:class skos:ConceptScheme ; + sh:path dcat:themeTaxonomy ; + sh:severity sh:Violation + ], [ + sh:class dcat:DataService ; + sh:path dcat:service ; + sh:severity sh:Violation + ], [ + sh:class dcat:Catalog ; + sh:path dcat:catalog ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dcat:dataset ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path foaf:homepage ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Catalog . + + +:DataService_Shape + a sh:NodeShape ; + rdfs:label "Data Service"@en ; + sh:property [ + sh:class dct:RightsStatement ; + sh:path dct:accessRights ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class vcard:Kind ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaTypeOrExtent ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:class dct:LicenseDocument ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:path dct:publisher ; + sh:class foaf:Agent; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dcat:servesDataset ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dcat:theme ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DataService . + + +:Dataset_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:class dct:RightsStatement ; + sh:path dct:accessRights ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class vcard:Kind ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:class dcat:Distribution ; + sh:path dcat:distribution ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:path dct:accrualPeriodicity; + sh:class dct:Frequency; + sh:severity sh:Violation + ], [ + sh:class dct:Location ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dct:hasVersion ; + sh:severity sh:Violation + ], [ + sh:class dcat:DatasetSeries ; + sh:path dcat:inSeries ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:class adms:Identifier ; + sh:path adms:identifier ; + sh:severity sh:Violation + ], [ + sh:class dct:ProvenanceStatement ; + sh:path dct:provenance ; + sh:severity sh:Violation + ], [ + sh:class foaf:Agent ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:class prov:Attribution ; + sh:path prov:qualifiedAttribution ; + sh:severity sh:Violation + ], [ + sh:class dcat:Relationship ; + sh:path dcat:qualifiedRelation ; + sh:severity sh:Violation + ], [ + sh:class dcat:Distribution ; + sh:path adms:sample ; + sh:severity sh:Violation + ], [ + sh:class dcat:Dataset ; + sh:path dct:source ; + sh:severity sh:Violation + ], [ + sh:class dct:PeriodOfTime ; + sh:path dct:temporal ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dcat:theme ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:severity sh:Violation + ], [ + sh:class prov:Activity ; + sh:path prov:wasGeneratedBy ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset . + + +:DcatResource_Shape + a sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset, DataService or Dataset Series" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset, DataService or a Dataset Series" ; + sh:or ([ + sh:class dcat:Catalog + ] + [ + sh:class dcat:Dataset + ] + [ + sh:class dcat:DataService + ] + [ + sh:class dcat:DatasetSeries + ] + ) . + +:Distribution_Shape + a sh:NodeShape ; + rdfs:label "Distribution"@en ; + sh:property [ + sh:class dcat:DataService ; + sh:path dcat:accessService ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path dcatap:availability ; + sh:severity sh:Violation + ], [ + sh:class spdx:Checksum ; + sh:path spdx:checksum ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaType ; + sh:path dcat:compressFormat ; + sh:severity sh:Violation + ], [ + sh:class foaf:Document ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaTypeOrExtent ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:class odrl:Policy ; + sh:path odrl:hasPolicy ; + sh:severity sh:Violation + ], [ + sh:class dct:LinguisticSystem ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:class dct:LicenseDocument ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:class dct:Standard ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaType ; + sh:path dcat:mediaType ; + sh:severity sh:Violation + ], [ + sh:class dct:MediaType ; + sh:path dcat:packageFormat ; + sh:severity sh:Violation + ], [ + sh:class dct:RightsStatement ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:class skos:Concept ; + sh:path adms:status ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution . + + +:LicenceDocument_Shape + a sh:NodeShape ; + rdfs:label "Licence Document"@en ; + sh:property [ + sh:class skos:Concept ; + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:LicenseDocument . + + +:PeriodOfTime_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime"@en ; + sh:property [ + sh:class time:Instant ; + sh:path time:hasBeginning ; + sh:severity sh:Violation + ], [ + sh:class time:Instant ; + sh:path time:hasEnd ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:PeriodOfTime . + +:Relationship_Shape + a sh:NodeShape ; + rdfs:label "Relationship"@en ; + sh:property [ + sh:node :DcatResource_Shape ; + sh:path dct:relation ; + sh:severity sh:Violation + ], [ + sh:class dcat:Role ; + sh:path dcat:hadRole ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Relationship . + +:DatasetSeries_Shape + a sh:NodeShape ; + rdfs:label "Dataset Series"@en ; + sh:property [ + sh:class dcat:Dataset ; + sh:path [ sh:inversePath dcat:inSeries; ]; + sh:severity sh:Warning + ], [ + sh:path dcatap:applicableLegislation; + sh:class ; + sh:severity sh:Violation + ], [ + sh:path dcat:contactPoint; + sh:class vcard:Kind; + sh:severity sh:Violation + ], [ + sh:path dct:accrualPeriodicity; + sh:class dct:Frequency; + sh:severity sh:Violation + ], [ + sh:path dct:spatial; + sh:class dct:Location; + sh:severity sh:Violation + ], [ + sh:path dct:publisher ; + sh:class foaf:Agent; + sh:severity sh:Violation + ], [ + sh:path dct:temporal; + sh:class dct:PeriodOfTime; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DatasetSeries . diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/shapes.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/shapes.ttl new file mode 100644 index 000000000000..a280ef8f1c78 --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/shapes.ttl @@ -0,0 +1,746 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + dct:format ; + dct:conformsTo ; + dct:description "This files specifies the core constraints on properties and classes expressed by DCAT-AP in SHACL."@en. + + + +#------------------------------------------------------------------------- +# The shapes in this file cover all classes in DCAT-AP 3.0.0 +# It covers all constraints that must be satisfied except those verifying +# the class ranges. This can be found in a separate file. +# +#------------------------------------------------------------------------- + +:Agent_Shape + a sh:NodeShape ; + rdfs:label "Agent"@en ; + sh:property [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path foaf:name ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + rdfs:label "Catalog Record"@en ; + sh:property [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:node :DcatResource_Shape ; + sh:path foaf:primaryTopic ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path dct:modified ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:maxCount 1 ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path adms:status ; + sh:severity sh:Violation + ], [ + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:source ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:CatalogRecord . + +:Catalog_Shape + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:property [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:nodeKind sh:IRI; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:hasPart ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:modified ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:record ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:themeTaxonomy ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:service ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:catalog ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:dataset ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path foaf:homepage ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Catalog . + +:CategoryScheme_Shape + a sh:NodeShape ; + rdfs:label "Category Scheme"@en ; + sh:property [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ] ; + sh:targetClass skos:ConceptScheme . + +:Category_Shape + a sh:NodeShape ; + rdfs:label "Category"@en ; + sh:property [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path skos:prefLabel ; + sh:severity sh:Violation + ] ; + sh:targetClass skos:Concept . + +:Checksum_Shape + a sh:NodeShape ; + rdfs:label "Checksum"@en ; + sh:property [ + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path spdx:algorithm ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:hexBinary ; + sh:maxCount 1 ; + sh:minCount 1 ; + sh:path spdx:checksumValue ; + sh:severity sh:Violation + ] ; + sh:targetClass spdx:Checksum . + +:DataService_Shape + a sh:NodeShape ; + rdfs:label "Data Service"@en ; + sh:property [ + sh:maxCount 1 ; + sh:path dct:accessRights ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:severity sh:Violation + ], [ + sh:path dcatap:applicableLegislation; + sh:nodeKind sh:IRI; + sh:severity sh:Violation + ], [ + sh:path dct:conformsTo ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:endpointURL ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:endpointDescription ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dcat:keyword ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:servesDataset ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DataService . + +:Dataset_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:accessRights ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcatap:applicableLegislation; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:contactPoint ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:creator ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:distribution ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:accrualPeriodicity; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:spatial ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:hasVersion ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:identifier ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:inSeries ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:isReferencedBy ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dcat:keyword ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:landingPage ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:modified ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path adms:identifier ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:provenance ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:maxCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path prov:qualifiedAttribution ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:qualifiedRelation ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:relation ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dct:issued ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path adms:sample ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:source ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:spatialResolutionInMeters ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:temporal ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:duration ; + sh:maxCount 1 ; + sh:path dcat:temporalResolution ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcat:theme ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:type ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:version ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path adms:versionNotes ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path prov:wasGeneratedBy ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Dataset . + +:DateOrDateTimeDataType_Shape + a sh:NodeShape ; + rdfs:comment "Date time date disjunction shape checks that a datatype property receives a temporal value: date, dateTime, gYear or gYearMonth literal" ; + rdfs:label "Date time date disjunction" ; + sh:message "The values must be data typed as either xsd:date, xsd:dateTime, xsd:gYear or xsd:gYearMonth" ; + sh:or ([ + sh:datatype xsd:date + ] + [ + sh:datatype xsd:dateTime + ] + [ + sh:datatype xsd:gYear + ] + [ + sh:datatype xsd:gYearMonth + ] + ) . + +:DcatResource_Shape + a sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset and DataService" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset or a DataService" ; + sh:or ([ + sh:class dcat:Catalog + ] + [ + sh:class dcat:Dataset + ] + [ + sh:class dcat:DataService + ] + [ + sh:class dcat:DatasetSeries + ] + ) . + +:Distribution_Shape + a sh:NodeShape ; + rdfs:label "Distribution"@en ; + sh:property [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:accessService ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dcat:accessURL ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:IRI ; + sh:path dcatap:applicableLegislation; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcatap:availability ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:nonNegativeInteger ; + sh:maxCount 1 ; + sh:path dcat:byteSize ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path spdx:checksum ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:compressFormat ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:description ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path foaf:page ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dcat:downloadURL ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:format ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path odrl:hasPolicy ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:language ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:license ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:conformsTo ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:mediaType ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:modified ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dcat:packageFormat ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:node :DateOrDateTimeDataType_Shape ; + sh:path dct:issued ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path dct:rights ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:decimal ; + sh:maxCount 1 ; + sh:path dcat:spatialResolutionInMeters ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI ; + sh:path adms:status ; + sh:severity sh:Violation + ], [ + sh:datatype xsd:duration ; + sh:maxCount 1 ; + sh:path dcat:temporalResolution ; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:Literal ; + sh:path dct:title ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Distribution . + +:Identifier_Shape + a sh:NodeShape ; + rdfs:label "Identifier"@en ; + sh:property [ + sh:maxCount 1 ; + sh:path skos:notation ; + sh:severity sh:Violation + ] ; + sh:targetClass adms:Identifier . + +:LicenceDocument_Shape + a sh:NodeShape ; + rdfs:label "Licence Document"@en ; + sh:property [ + sh:path dct:type ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:LicenseDocument . + +:Location_Shape + a sh:NodeShape ; + rdfs:label "Location"@en ; + sh:property [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:bbox ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path dcat:centroid ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:Literal ; + sh:path lcon:geometry ; + sh:severity sh:Violation + ] ; + sh:targetClass dct:Location . + +:PeriodOfTime_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime"@en ; + sh:property [ + sh:maxCount 1 ; + sh:path dcat:endDate ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ], [ + sh:maxCount 1 ; + sh:path time:hasBeginning ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path time:hasEnd ; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:path dcat:startDate ; + sh:severity sh:Violation ; + sh:shape :DateOrDateTimeDataType_Shape + ] ; + sh:targetClass dct:PeriodOfTime . + +:Relationship_Shape + a sh:NodeShape ; + rdfs:label "Relationship"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:relation ; + sh:severity sh:Violation + ], [ + sh:minCount 1 ; + sh:path dcat:hadRole ; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:Relationship . + +:DatasetSeries_Shape + a sh:NodeShape ; + rdfs:label "Dataset Series"@en ; + sh:property [ + sh:minCount 1; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path [ sh:inversePath dcat:inSeries; ]; + sh:severity sh:Warning + ], [ + sh:nodeKind sh:IRI; + sh:path dcatap:applicableLegislation; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dcat:contactPoint; + sh:severity sh:Violation + ], [ + sh:minCount 1; + sh:nodeKind sh:Literal; + sh:path dct:description; + sh:severity sh:Violation + ], [ + sh:maxCount 1; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:accrualPeriodicity; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:spatial; + sh:severity sh:Violation + ], [ + sh:node :DateOrDateTimeDataType_Shape ; + sh:maxCount 1; + sh:nodeKind sh:Literal; + sh:path dct:modified; + sh:severity sh:Violation + ], [ + sh:maxCount 1 ; + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:publisher ; + sh:severity sh:Violation + ], [ + sh:node :DateOrDateTimeDataType_Shape ; + sh:maxCount 1; + sh:nodeKind sh:Literal; + sh:path dct:issued; + sh:severity sh:Violation + ], [ + sh:nodeKind sh:BlankNodeOrIRI; + sh:path dct:temporal; + sh:severity sh:Violation + ], [ + sh:minCount 1; + sh:nodeKind sh:Literal; + sh:path dct:title; + sh:severity sh:Violation + ] ; + sh:targetClass dcat:DatasetSeries . diff --git a/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/shapes_recommended.ttl b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/shapes_recommended.ttl new file mode 100644 index 000000000000..bddfae11c03d --- /dev/null +++ b/web/src/main/webapp/WEB-INF/data/config/shacl/eu-dcat-ap-3.0.1/shapes_recommended.ttl @@ -0,0 +1,336 @@ +@prefix rdf: . +@prefix : . +@prefix adms: . +@prefix cc: . +@prefix dc: . +@prefix dcat: . +@prefix dct: . +@prefix foaf: . +@prefix lcon: . +@prefix org: . +@prefix owl: . +@prefix odrl: . +@prefix prov: . +@prefix rdfs: . +@prefix schema: . +@prefix sh: . +@prefix skos: . +@prefix spdx: . +@prefix time: . +@prefix vcard: . +@prefix xsd: . +@prefix dcatap: . + + + dcat:accessURL ; + dcat:downloadURL ; + dcatap:availability ; + dct:format ; + dct:conformsTo ; + dct:creator [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Bert Van Nuffelen" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Natasa Sofou" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Eugeniu Costetchi" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Makx Dekkers" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Nikolaos Loutas" + ], [ + rdfs:seeAlso ; + org:memberOf ; + foaf:homepage ; + foaf:name "Vassilios Peristeras" + ] ; + dct:license ; + cc:attributionURL ; + dct:modified "2021-12-01"^^xsd:date ; + dct:publisher ; + dct:relation ; + dct:description "This document specifies the constraints on properties and classes expressed by DCAT-AP in SHACL."@en ; + dct:title "The constraints of DCAT Application Profile for Data Portals in Europe"@en ; + owl:versionInfo "2.1.1" ; + foaf:homepage ; + foaf:maker [ + foaf:mbox ; + foaf:name "DCAT-AP Working Group" ; + foaf:page , + ] . + + + +#------------------------------------------------------------------------- +# The shapes in this file cover all recommendations in DCAT-AP 2.1.1. +# +# +#------------------------------------------------------------------------- + +:Agent_Shape + a sh:NodeShape ; + rdfs:label "Agent"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:type ; + sh:severity sh:Warning + ] ; + sh:targetClass foaf:Agent . + +:CatalogRecord_Shape + a sh:NodeShape ; + rdfs:label "Catalog Record"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:conformsTo ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:issued ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path adms:status ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:CatalogRecord . + + +:Catalog_Shape + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:language ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:issued ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:license; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:spatial ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:modified ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:themeTaxonomy ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path foaf:homepage ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Catalog . + +:Catalog_Shape2 + a sh:NodeShape ; + rdfs:label "Catalog"@en ; + sh:or ( + [ + sh:path dcat:dataset ; + sh:minCount 1 ; + ] + [ + sh:path dcat:service ; + sh:minCount 1 ; + ] + ) ; + sh:severity sh:Warning; + sh:targetClass dcat:Catalog . + +:DataService_Shape + a sh:NodeShape ; + rdfs:label "Data Service"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:servesDataset ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:endpointDescription ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:contactPoint ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:theme ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:conformsTo ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:keyword ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:DataService . + +:Dataset_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:contactPoint ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:distribution ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:keyword ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:spatial ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:temporal ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:theme ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Dataset . + +:DatasetSeries_Shape + a sh:NodeShape ; + rdfs:label "Dataset"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:contactPoint ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:publisher ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:DatasetSeries . + +:DateOrDateTimeDataType_Shape + a sh:NodeShape ; + rdfs:comment "Date time date disjunction shape checks that a datatype property receives a date or a dateTime literal" ; + rdfs:label "Date time date disjunction" ; + sh:message "The values must be data typed as either xsd:date or xsd:dateTime" ; + sh:or ([ + sh:datatype xsd:date + ] + [ + sh:datatype xsd:dateTime + ] + ) . + +:DcatResource_Shape + a sh:NodeShape ; + rdfs:comment "the union of Catalog, Dataset and DataService" ; + rdfs:label "dcat:Resource" ; + sh:message "The node is either a Catalog, Dataset or a DataService" ; + sh:or ([ + sh:class dcat:Catalog + ] + [ + sh:class dcat:Dataset + ] + [ + sh:class dcat:DataService + ] + [ + sh:class dcat:DatasetSeries + ] + ) . + +:Distribution_Shape + a sh:NodeShape ; + rdfs:label "Distribution"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:description ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcatap:availability ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:format ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dct:license ; + sh:severity sh:Warning + ] ; + sh:targetClass dcat:Distribution . + +:LicenceDocument_Shape + a sh:NodeShape ; + rdfs:label "Licence Document"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dct:type ; + sh:severity sh:Warning + ] ; + sh:targetClass dct:LicenseDocument . + +:Location_Shape + a sh:NodeShape ; + rdfs:label "Location"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:bbox ; + sh:severity sh:Warning + ], [ + sh:minCount 1 ; + sh:path dcat:centroid ; + sh:severity sh:Warning + ] ; + sh:targetClass dct:Location . + +:PeriodOfTime_Shape + a sh:NodeShape ; + rdfs:label "PeriodOfTime"@en ; + sh:property [ + sh:minCount 1 ; + sh:path dcat:endDate ; + sh:severity sh:Warning ; + ], [ + sh:minCount 1 ; + sh:path dcat:startDate ; + sh:severity sh:Warning ; + ] ; + sh:targetClass dct:PeriodOfTime . +