- From: Holger Knublauch <holger@topquadrant.com>
- Date: Sat, 2 Dec 2017 05:28:02 +1000
- To: Florian Kleedorfer <florian.kleedorfer@austria.fm>
- Cc: public-rdf-shapes@w3.org
On 2/12/2017 4:36, Florian Kleedorfer wrote: > 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? You'll also want to query for instances of subclasses, e.g. > > > # 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 . ?target rdf:type/rdfs:subClassOf* ?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 . > } > } Interesting approach - I was assuming this is executed as part of some API that already has this logic implemented, but the SPARQL query can work too. Holger
Received on Friday, 1 December 2017 19:28:33 UTC