- From: Andy Seaborne <andy.seaborne@talis.com>
- Date: Tue, 30 Mar 2010 13:46:50 +0100
- To: SPARQL Working Group <public-rdf-dawg@w3.org>
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 | ============= -------------
Received on Tuesday, 30 March 2010 12:47:22 UTC