On 16/10/12 20:25, Jan Wielemaker wrote:
Working through the SPARQL 1.1 testcases for ClioPatria, I'm
struggling with MINUS. This seems to boil down to what do to with
optional bindings (NULL) in the minus arguments.  If I treat them to
match everything, I get no results.  If treat them to match only
another NULL, I also get ?a = :a2.  Can anyone explain what I am
missing?

The test is negation/full-minuend.rq

The test results are:
-------------------
| a   | b   | c   |
===================
| :a0 | :b0 | :c0 |
| :a3 | :b3 | :c3 |
-------------------

What I get is:

select ?a ?b ?c {
  ?a :p1 ?b; :p2 ?c
==>
-------------------
| a   | b   | c   |
===================
| :a3 | :b3 | :c3 |
| :a2 | :b2 | :c2 |
| :a1 | :b1 | :c1 |
| :a0 | :b0 | :c0 |
-------------------



select * {
    ?d a :Sub
    OPTIONAL { ?d :q1 ?b }
    OPTIONAL { ?d :q2 ?c }
}
==>
-------------------
| d   | b   | c   |
===================
| :d3 | :b3 | :cx |
| :d2 | :b2 |     |
| :d1 | :b1 | :c1 |
| :d0 |     |     |
-------------------
:a3 is in the solution because


so we are doing

-------------------
| a   | b   | c   |
===================
| :a3 | :b3 | :c3 |
| :a2 | :b2 | :c2 |
| :a1 | :b1 | :c1 |
| :a0 | :b0 | :c0 |
-------------------
MINUS
-------------------
| d   | b   | c   |
===================
| :d3 | :b3 | :cx |
| :d2 | :b2 |     |
| :d1 | :b1 | :c1 |
| :d0 |     |     |
-------------------

http://www.w3.org/TR/sparql11-query/#defn_algMinus

Let's look at the solution where ?a=:a3 ?b=:b3 ?c=:c3

(?b=:b3 ?c=:c3) does not match (=join with) (?b=:b3 ?c=:cx)
because ?c is different.

(?b=:b2) is different in ?b

(?b=:b1 ?c=:c1) is different in ?b and in ?c

(?b=undef, ?c=undef) is covered by "dom(μ) and dom(μ') are disjoint" part of the definition. This exist because otherwise you end up removing everything with two unrelated results using MINUS. (c.f. SQL column compatibility rules)

Repeat for the other 3 rows.

        Andy


For your convenience: the test is:

prefix : <http://example/>

select ?a ?b ?c {
  ?a :p1 ?b; :p2 ?c
  MINUS {
    ?d a :Sub
    OPTIONAL { ?d :q1 ?b }
    OPTIONAL { ?d :q2 ?c }
  }
}
order by ?a

and the data

==============================
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix example: <http://example/> .

example:a0
    example:p1 example:b0 ;
    example:p2 example:c0 .

example:a1
    example:p1 example:b1 ;
    example:p2 example:c1 .

example:a2
    example:p1 example:b2 ;
    example:p2 example:c2 .

example:a3
    example:p1 example:b3 ;
    example:p2 example:c3 .

example:d0
    a example:Sub .

example:d1
    a example:Sub ;
    example:q1 example:b1 ;
    example:q2 example:c1 .

example:d2
    a example:Sub ;
    example:q1 example:b2 .

example:d3
    a example:Sub ;
    example:q1 example:b3 ;
    example:q2 example:cx .
==============================

Reply via email to