- From: Eric Prud'hommeaux <eric@w3.org>
- Date: Mon, 15 Nov 2004 19:50:41 +0900
- To: public-rdf-dawg@w3.org
Related to ACTION SimonR: explain how much of disjuction can be done with optionals, nested or otherwise. Point to references, problems with LEFT OUTER JOIN in the literature. In my experiments, I haven't found DISJUNCTION that I couldn't implement with OUTER JOINs. first create a holds table (MySQL syntax): CREATE TABLE holds (id INTEGER NOT NULL AUTO_INCREMENT, s VARCHAR(80), p VARCHAR(80), o VARCHAR(80), PRIMARY KEY(id)); INSERT INTO holds (id) VALUES (0); INSERT INTO holds (s, p, o) VALUES ('a1', 'foaf:mbox', 'mbox1'); INSERT INTO holds (s, p, o) VALUES ('a1', 'foaf:name', 'bob smith'); INSERT INTO holds (s, p, o) VALUES ('a2', 'foaf:mbox', 'mbox2'); INSERT INTO holds (s, p, o) VALUES ('a2', 'foaf:givenName', 'bob'); INSERT INTO holds (s, p, o) VALUES ('a2', 'foaf:family', 'smith'); -- extra data that we won't select: INSERT INTO holds (s, p, o) VALUES ('a1', 'foaf:knows', 'a2'); INSERT INTO holds (s, p, o) VALUES ('a1', 'foaf:bloodType', 'A-'); INSERT INTO holds (s, p, o) VALUES ('a2', 'foaf:bloodType', 'A+'); Unground Disjunction, symetric paths (doesn't require OUTER JOINs): (($a foaf:name $name) UNION ($a foaf:givenName $given)) triple store SQL query: SELECT h1.s AS a, (h1.p="foaf:name" ) AS _L1, (h1.p="foaf:givenName") AS _R1, h1.o AS _L1_name_R1_gvien FROM holds AS h1 WHERE ((h1.p="foaf:name") OR (h1.p="foaf:givenName")) +------+------+------+-------------------+ | a | _L1 | _R1 | _L1_name_R1_gvien | +------+------+------+-------------------+ | a1 | 1 | 0 | bob smith | | a2 | 0 | 1 | bob | +------+------+------+-------------------+ Ground Disjunction, assymetric paths: ($a foaf:mbox $mbox) (($a foaf:name $name) UNION (($a foaf:givenName $given) ($a foaf:family $family))) triple store SQL query: SELECT h1.s AS a, h1.o AS mbox, ( h2.s=h1.s AND h2.p="foaf:name" AND h3.id=0) AS _L1, ( h2.s=h1.s AND h2.p="foaf:givenName" AND h3.s=h1.s AND h3.p="foaf:givenName") AS _R1, h2.o AS _L1_name_R1_gvien, h3.o AS family FROM holds AS h1 LEFT OUTER JOIN holds AS h2 ON 1 LEFT OUTER JOIN holds AS h3 ON 1 WHERE h1.p="foaf:mbox" AND (( h2.s=h1.s AND h2.p="foaf:name" AND h3.id=0) OR ( h2.s=h1.s AND h2.p="foaf:givenName" AND h3.s=h1.s AND h3.p="foaf:givenName")) +------+-------+------+------+-------------------+--------+ | a | mbox | _L1 | _R1 | _L1_name_R1_gvien | family | +------+-------+------+------+-------------------+--------+ | a2 | mbox2 | 0 | 1 | bob | bob | | a1 | mbox1 | 1 | 0 | bob smith | NULL | +------+-------+------+------+-------------------+--------+ Unground Disjunction, assymetric paths: (($a foaf:name $name) UNION (($a foaf:givenName $given) ($a foaf:family $family))) triple store SQL query: SELECT h1.s AS a, ( h1.p="foaf:name" AND h2.id=0) AS _L1, ( h1.p="foaf:givenName" AND h2.s=h1.s AND h2.p="foaf:givenName") AS _R1, h1.o AS _L1_name_R1_gvien, h2.o AS family FROM holds AS h1 LEFT OUTER JOIN holds AS h2 ON 1 WHERE (( h1.p="foaf:name" AND h2.id=0) OR ( h1.p="foaf:givenName" AND h2.s=h1.s AND h2.p="foaf:givenName")) +------+------+------+-------------------+--------+ | a | _L1 | _R1 | _L1_name_R1_gvien | family | +------+------+------+-------------------+--------+ | a2 | 0 | 1 | bob | bob | | a1 | 1 | 0 | bob smith | NULL | +------+------+------+-------------------+--------+ -- -eric office: +1.617.258.5741 NE43-344, MIT, Cambridge, MA 02144 USA cell: +1.857.222.5741 (eric@w3.org) Feel free to forward this message to any list for any purpose other than email address distribution.
Received on Monday, 15 November 2004 11:31:44 UTC