- From: Peter F. Patel-Schneider <pfpschneider@gmail.com>
- Date: Fri, 17 Jun 2016 16:31:41 -0700
- To: public-rdf-tests@w3.org
EXISTS in SPARQL has quite a number of problems. The substitution that it is based on results in suspect constructs in the SPARQL algebra and counter-intuitive results. There are known differences in implementations of EXISTS for common situations. Here are a number of proposed test cases for EXISTS with their current status as per the SPARQL 1.1 Query specification and with suggestions on what should be changed to fix EXISTS. I'm willing to transform these into the syntax of the test case suite if that is going to produce an effect. However, one problem is that some of the test cases produce internal constructs that are semantically ill-formed but that do not end up in the final output. I don't know whether the test suite can describe this situation. Query: SELECT ?x WHERE { ?x :a :b . FILTER EXISTS { VALUES (?x) { ( :c ) } } } Graph: :d :a :b . Syntactic Status: legal Result: { { ( x, :d ) } } Semantic Status: illegal Problem: substitute substitutes the ?x with :d in the multiset for the VALUES resulting in an ill-formed multiset Suggestion: Change the definition of substitute to not substitute here. New result: { } Query: SELECT ?x ?y WHERE { ?x :a ?y . FILTER EXISTS { VALUES (?x) { ( :e ) } VALUES (?y) { ( :d ) } } } Graph: :e :a :e . Syntactic Status: legal Result: { } Semantic Status: illegal Problem: substitute substitutes the ?x and the ?y in the multisets for the two VALUES resulting in an ill-formed multiset Suggestion: Change the definition of substitute to not substitute here. New result: { { ( ?x, :e ) , ( ?y, :e ) } } Query: SELECT ?x WHERE { ?x :a :b . FILTER EXISTS { BIND ( :c AS ?x ) } } Graph: :d :a :b . Syntactic Status: legal Result: { { ( x, :d ) } } Semantic Status: illegal Problem: this is syntactically legal but should be illegal Problem: substitute substitutes the ?x in the Extend resulting in a poorly-formed Extend Suggestion: Change the definition of in-scope to make ?x in-scope before the BIND. Suggestion: Change the definition of substitute to not substitute here. New Result: NONE Query: SELECT ?x WHERE { ?x :a ?y . FILTER EXISTS { BIND ( :c AS ?x ) BIND ( :c AS ?y ) } } Graph: :d :a :d . Syntactic Status: legal Result: explicitly undefined Semantic Status: illegal Problem: this is syntactically legal but should be illegal Problem: substitute substitutes the ?x in the Extends resulting in poorly-formed Extends. Suggestion: Change the definition of in-scope to make ?x in-scope before the BIND. Suggestion: Change the definition of substitute to not substitute here. New Result: NONE Query: SELECT ?x WHERE { ?x :a :c . FILTER EXISTS { { SELECT ?x WHERE { ?x :a :c . } } } } Graph: :d :a :c . Syntactic Status: legal Result: { { ( x, :d ) } } Semantic Status: illegal Problem: substitute substitutes the ?x in the Project resulting in a poorly-formed Project Suggestion: don't substitute in the SELECT at all New Result: { { ( x, :d ) } } Query: SELECT ?x WHERE { ?x :a ?y . FILTER EXISTS { { SELECT ?x WHERE { ?x :a :c . } } { SELECT ?y WHERE { :d :a ?y . } } } } Graph: :d :a :c . Syntactic Status: legal Result: { } Semantic Status: illegal Problem: substitute substitutes the ?x and ?y in the Projects resulting in poorly-formed Projects Suggestion: don't substitute in the SELECT at all New Result: { { ( x, :d ) } } Query: SELECT ?x WHERE { ?x :a ?y . FILTER EXISTS { { SELECT ?z WHERE { ?z :f ?y . } } } } Graph: :d :a :b . :g :f :h . Syntactic Status: legal Result: { } Semantic Status: legal Problem: substitute substitutes in the SELECT meaning that it cannot be evaluated until after the solution mappings for the FILTER are known Suggestion: don't substitute into separated variables in a SELECT New Result: { { (x, :d) } } Query: SELECT ?x WHERE { :s :p ?x . FILTER EXISTS { ?x :p _:a . } } Graph: :s :p _:b . Syntactic Status: legal Result: { { ( x, _:b ) } } Semantic Status: legal Problem: substitute substitutes a blank node into the inner BGP which can itself be futher substituted Solution: don't allow further substition of substituted blank nodes New Result: { } Query: SELECT ?x WHERE { ?x :a :b . FILTER EXISTS { ?x :a :b . MINUS { ?x :a :b } } } Graph: :c :a :b . Syntactic Status: legal Result: { { (x, :c) } } Semantic Status: legal Problem: substitute removes the shared variable in the MINUS, switching its meaning Solution: still count these substituted variables as shared New Result: { } Query: SELECT ?parent WHERE { ?parent :country :j FILTER ( EXISTS { SELECT ?child WHERE { ?child :parent ?parent } } ) } Graph: :a :country :j . :a :parent :b . :b :country :j . :b :parent :c . :c :parent :d . :c :country :k . Syntactic Status: legal Result: { { (parent :b) } } Semantic Status: legal Problem: substitute substitutes in the SELECT meaning that it cannot be evaluated until after the solution mappings for the FILTER are known Suggestion: don't substitute into separated variables in a SELECT New Result: { { (parent :b) } { (parent :a) } } Note: different implementations produce different results here Note: From https://scirate.com/arxiv/1606.01441 Query: SELECT ?parent WHERE { ?parent :country :j FILTER ( EXISTS { SELECT ?child WHERE { ?child :parent ?chparent FILTER (?chparent = ?parent) } } ) } Graph: :a :country :j . :a :parent :b . :b :country :j . :b :parent :c . :c :parent :d . :c :country :k . Syntactic Status: legal Result: { { (parent :b) } } Semantic Status: legal Problem: substitute substitutes in the SELECT meaning that it cannot be evaluated until after the solution mappings for the FILTER are known Suggestion: don't substitute into separated variables in a SELECT New Result: { } Note: different implementations produce different results here Note: From https://scirate.com/arxiv/1606.01441 Peter F. Patel-Schneider Nuance Communications
Received on Friday, 17 June 2016 23:32:12 UTC