- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Tue, 12 Apr 2016 08:11:12 -0700
- To: Holger Knublauch <holger@topquadrant.com>, public-data-shapes-wg@w3.org
Here are a few examples. These were generated using a simple test harness that calls an internal function to generate the query for a shape in a shapes graph, prints the query, and then runs the query against a data graph. Dimitris should be able to provide a few examples of the SPARQL code that his implementation produces as well. The output may not be too different. ex:t1 a sh:Shape ; sh:scopeClass ex:tscope1 ; sh:class ex:tclass1 . PREFIX sh: <http://www.w3.org/ns/shacl#> # SHAPE start <http://ex.com/t1> SELECT ?this ?message ?severity ?subject ?predicate ?object (<http://ex.com/t1> AS ?shape ) WHERE { # SHAPE body { # FRAGMENT SELECT ?this ("Does not have required class ex:tclass1" AS ?message) (<http://www.w3.org/ns/shacl#Violation> AS ?severity) (?this AS ?object) WHERE { ?this rdf:type/rdfs:subClassOf* <http://ex.com/tscope1> . FILTER ( ! EXISTS { ?this rdf:type/rdfs:subClassOf* <http://ex.com/tclass1> } ) } } } # SHAPE end <http://ex.com/t1> ex:t9 a sh:Shape ; sh:scopeClass ex:tscope2 ; sh:equals ( ex:p1 ( ex:p2 ex:p2 ) ). PREFIX sh: <http://www.w3.org/ns/shacl#> # SHAPE start <http://ex.com/t9> SELECT ?this ?message ?severity ?subject ?predicate ?object (<http://ex.com/t9> AS ?shape ) WHERE { # SHAPE body { # FRAGMENT SELECT ?this ("Paths don't have equal values" AS ?message) (<http://www.w3.org/ns/shacl#Violation> AS ?severity) (?this AS ?object) WHERE { ?this rdf:type/rdfs:subClassOf* <http://ex.com/tscope2> . { { ?this <http://ex.com/p1> ?value . MINUS { ?this <http://ex.com/p2>/<http://ex.com/p2> ?value . } } UNION { ?this <http://ex.com/p2>/<http://ex.com/p2> ?value . MINUS { ?this <http://ex.com/p1> ?value. } } } } } } # SHAPE end <http://ex.com/t9> ex:unl a sh:Shape ; sh:scopeClass ex:unlC ; sh:propValues ( ex:propunl [ a sh:Shape ; sh:hasValue ex:snli ] ) . PREFIX sh: <http://www.w3.org/ns/shacl#> # SHAPE start <http://ex.com/unl> SELECT ?this ?message ?severity ?subject ?predicate ?object (<http://ex.com/unl> AS ?shape ) WHERE { # SHAPE body { # newContext SELECT ?this ?message ?severity ?subject ?predicate ?object WHERE { {SELECT (?childGrandparent AS ?parent) ?this # (?childParent AS ?this) ?message ?severity ?subject ?predicate ?object WHERE {{ SELECT (?grandparent AS ?childGrandparent) (?parent AS ?childParent) (?message AS ?childMessage) (?severity as ?childSeverity) (?subject AS ?childSubject) (?predicate AS ?childPredicate) ?object WHERE { # SHAPE start "ub1bL296C30" SELECT ?parent ?this ?message ?severity ?subject ?predicate ?object ("ub1bL296C30" AS ?shape ) WHERE { # SHAPE body { # hasValue SELECT ?parent ("Missing required value ex:snli" AS ?message) (<http://www.w3.org/ns/shacl#Violation> AS ?severity) WHERE { { SELECT (IF(BOUND(?p),?p,"UNKNOWN P") AS ?parent) (IF(BOUND(?gp),?gp,"UNKNOWN GP") AS ?grandparent) WHERE { { SELECT (IF(BOUND(?this),?this,"UNK T") AS ?p) (IF(BOUND(?parent),?parent,"UNK P") AS ?gp) WHERE { ?this rdf:type/rdfs:subClassOf* <http://ex.com/unlC> . } } } } FILTER NOT EXISTS { { ?parent <http://ex.com/propunl> ?this . } FILTER sameTerm(?this,<http://ex.com/snli>) } } } } # SHAPE end "ub1bL296C30" } } BIND( (IF(BOUND(?childSubject), ?childSubject, ?childParent)) AS ?subject ) BIND( (IF(BOUND(?childSubject), ?childPredicate, ex:propunl)) AS ?predicate ) BIND( (IF(BOUND(?childParent), ?childParent, "UNKNOWN")) AS ?this ) BIND( CONCAT("In path ex:propunl ",?childMessage) AS ?message ) BIND( <http://www.w3.org/ns/shacl#Violation> AS ?severity ) } } ?this rdf:type/rdfs:subClassOf* <http://ex.com/unlC> . # subshape inner } } } # SHAPE end <http://ex.com/unl> On 04/11/2016 09:55 PM, Holger Knublauch wrote: > Peter, > > in order to better understand how your algorithm works, would you be able to > share some examples of the SPARQL that gets generated? Also, I assume you have > some non-trivial test cases - these may be valuable resources for the WG in > general. > > (Regardless of whether the WG decided to generally recommend a > SPARQL-transformation approach, there certainly would be value in exploring > this possibility, e.g. as a WG note or in papers). > > Thanks, > Holger > > > On 23/03/2016 3:22, Peter F. Patel-Schneider wrote: >> I put together an implementation of core SHACL with my syntax proposal. It is >> available at https://github.com/pfps/shacl >> >> There is a single python 2.7 file that can be called as >> python shacl.py data shapes >> to validate the data graph against the shapes graph and print the validation >> reports. >> >> This implements my proposed syntax but there is also code that will handle >> most of the differences between the two syntaxes. >> >> This implementation is a pure transformation to SPARQL. A SHACL shape is >> transformed into a SPARQL query and the solutions in the result set are the >> violations of the shape. >> >> There are a few differences between this implementation and the current spec >> besides the syntax differences. There is no translation from the result set >> to a graph. The subject, predicate, and object come from where the violation >> was detected. Severities may be handled slightly differently. >> >> >> peter >> > >
Received on Tuesday, 12 April 2016 15:11:42 UTC