- From: Ivan Herman <ivan@w3.org>
- Date: Wed, 31 Mar 2010 10:26:14 +0200
- To: Andy Seaborne <andy.seaborne@talis.com>
- Cc: SPARQL Working Group <public-rdf-dawg@w3.org>
- Message-Id: <3AA59252-D650-44FB-9047-E0EE913FB956@w3.org>
Interesting. In my completely uninformed and intuitive expectation, NOT EXISTS 'feel' right for all three cases you quote. I am not sure how I would explain the one row in Query 2, for example. Ivan On Mar 30, 2010, at 14:46 , Andy Seaborne wrote: > kasei gave an example of a query that was different under MINUS and NOT EXISTS. I've used it to generate a number of cases to show here they are the same wand where different. It reinforces Lee's characterization of the graph-centric and table-centric (resource-centic?) styles. > > > http://www.w3.org/2009/sparql/docs/features/#Negation_description > mentions testing whether a triples do or not do occur in the graph. > > Query 2/3 is interesting: testing for the (non)existence of a specific triple: > > The data is a single triple graph in all cases: > > # Data ------- > @prefix : <http://example/> . > > :a :b :c . > # Data ------- > > > Query 2: > { ?s ?p ?o NOT EXISTS { :a :b :c } } ==> no rows > { ?s ?p ?o MINUS { :a :b :c } } ==> one row > > Query 3: > { ?s ?p ?o NOT EXISTS { :x :y :z } } ==> one row > { ?s ?p ?o MINUS { :x :y :z } } ==> one row > > This one is also a place where they differ: > > Query 5: > { ?s ?p ?o NOT EXISTS { ?x ?y ?z } } ==> no rows > { ?s ?p ?o MINUS { ?x ?y ?z } } ==> one rows > > These examples are mechanically produced with a simple implementation of each operation directly from the spec. So, bugs not withstanding, we can analyse other examples systematically. > > Andy > > > > # -------- Query 1 : NOT EXIST > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 NOT EXISTS > 7 { ?s ?p ?o } > 8 } > # Results ---------------------------------- > ------------- > | s | p | o | > ============= > ------------- > > # -------- Query 1 : MINUS > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 MINUS > 7 { ?s ?p ?o } > 8 } > # Results ---------------------------------- > ------------- > | s | p | o | > ============= > ------------- > > # -------- Query 2 : NOT EXIST > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 NOT EXISTS > 7 { :a :b :c } > 8 } > # Results ---------------------------------- > ------------- > | s | p | o | > ============= > ------------- > > # -------- Query 2 : MINUS > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 MINUS > 7 { :a :b :c } > 8 } > # Results ---------------------------------- > ---------------- > | s | p | o | > ================ > | :a | :b | :c | > ---------------- > > # -------- Query 3 : NOT EXIST > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 NOT EXISTS > 7 { :x :y :z } > 8 } > # Results ---------------------------------- > ---------------- > | s | p | o | > ================ > | :a | :b | :c | > ---------------- > > # -------- Query 3 : MINUS > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 MINUS > 7 { :x :y :z } > 8 } > # Results ---------------------------------- > ---------------- > | s | p | o | > ================ > | :a | :b | :c | > ---------------- > > # -------- Query 4 : NOT EXIST > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 NOT EXISTS > 7 { ?s :b :c } > 8 } > # Results ---------------------------------- > ------------- > | s | p | o | > ============= > ------------- > > # -------- Query 4 : MINUS > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 MINUS > 7 { ?s :b :c } > 8 } > # Results ---------------------------------- > ------------- > | s | p | o | > ============= > ------------- > > # -------- Query 5 : NOT EXIST > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 NOT EXISTS > 7 { ?x ?y ?z } > 8 } > # Results ---------------------------------- > ------------- > | s | p | o | > ============= > ------------- > > # -------- Query 5 : MINUS > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 MINUS > 7 { ?x ?y ?z } > 8 } > # Results ---------------------------------- > ---------------- > | s | p | o | > ================ > | :a | :b | :c | > ---------------- > > # -------- Query 6 : NOT EXIST > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 NOT EXISTS > 7 { ?s :b :c > 8 FILTER ( ?s = :a ) > 9 } > 10 } > # Results ---------------------------------- > ------------- > | s | p | o | > ============= > ------------- > > # -------- Query 6 : MINUS > # Query ------------------------------------ > 1 PREFIX : <http://example/> > 2 > 3 SELECT * > 4 WHERE > 5 { ?s ?p ?o > 6 MINUS > 7 { ?s :b :c > 8 FILTER ( ?s = :a ) > 9 } > 10 } > # Results ---------------------------------- > ------------- > | s | p | o | > ============= > ------------- > > ---- Ivan Herman, W3C Semantic Web Activity Lead Home: http://www.w3.org/People/Ivan/ mobile: +31-641044153 PGP Key: http://www.ivan-herman.net/pgpkey.html FOAF: http://www.ivan-herman.net/foaf.rdf
Attachments
- application/pkcs7-signature attachment: smime.p7s
Received on Wednesday, 31 March 2010 08:24:51 UTC