- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Mon, 01 Nov 2010 20:59:57 +0000
- To: Birte Glimm <birte.glimm@comlab.ox.ac.uk>
- CC: SPARQL Working Group <public-rdf-dawg@w3.org>
On 01/11/10 16:12, Birte Glimm wrote:
> Hi all,
> I was just wondering whether I can have something like double
> negation/not exists within not exists, e.g., is
> SELECT ?X WHERE { { ?x a ex:A } FILTER NOT EXISTS { FILTER NOT
> EXISTS { ?x a ex:B } } }
> a legal query?
yes.
> According to the grammar it seems to be, but from
> looking at the algebra, I can't see how I would translate that into a
> proper query algebra expression. There is still @@NOT EXISTS, so maybe
> all will be clear once that is defined, but inuitively, I would expect
> that when evaluating the innermost FILTER NOT EXISTS, I substract
> solutions from the ?x a ex:A evaluation according to the filer, but
> then it is unclear what the outer FILTER NOT EXISTS works on.
>
> E.g., my default graph has:
> ex:a1 a ex:A .
> ex:a2 a ex:A .
> ex:a2 a ex:B .
>
> For the BGP ?x a ex:A, I get mu1=(x/ex:a1) and mu2=(x/ex:a2). When I
> then evaluate FILTER NOT EXISTS { ?x a ex:B }, it remains
> mu1=(x/ex:a1), but then?
s/?X/?x/
---------
| x |
=========
| ex:a2 |
---------
SELECT ?x WHERE
{ { ?x a ex:A }
FILTER NOT EXISTS
{ FILTER NOT EXISTS { ?x a ex:B } }
}
NOT EXISTS works by substituting the variables, executing the pattern
and seeing if there are any rows.
The inner
{ FILTER NOT EXISTS { ?x a ex:B } }
is a filter on the result of the empty pattern
> For the BGP ?x a ex:A, I get mu1=(x/ex:a1) and mu2=(x/ex:a2).
Yes.
For mu1=(x/ex:a1)
FILTER NOT EXISTS { P }
where P = { FILTER NOT EXISTS { ex:a1 a ex:B } }
which is a FILTER on the empty pattern.
{ ex:a1 a ex:B } does not exist => FILTER is true.
{ FILTER true } => one row, no bindings.
FILTER NOT EXISTS { { FILTER true } => false
==> no solution.
For mu2=(x/ex:a2):
FILTER NOT EXISTS { P }
where P = { FILTER NOT EXISTS { ex:a2 a ex:B } }
which is a FILTER on the empty pattern.
{ ex:a2 a ex:B } does exist => FILTER is false.
{ FILTER false } => no rows
FILTER NOT EXISTS { { FILTER false } => true
==> mu2=(x/ex:a2)
Andy
>
> Maybe I am overlooking something here or maybe the query is not legal?
>
> Birte
>
Received on Monday, 1 November 2010 21:00:35 UTC