# Re: FILTER inside FILTER?

From: Andy Seaborne <andy.seaborne@epimorphics.com>
Date: Mon, 01 Nov 2010 20:59:57 +0000
Message-ID: <4CCF2A4D.5000307@epimorphics.com>
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

This archive was generated by hypermail 2.3.1 : Wednesday, 7 January 2015 15:01:02 UTC