eugen
eugen

Reputation: 474

Behaviour of variables projected out of the sub-select

Given a list of entities (with Persons among them) and their properties how should the following query behave:

select *
where
{

    ?s ?p ?o.
    {
            SELECT ?ps WHERE
            {
                    ?ps a <http://www.example.org/schema/Person> .
            }
            limit 1
    }
    #?ps ?p ?o.

    filter (?s =?ps)
}

I tested this in 3 triple stores. Two of them filter on ps with the above query so the result is triples for one person(+ps column).

The 3'rd one returns all database triples because "The variable "ps" that is projected out of the sub-select does not join with anything in the top-level query."

Still since it's projected out and I use it in a FILTER I would expect to apply the filter.

Uncommenting line " #?ps ?p ?o. " will indeed display triples for one person.

Upvotes: 2

Views: 93

Answers (1)

AndyS
AndyS

Reputation: 16630

The filter will be applied.

The FILTER applies to the whole block. There is a join of results of "?s ?p ?o" with results ?ps (so it's a join that is a cross product at this point - no common variable - but that's OK). That results in solutions with 4 bindings ?s ?p ?o ?ps The filter then applies.

You could write:

WHERE {
  ?s ?p ?o.
  {
       SELECT ?s 
       WHERE { ?s a <http://www.example.org/schema/Person> . }
       limit 1
  }
}

Upvotes: 3

Related Questions