- From: Andy Seaborne <andy@apache.org>
- Date: Fri, 21 Apr 2017 20:55:10 +0100
- To: "Peter F. Patel-Schneider" <pfpschneider@gmail.com>, public-sparql-exists@w3.org
On 18/04/17 19:24, Peter F. Patel-Schneider wrote:
> [Second half only.]
>
>>> SELECT ?this WHERE {
>>> ?this a ex:good .
>>> FILTER EXISTS { { SELECT * WHERE { } }
>>> BIND ( ?this AS ?that )
>>> ?that a ex:bad } }
>>>
>>> peter
>>>
>>
>> Simplification applies after syntax parsing, before evaluation.
>>
>> Inner "SELECT * {}" is a project of no variables of the unit table which is
>> left as-is. So no simplification.
>>
>> 18.2.4.4
>> "The set PV is used later for projection."
>>
>> 18.2.5.2 Projection
>> """
>> The set of projection variables, PV, was calculated in the processing of
>> SELECT expressions.
>>
>> M := Project(M, PV)
>> """
>>
>> There is something to account for in SELECT * but it's not simplification.
>>
>> Andy
>
>
> As far as I can tell the inner select is translated (see last example in
> 18.2.3) as
> ToMultiSet(Project(Z,{}))
>
> The argument to EXISTS is translated (19.2.2.6) as
> Join( Extend(Join(Z,ToMultiSet(Project(Z,{}))),?that,?this),
> BGP(?that rdf:type ex:bad )
>
> Simplification (18.2.2.8) then results in
> Join( Extend(ToMultiSet(Project(Z,{})),?that,?this),
> BGP(?that rdf:type ex:bad) )
and the Z is not in a join.
>
> So the EXISTS is translated to
> exists(
> Join( Extend(ToMultiSet(Project(Z,{})),?that,?this),
> BGP(?that rdf:type ex:bad) ) )
>
> Evaluation of the EXISTS with ?this mapped to ex:i proceeds by first doing
> the replacement, which ends up with something like
> Join( Extend(ToMultiSet(Project(Join(Z,{{?this,ex:i}}),{})),?that,?this),
^^^
Simplification happened after the query was parsed, as the algebra was
created and does not apply again during evaluation.
It should be that
project -> {{?this,ex:i}}
except for the issue noted about "SELECT *"
then BIND ( ?this AS ?that ) happens.
then join with BGP(?that rdf:type ex:bad)
> Join(BGP(?that rdf:type ex:bad),{{?this,ex:i}}) )
> This is evaluated to
> Join( Extend({{}},?that,?this),
> Join(BGP(?that rdf:type ex:bad),{{?this,ex:i}}) )
> and then to
> Join( {{}},
> Join(BGP(?that rdf:type ex:bad),{{?this,ex:i}}) )
>
> The BIND then ends up not having any effect because ?this doesn't have a
> binding when it is evaluated, due simplification removing the place where
> the FILTER variables might have been joined in.
I don't see where such a simplification is happening.
It's the fact SELECT * is calculated without regard to the current row.
When "SELECT *" includes ?this, the inner BGP has the current row added.
"SELECT * {}" does not have a join.
>
> peter
>
(prefix ((: <http://example/>)
(rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>))
(project (?this)
(filter (exists
(join
(extend ((?that ?this))
(project {}
(table unit)))
(bgp (triple ?that rdf:type <::ex:bad>))))
(bgp (triple ?this rdf:type <::ex:good>)))))
for the EXISTS part:
(join
(extend ((?that ?this))
(project {}
(table unit))
(bgp (triple ?that rdf:type <::ex:bad>))
)
BIND extends the graph pattern (syntactically - it's gathered up in
syntax->algebra) before it.
Received on Friday, 21 April 2017 19:55:47 UTC