shapes-ISSUE-170 (exists blank nodes): SPARQL specifies a different reading for exists and blank nodes than needed for SHACL

shapes-ISSUE-170 (exists blank nodes): SPARQL specifies a different reading for exists and blank nodes than needed for SHACL

http://www.w3.org/2014/data-shapes/track/issues/170

Raised by: Peter Patel-Schneider
On product: 

The SPARQL evaluation semantics at https://www.w3.org/TR/sparql11-query/#sparqlAlgebraEval specifies that EXISTS has a substitution semantics.  The SPARQL definitions of sh:class and several other SHACL constructs use EXISTS.

This leads to incorrect results for value nodes that are blank nodes.

For example

  ex:s1 rdf:type sh:Shape ;
    sh:scopeClass ex:Person ;
    sh:property [ sh:predicate sh:friend ;
                  sh:class ex:Person ] .

does not produce any violations on the graph

  ex:Bill rdf:type ex:Person ;
    ex:friend _:John .

What happens is that the evaluation of

SELECT $this ($this AS ?subject) $predicate (?value AS ?object)
WHERE {
 $this $predicate ?value .
 FILTER NOT EXISTS { ?value rdf:type/rdfs:subClassOf* $class } .
}

evaluates the EXISTS with ?value mapped to _:John.  The substitution that underlies EXISTS results in 
    _:John rdf:type/rdfs:subClassOf* ex:Person 
This triple is then matched against the graph and there is a match because _:John matches ex:Bill.

Either there needs to be an approved errata for SPARQL so that this match no longer happens, or the SHACL specification needs to say that it needs a different meaning for EXISTS, or the SPARQL definition of sh:class and the other SHACL constructs that use EXISTS need to be changed.

Received on Wednesday, 29 June 2016 12:19:25 UTC