- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Tue, 12 Oct 2010 20:36:22 +0100
- To: sparql Working Group <public-rdf-dawg@w3.org>
> { P1 KW(Expr AS ?Var) P2}
> =:=
> { { SELECT * Expr AS ?Var { P1} } P2 }
Does BIND end a BGP?
What happens to FILTERs?
{ FILTER(expr) ?x ns:p ?v . ?x ns:q ?w }
is the algebra:
(filter expr
(bgp (triple ?x ns:p ?v)
(triple ?x ns:q ?w)
))
or written after FILTER motion:
{ ?x ns:p ?v . ?x ns:q ?w FILTER(expr) }
But if we insert BIND(2*?v AS ?two) into that:
{ FILTER(expr) ?x ns:p ?v . BIND(2*?v AS ?two) . ?x ns:q ?w }
There is a similar issue with bNode syntax label scopes.
I propose that:
1/ BIND terminates the current BGP
2/ FILTER goes after BIND in the BGP
so its:
(join
(filter expr
(extend (2*?v AS ?two)
(bgp (triple ?x ns:p ?v))
))
(bgp (triple ?x ns:q ?w))
)
or
{ { ?x ns:p ?v . BIND(2*?v AS ?two) . FILTER(expr)} ?x ns:q ?w }
Logically it's
BGP - BIND - FILTER
Doing this keep entailment a matter of BGPs only. Without motion of
BIND, it would need more work to come up with a design (if it exists)
that keeps entailment on a conjuction of triple patterns and have the
variable scoping + new variable rule.
Lee's example:
{ ?x ns:p ?v . BIND(2*?v AS ?two) ?x ns:q ?two }
will work and naturally falls out if BIND happens where it's mentioned.
(join
(extend (2*?v AS ?two)
(bgp (triple ?x ns:p ?v)))
(bgp (triple ?x ns:q ?two))
)
Andy
Received on Tuesday, 12 October 2010 19:36:59 UTC