- From: Florian Kleedorfer <florian.kleedorfer@austria.fm>
- Date: Fri, 01 Dec 2017 19:36:35 +0100
- To: Holger Knublauch <holger@topquadrant.com>
- Cc: public-rdf-shapes@w3.org
Hi Holger! Part 2 of my answer - see below. > > The definitions in the spec only cover the "negative" cases, i.e. what > target nodes produce errors. The spec furthermore does not prescribe > any algorithm, or whether and how these target nodes even need to be > touched upon. The result vocabulary thus also does not include terms > for positive results. Since this is likely a common use case, we have > defined dash:SuccessResult as a possible term: > > http://datashapes.org/dash.html#SuccessResult > > The algorithm to find these is hopefully straight-forward - just get > the set of target nodes for a shape that doesn't show up in the > violation report. After some experimentation, I came up with this SPARQL query to find the triples 'covered' by the shapes, according to the explanation you gave. In the middle there is a quoted part where I tried to account for target nodes being referenced through property paths (just to show the approach). I eventually decided that such nodes do not become part of the shape, though, because when closing the shape, they are reported as ValidationResults. I think we will go with this query for the time being - unless there is something wrong with it? # Query for extracting data based on a SHACL validation resultPath # # * returns triples that match the shape. Additional triples found # in the data are not returned. # * triples that cause errors (ValidationResults) are not returned prefix dash: <http://datashapes.org/dash#> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> prefix schema: <http://schema.org/> prefix sh: <http://www.w3.org/ns/shacl#> prefix xsd: <http://www.w3.org/2001/XMLSchema#> prefix sh-ext: <http://www.example.org/shacl-ext#> prefix ex: <http://www.example.org/data#> construct { ?node ?prop ?val . } where { ?node ?prop ?val . { select distinct ?target ?shape where { { ?shape sh:targetNode ?target . } union { ?shape sh:targetClass ?class . ?target a ?class . } union { ?class a rdfs:class; a sh:NodeShape. ?target a ?class . bind (?shape as ?class) . } union { ?shape sh:targetSubjectsOf ?property. ?target ?property ?any. } union { ?shape sh:targetObjectsOf ?property. ?any ?property ?target. } } } { bind (?target as ?node) } union { # handle sh:node references: the referenced node also # becomes a target node ?target ?property ?node . ?shape sh:property ?propShape . ?propShape sh:path ?property . ?propShape sh:node ?otherNodeShape . # } union { # # handle property paths: the triples matched by the property path are # # 'covered' by the shape # ## NOTE: such properties do not seem to be # ## part of the shape (they are reported when the shape is closed) # ## so we actually don't need to handle them here... same reasoning # ## is appliccable for all property pair constraints: e.g. object # ## of sh:lessThan does not become part of the shape and is reported # ## when the shape is closed. # ?shape sh:property ?propShape . # ?propShape sh:path ?pathStart . # ?pathStart rdf:rest*/rdf:first ?prop . # ?target (!rdf:noprop)* ?node. # ?target (!rdf:noprop)* ?val. # ?node ?prop ?val. } filter not exists { # filter triples based on any ValidationResult except the two below ?res a sh:ValidationResult ; sh:focusNode ?node ; sh:sourceConstraintComponent ?constraint . filter (?constraint != sh:NodeConstraintComponent && ?constraint != sh:ClosedConstraintComponent) } filter not exists { # filter triples based on value when a NodeConstraint # (sh:node) is violated ?res a sh:ValidationResult ; sh:sourceConstraintComponent sh:NodeConstraintComponent ; sh:value ?node } filter not exists { # filter triples based on focusNode/resultPath when a closed # (sh:closed) shape is violated ?res a sh:ValidationResult ; sh:focusNode ?node ; sh:resultPath ?prop ; sh:sourceConstraintComponent sh:ClosedConstraintComponent . } }
Received on Friday, 1 December 2017 18:37:07 UTC