- From: Seaborne, Andy <andy.seaborne@hp.com>
- Date: Fri, 10 Dec 2004 18:45:52 +0000
- To: "Eric Prud'hommeaux" <eric@w3.org>
- CC: public-rdf-dawg@w3.org
Eric Prud'hommeaux wrote: > In response to a thread on UNSAID in the comments list [1], I've > drafted a section on UNSAID [2]. Andy asked about implementing it on > an SQL-accessed triple store. I thought I'd share the answer with the > WG. I test for default negation by doing an outer join to the triple > in the positive and then constraining that part of that triple is > NULL: > > > CREATE TABLE holds (id INTEGER NOT NULL AUTO_INCREMENT, > s VARCHAR(80), p VARCHAR(80), o VARCHAR(80), > PRIMARY KEY(id)); > > -- _:a foaf:name "Alice" . > -- _:a foaf:page <http://work.example/alice> . > -- _:a foaf:workplaceHomepage <http://work.example/alice> . > -- _:b foaf:name "Bob" . > -- _:c foaf:name "Eve" . > -- _:c foaf:page <http://isp.example/eve> . > -- _:c foaf:workplaceHomepage <http://work.example/eve> . > > INSERT INTO holds (s, p, o) VALUES ('_:a', 'foaf:name', '"Alice"'); > INSERT INTO holds (s, p, o) VALUES ('_:a', 'foaf:page', '<http://work.example/alice>'); > INSERT INTO holds (s, p, o) VALUES ('_:a', 'foaf:workplaceHomepage', '<http://work.example/alice>'); > INSERT INTO holds (s, p, o) VALUES ('_:b', 'foaf:name', '"Bob"'); > INSERT INTO holds (s, p, o) VALUES ('_:c', 'foaf:name', '"Eve"'); > INSERT INTO holds (s, p, o) VALUES ('_:c', 'foaf:page', '<http://isp.example/eve>'); > INSERT INTO holds (s, p, o) VALUES ('_:c', 'foaf:workplaceHomepage', '<http://work.example/eve>'); > > -- SELECT ?name > -- WHERE ( ?x foaf:name ?name ) > -- UNSAID ( ?x foaf:mbox ?mbox ) That is query 1 from the doc but that runs on a different dataset. I'm guessing but I think the query should be: SELECT ?name WHERE ( ?x foaf:name ?name ) UNSAID ( ?x foaf:page ?mbox ) as the SQL below uses "foaf:page" > > SELECT h1.o AS name > FROM holds AS h1 > LEFT OUTER JOIN holds AS h2 ON h2.s=h1.s AND h2.p="foaf:page" > WHERE h1.p="foaf:name" > AND h2.o IS NULL > > -- +-------+ > -- | name | > -- +-------+ > -- | "Bob" | > -- +-------+ I get this result set. If the order is reversed i.e. SELECT ?name WHERE UNSAID ( ?x foaf:page ?mbox ) ( ?x foaf:name ?name ) I get: -------- | name | ======== -------- because the UNSAID has a more general pattern (?mbox is unbound so any person with foaf:page is rejected - that's all of them). (My query processor executes query in the order written at the moment). > > -- SELECT ?name ?homepage > -- WHERE ( ?x foaf:name ?name ) > -- OPTIONAL { ( ?x foaf:page ?homepage ) > -- UNSAID ( ?x foaf:workplaceHomepage ?homepage ) } > > SELECT h1.o AS name, h2.o AS homepage > FROM holds AS h1 > LEFT OUTER JOIN holds AS h2 ON h2.s=h1.s AND h2.p="foaf:page" > LEFT OUTER JOIN holds AS h3 ON h3.s=h1.s AND h3.p="foaf:workplaceHomepage" AND h2.o=h3.o > WHERE h1.p="foaf:name" > AND h3.o IS NULL > > -- +-------+--------------------------+ > -- | name | homepage | > -- +-------+--------------------------+ > -- | "Bob" | NULL | > -- | "Eve" | <http://isp.example/eve> | > -- +-------+--------------------------+ This is query 2 from the doc on the second dataset. I get: -------------------------------------- | name | homepage | ====================================== | "Bob" | | | "Alice" | | | "Eve" | <http://isp.example/eve> | -------------------------------------- which is different because I get a "Alice" row. ( ?x foaf:name ?name ) gets all three people. Then, _:a foaf:page <http://work.example/alice> matches the first triple pattern of the optional: ( ?x foaf:page ?homepage ) with ?homepage = <http://work.example/alice> Then for the UNSAID _:a foaf:workplaceHomepage <http://work.example/alice> exists, UNSAID is false, reject OPTIONAL. But that leaves ?name = "Alice" I expect: ( ?x foaf:name ?name ) OPTIONAL anything to pick ?name = "Alice" (and "Bob" and "Eve"). What ever is in "anything" does not influence outside the OPTIONAL. What am I missing? Andy > > > [1] http://lists.w3.org/Archives/Public/public-rdf-dawg-comments/2004Nov/thread.html#16 > [2] http://www.w3.org/2001/sw/DataAccess/rq23/#unsaid
Received on Friday, 10 December 2004 18:46:25 UTC