- From: Birte Glimm <birte.glimm@comlab.ox.ac.uk>
- Date: Tue, 2 Nov 2010 11:15:54 +0000
- To: Andy Seaborne <andy.seaborne@epimorphics.com>
- Cc: SPARQL Working Group <public-rdf-dawg@w3.org>
Trying Reply All this time... see below On 1 November 2010 20:59, Andy Seaborne <andy.seaborne@epimorphics.com> wrote: > > > 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 Ah, that's what I didn't get, that it then operates on the empty pattern, but that makes sense. The rest is clear then. Thanks for the detailed explanation. Birte [snip] -- Dr. Birte Glimm, Room 309 Computing Laboratory Parks Road Oxford OX1 3QD United Kingdom +44 (0)1865 283520
Received on Tuesday, 2 November 2010 11:16:27 UTC