W3C home > Mailing lists > Public > public-rdf-dawg@w3.org > July to September 2009

MINUS vs. UNSAID

From: Eric Prud'hommeaux <eric@w3.org>
Date: Mon, 6 Jul 2009 16:04:55 -0400
To: public-rdf-dawg@w3.org
Message-ID: <20090706200455.GE6387@w3.org>
I've been noodling on this for a while, trying to see practical
differences between MINUS (evaluated purely bottom-up) and UNSAID
(which appears to seed the outermost BGP with variable bindings from
outside).

I implemented UNSAID probably 6 years ago in Algae2, and I complained
bitterly that the bottom-up semantics of SPARQL were confusing for
users. Despite that, I have to say that MINUS is much more clear to me
as UNSAID carries variable bindings into nested evaluations in ways I
don't fully understand.

Following are some thought experiments (doing subtraction by hand):

Data D1: { :a1 :p1 :b1 ; 
               :p2 :c1 . 
           :c1 :p3 :b2 }

Query M1: { ?a :p1 ?b MINUS { ?a :p2 ?c . ?c :p3 ?b } }
  ?a ?b - ?a ?b ?c = ?a ?b
  a1 b1   a1 b2 c1   a1 b1
Result M1: ?a ?b
           a1 b1

Query M2: { ?a :p1 ?b MINUS { ?a :p2 ?c OPTIONAL { ?c :p3 ?b } } }
  ?a ?b - ?a ?b ?c = ?a ?b
  a1 b1   a1 b2 c1   a1 b1
Result M2: ?a ?b
           a1 b1


AndyS performed these on ARQ's UNSAID implementation:

Query U1: { ?a :p1 ?b UNSAID { ?a :p2 ?c . ?c :p3 ?b } }
Result U1: ?a ?b
           a1 b1

Query U2: { ?a :p1 ?b UNSAID { ?a :p2 ?c OPTIONAL { ?c :p3 ?b } } }
Result U2: ?a ?b  # no bindings

AndyS, could you tell me what you get when you try Query U2 on:?
Data D2: { :a1 :p1 :b1 ; 
               :p2 :c1 } # no :p3 arc
I expect the same as U2.


Looking for real-world questions which would elicit these differences:

Data D3
_:eric :givenname "eric"; :holdsAccout <act1>. <act1> :accountName "eric".
_:bobS :givenname "bob" ; :holdsAccout <act2>. <act2> :accountName "bobs".
_:eve  :givenname "eve" ; :holdsAccout <act3>.
(
 or in tabular form for brevity:
        givenname holdsAccount accountName
 _:eric "eric"    <act1>       "eric"
 _:bobS "bob"     <act2>       "bobs"
 _:eve  "eve"     <act3>
)

Find the folks for whom I need to create accounts based on their given name:

Query M3: 
?who foaf:givenname ?name
MINUS {
  ?who foaf:holdsAccount ?act 
  OPTIONAL {
    ?act foaf:accountName ?name .
  }
}
Result M3:
?who   ?name    ?who   ?act   ?name    ?who   ?name 
_:eric "eric"   _:eric <act1> "eric"   _:bobS "bob" 
_:bobS "bob"  - _:bobS <act2> "bobS" = _:eve  "eve" 
_:eve  "eve"    _:eve  <act3>	       


Query U3: 
?who foaf:givenname ?name
MINUS {
  ?who foaf:holdsAccount ?act 
  OPTIONAL {
    ?act foaf:accountName ?name .
  }
}

Result U3 (extrapolated from UNSAID results above):
?who   ?nam  
_:eve  "eve" 



Note, these are untested, please verify.
-- 
-eric

office: +1.617.258.5741 32-G528, MIT, Cambridge, MA 02144 USA
mobile: +1.617.599.3509

(eric@w3.org)
Feel free to forward this message to any list for any purpose other than
email address distribution.

There are subtle nuances encoded in font variation and clever layout
which can only be seen by printing this message on high-clay paper.
Received on Monday, 6 July 2009 20:05:37 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 16:15:39 GMT