SHACL uses shapes - not RDFS range and domain
"rdfs:range iirds:Component ;" means the range
"is of that class" not that there must be that triple because RDFS can
be used to infer the fact and add it to the data.
See the SHACL spec : https://www.w3.org/TR/shacl/
which has lots of examples of shapes.
In this case:
In schema.ttl:
------------
PREFIX iirds: <http://iirds.tekom.de/iirds#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX sh: <http://www.w3.org/ns/shacl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX : <http://example/>
:shape1 sh:targetObjectsOf iirds:has-component ;
sh:class iirds:Component ;
.
------------
and you'll get a violation
Add the expected triple to metadata.ttl:
----
<http://iirds.docufy.de/topics/05d2c8268b68ff6444a49358ca7fe925/1/de-de>
rdf:type iirds:Component .
----
and the violation goes away.
From the commandline (shell scripts):
Jena SHACL engine:
shacl v -s schema.ttl -d metadata.ttl
or see the instructions on https://github.com/TopQuadrant/shacl for
TopQuadrant TopBraid SHACL API
shaclvalidate -shapesfile schema.ttl -datafile metadata.ttl
Andy
On 01/11/2020 02:11, alexander.fan...@web.de wrote:
Hey guys,
i created an Issue one weeg ago and you recommended me to validate my schema
with jena shacl. I did this, but i still don't get the expected result...
What do i have to change or what mistake did i do ? (i am not allowed to change
the schema by the way).
Maybe you have some example code or another idea how to validate my
metadata.rdf ?
The problem:
As you can see, i have a "topic" containing the property "has-component", but my schema just allows
(rdfs:domain and rdfs:range) a "component" with the property "has-component".
The validation report says in both ways, that everything is confirm......
Thanks for you help:)
Greetings from Germany
Alex
My schema is original an .rdf-schema, but i converted it into .ttl in order to
use shacl-shapes. It looks like the following:
schema.ttl:
@prefix schema: <http://schema.org/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix iirds: <http://iirds.tekom.de/iirds#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
iirds:Topic a rdfs:Class ;
rdfs:comment "A topic is a unit of information covering a single
subject."@en ;
rdfs:label "Topic"@en , "Topic"@de ;
rdfs:subClassOf iirds:InformationUnit ;
iirds:description "IRI: required"@en , "The resource of a topic is a file
in the iiRDS package."@en .
iirds:has-component a rdf:Property ;
rdfs:comment "Relates to a component that is part of another
component."@en , "Verweist auf eine Kompoente, die Teil einer anderen Komponente
ist."@de ;
rdfs:domain iirds:Component ;
rdfs:label "has component"@en , "hat Komponente"@de ;
rdfs:range iirds:Component ;
rdfs:subPropertyOf iirds:iirdsRelationConcept ;
iirds:description "Cardinality: http://iirds.tekom.de/iirds#Component
[0..*]"@en , ""@en ;
schema:domainIncludes iirds:Component ;
schema:rangeIncludes iirds:Component .
iirds:Component a rdfs:Class ;
rdfs:comment "Describes a component of the technical system that the
documentation refers to."@en ;
rdfs:label "Component"@en , "Komponente"@de ;
rdfs:subClassOf iirds:ProductMetadata ;
iirds:description "IRI: required"@en , "Components may have relations to
ot[...] The iirds#Component may also be used as a docking point for external component
definitions."@en .
My metadata.rdf converted into metadata.ttl looks like the following:
metadata.ttl:
@prefix pifan: <http://customer.docufy.de/pifan#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix iirds: <http://iirds.tekom.de/iirds#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
[...]
<http://iirds.docufy.de/topics/05d2c8268b68ff6444a49358ca7fe925/1/de-de>
a iirds:Topic ;
iirds:dateOfCreation "2020-08-06T12:24:07.285+02:00"@de-de ;
iirds:has-component
<http://iirds.docufy.de/metadata/85e7506eb2e33f90c0a802687f559f0c> ;
iirds:relates-to-component
<http://iirds.docufy.de/metadata/85e7506eb2e33f90c0a802687f559f0c> ;
iirds:relates-to-product-feature
<http://iirds.docufy.de/metadata/b63e4b15b2dc2d83c0a8026877f6aa88> ,
<http://iirds.docufy.de/metadata/10b4c299b2ddae19c0a8026824aa7410> ,
<http://iirds.docufy.de/metadata/dbbb7334b2e2a9e5c0a8026860d20c17> ;
iirds:title "Kontaktdaten"@de-de .
[...]
My code is the following:
//try with jena shacl
Graph shapesGraph = RDFDataMgr.loadGraph("schema.ttl");
Graph dataGraph = RDFDataMgr.loadGraph("metadata.ttl");
Shapes shapes = Shapes.parse(shapesGraph);
ValidationReport report = ShaclValidator.get().validate(shapes, dataGraph);
ShLib.printReport(report);
System.out.println();
RDFDataMgr.write(System.out, report.getModel(), Lang.TTL);
//try with topbraid shacl
Model dataModel = org.topbraid.jenax.util.JenaUtil.createDefaultModel();
dataModel.read("metadata.ttl");
Model shapeModel = org.topbraid.jenax.util.JenaUtil.createDefaultModel();
shapeModel.read("schema.ttl");
Resource reportResource = ValidationUtil.validateModel(dataModel, shapeModel,
true);
File reportFile = new File("report.ttl");