If we redo our URIs table as a "resources" table, with literals as well as URIs, we have some more options.
CREATE TABLE resources ( id INT AUTO_INCREMENT PRIMARY KEY, # PRIMARY = UNIQUE and NOT NULL # either provide a uri uri BLOB, # or a literal_value, which might have a datatype and language literal_value BLOB, datatype INT, language VARCHAR(5), UNIQUE KEY (uri(64)) # length is just a tuning knob ); INSERT INTO resources (uri) VALUES ('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'); INSERT INTO resources (uri) VALUES ('http://www.w3.org/2000/10/swap/test/demo1/biology#Human'); INSERT INTO resources (uri) VALUES ('http://www.w3.org/2000/10/swap/test/demo1/biology#Dog'); INSERT INTO resources (uri) VALUES ('http://www.w3.org/2000/10/swap/test/demo1/friends-vocab#name'); INSERT INTO resources (uri) VALUES ('http://www.w3.org/2000/10/swap/test/demo1/friends-vocab#pet'); INSERT INTO resources (uri) VALUES ('http://www.w3.org/2000/10/swap/test/demo1/about-pat#pat'); INSERT INTO resources (uri) VALUES (NULL); # this is rover, who has no URI INSERT INTO resources (literal_value) VALUES ('Pat Smith'); INSERT INTO resources (literal_value) VALUES ('Patrick Smith'); INSERT INTO resources (literal_value) VALUES ('Rover'); mysql> select * from resources; +----+--------------------------------------------------------------+---------------+----------+----------+ | id | uri | literal_value | datatype | language | +----+--------------------------------------------------------------+---------------+----------+----------+ | 1 | http://www.w3.org/1999/02/22-rdf-syntax-ns#type | NULL | NULL | NULL | | 2 | http://www.w3.org/2000/10/swap/test/demo1/biology#Human | NULL | NULL | NULL | | 3 | http://www.w3.org/2000/10/swap/test/demo1/biology#Dog | NULL | NULL | NULL | | 4 | http://www.w3.org/2000/10/swap/test/demo1/friends-vocab#name | NULL | NULL | NULL | | 5 | http://www.w3.org/2000/10/swap/test/demo1/friends-vocab#pet | NULL | NULL | NULL | | 6 | http://www.w3.org/2000/10/swap/test/demo1/about-pat#pat | NULL | NULL | NULL | | 7 | NULL | NULL | NULL | NULL | | 8 | NULL | Pat Smith | NULL | NULL | | 9 | NULL | Patrick Smith | NULL | NULL | | 10 | NULL | Rover | NULL | NULL | +----+--------------------------------------------------------------+---------------+----------+----------+
Then we can have a simple table of triples:
CREATE TABLE triples ( subject INT NOT NULL, predicate INT NOT NULL, object INT NOT NULL, UNIQUE INDEX(subject, predicate, object), INDEX(predicate, object), INDEX(object, predicate) ); INSERT INTO triples VALUES (6, 4, 8); INSERT INTO triples VALUES (6, 4, 9); INSERT INTO triples VALUES (7, 4, 10); INSERT INTO triples VALUES (6, 1, 2); INSERT INTO triples VALUES (7, 1, 3); INSERT INTO triples VALUES (6, 5, 7); mysql> select * from triples; +---------+-----------+--------+ | subject | predicate | object | +---------+-----------+--------+ | 6 | 1 | 2 | | 6 | 4 | 8 | | 6 | 4 | 9 | | 6 | 5 | 7 | | 7 | 1 | 3 | | 7 | 4 | 10 | +---------+-----------+--------+ mysql> select s.id, s.uri, p.uri as "predicate", o.id, o.uri, o.literal_value as "lit" from triples, resources as s, resources as p, resources as o where s.id=triples.subject AND p.id=triples.predicate AND o.id=triples.object; +----+---------------------------------------------------------+--------------------------------------------------------------+----+---------------------------------------------------------+---------------+ | id | uri | predicate | id | uri | lit | +----+---------------------------------------------------------+--------------------------------------------------------------+----+---------------------------------------------------------+---------------+ | 6 | http://www.w3.org/2000/10/swap/test/demo1/about-pat#pat | http://www.w3.org/1999/02/22-rdf-syntax-ns#type | 2 | http://www.w3.org/2000/10/swap/test/demo1/biology#Human | NULL | | 6 | http://www.w3.org/2000/10/swap/test/demo1/about-pat#pat | http://www.w3.org/2000/10/swap/test/demo1/friends-vocab#name | 8 | NULL | Pat Smith | | 6 | http://www.w3.org/2000/10/swap/test/demo1/about-pat#pat | http://www.w3.org/2000/10/swap/test/demo1/friends-vocab#name | 9 | NULL | Patrick Smith | | 6 | http://www.w3.org/2000/10/swap/test/demo1/about-pat#pat | http://www.w3.org/2000/10/swap/test/demo1/friends-vocab#pet | 7 | NULL | NULL | | 7 | NULL | http://www.w3.org/1999/02/22-rdf-syntax-ns#type | 3 | http://www.w3.org/2000/10/swap/test/demo1/biology#Dog | NULL | | 7 | NULL | http://www.w3.org/2000/10/swap/test/demo1/friends-vocab#name | 10 | NULL | Rover | +----+---------------------------------------------------------+--------------------------------------------------------------+----+---------------------------------------------------------+---------------+
15 of 20 |