- From: Niels Andersen <niels@thinkiq.com>
- Date: Thu, 17 Mar 2016 15:57:18 +0000
- To: Andy Seaborne <andy@apache.org>, "public-sparql-dev@w3.org" <public-sparql-dev@w3.org>
I had exactly the same issue yesterday.
This article explains the issue with bottom up semantics and variable scope: https://wiki.blazegraph.com/wiki/index.php/SPARQL_Bottom_Up_Semantics
Niels
-----Original Message-----
From: Andy Seaborne [mailto:andy@apache.org]
Sent: Thursday, March 17, 2016 04:43
To: public-sparql-dev@w3.org
Subject: Re: BIND behaviour and GroupGraphPatterns
On 17/03/16 10:16, Jörn Hees wrote:
> Hi,
>
> i have a question about the "intended scope" of BIND...
>
> Trying to fix an issue in the RDFLib SPARQL processor [1], i came up with what i thought was a minimal breaking test [2] like this:
Thank you for providing a test.
>
> This works (correctly binds ?z in RDFLib):
> select * {
> ?s ?p ?o .
> bind(?o as ?z)
> }
Algebra:
(extend ((?z ?o))
(bgp (triple ?s ?p ?o)))
>
> This doesn't:
> select * {
> ?s ?p ?o .
> { bind(?o as ?z) }
> }
Algebra:
(join
(bgp (triple ?s ?p ?o))
(extend ((?z ?o))
(table unit)))
The issue is what value ?z is being bound to.
The addition of {} means that the the BIND is run on what's before it in that {}-group, then joined with the rest of the outer {}-group. SPARQL evaluates the inner {}-groups and then combines the results.
{ bind(?o as ?z) } does not have ?o bound to anything -> evaluation error.
Try this:
select * { bind(?o as ?z) }
Andy
>
> (At this time, my expectation was that the latter should also bind ?z.
> Later, I found out that jena disagrees (see appendix).)
>
> So i went down in our implementation and fixed the behaviour, making my tests for [1] pass.
>
> To my surprise the fix caused another test to fail, namely bind07 [3] from the SPARQL 1.1 test cases:
>
> SELECT ?s ?p ?o ?z {
> ?s ?p ?o .
> { BIND(?o+1 AS ?z) } UNION { BIND(?o+2 AS ?z) } }
>
> The test asserts that ?z is unbound.
> I guess that the intention of that test was to make sure ?z isn't bound to different values.
>
> What i find weird about this is that it's inconsistent with other ways to bind ?z to different things which are allowed:
>
> SELECT ?s ?p ?o ?z {
> ?s ?p ?o .
> { ?s ?p ?z } UNION { ?z ?p ?o }
> }
>
>
> So my questions are:
> - Is [3] correct? What is the motivation?
> - Should ?z be bound in this: select * { ?s ?p ?o . { bind(?o as ?z) } } ?
>
>
> Cheers,
> Jörn
>
> [1]: https://github.com/RDFLib/rdflib/issues/580
> [2]: https://github.com/RDFLib/rdflib/pull/601
> [3]:
> https://www.w3.org/2009/sparql/docs/tests/data-sparql11/bind/bind07.rq
>
>
>
> Appendix: some tests in jena on the commandline
>
>
> This works as expected:
> $ sparql --data=https://www.w3.org/2009/sparql/docs/tests/data-sparql11/bind/data.ttl --query=<(echo '
> select * {
> ?s ?p ?o .
> bind(?o as ?z)
> }
> ')
> ------------------------------------------------------------
> | s | p | o | z |
> ============================================================
> | <http://example.org/s1> | <http://example.org/p> | 1 | 1 |
> | <http://example.org/s4> | <http://example.org/p> | 4 | 4 |
> | <http://example.org/s3> | <http://example.org/p> | 3 | 3 |
> | <http://example.org/s2> | <http://example.org/p> | 2 | 2 |
> ------------------------------------------------------------
>
>
> This doesn't:
> $ sparql --data=https://www.w3.org/2009/sparql/docs/tests/data-sparql11/bind/data.ttl --query=<(echo '
> select * {
> ?s ?p ?o .
> { bind(?o as ?z) }
> }
> ')
> ------------------------------------------------------------
> | s | p | o | z |
> ============================================================
> | <http://example.org/s1> | <http://example.org/p> | 1 | |
> | <http://example.org/s4> | <http://example.org/p> | 4 | |
> | <http://example.org/s3> | <http://example.org/p> | 3 | |
> | <http://example.org/s2> | <http://example.org/p> | 2 | |
> ------------------------------------------------------------
>
>
> Test [3]:
> $ sparql
> --data=https://www.w3.org/2009/sparql/docs/tests/data-sparql11/bind/da
> ta.ttl
> --query=https://www.w3.org/2009/sparql/docs/tests/data-sparql11/bind/b
> ind07.rq
> --------------------
> | s | p | o | z |
> ====================
> | :s1 | :p | 1 | |
> | :s4 | :p | 4 | |
> | :s3 | :p | 3 | |
> | :s2 | :p | 2 | |
> | :s1 | :p | 1 | |
> | :s4 | :p | 4 | |
> | :s3 | :p | 3 | |
> | :s2 | :p | 2 | |
> --------------------
>
>
> This binds ?z:
> $ sparql --data=https://www.w3.org/2009/sparql/docs/tests/data-sparql11/bind/data.ttl --query=<(echo '
> select * {
> ?s ?p ?o .
> {{ ?s ?p ?z } UNION { ?z ?p ?o }}
> }
> ')
> ----------------------------------------------------------------------
> ------------
> | s | p | o | z |
> ======================================================================
> ============
> | <http://example.org/s1> | <http://example.org/p> | 1 | 1 |
> | <http://example.org/s1> | <http://example.org/p> | 1 | <http://example.org/s1> |
> | <http://example.org/s4> | <http://example.org/p> | 4 | 4 |
> | <http://example.org/s4> | <http://example.org/p> | 4 | <http://example.org/s4> |
> | <http://example.org/s3> | <http://example.org/p> | 3 | 3 |
> | <http://example.org/s3> | <http://example.org/p> | 3 | <http://example.org/s3> |
> | <http://example.org/s2> | <http://example.org/p> | 2 | 2 |
> | <http://example.org/s2> | <http://example.org/p> | 2 |
> | <http://example.org/s2> |
> ----------------------------------------------------------------------
> ------------
>
>
>
Received on Thursday, 17 March 2016 16:13:10 UTC