From 6a947f1ed6b2a68efe3a9efe4ea9c7a103d7b2dd Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 6 Feb 2020 12:23:43 +0100 Subject: [PATCH] more flexible triple concept with polymorphic subjects --- pgsql/drop_tables.sql | 4 +- pgsql/init.sql | 107 ++++++++++++++++++++++-------------------- 2 files changed, 57 insertions(+), 54 deletions(-) diff --git a/pgsql/drop_tables.sql b/pgsql/drop_tables.sql index adc92da..51ffb42 100644 --- a/pgsql/drop_tables.sql +++ b/pgsql/drop_tables.sql @@ -1,8 +1,8 @@ -- drop tables in the correct order, avoiding constraint violations +drop table texts; drop table triples; drop table events; -drop table texts; -drop table datatypes; drop table nodes; +drop table datatypes; drop table namespaces; diff --git a/pgsql/init.sql b/pgsql/init.sql index 166d48b..cc54f90 100644 --- a/pgsql/init.sql +++ b/pgsql/init.sql @@ -6,31 +6,30 @@ CREATE TABLE namespaces ( prefix text ); +CREATE TABLE datatypes ( + id smallserial NOT NULL primary key, + dtname text NOT NULL, + tablename text +); + CREATE TABLE nodes ( id bigserial NOT NULL primary key, namespace bigint, name text ); -CREATE TABLE datatypes ( - id serial NOT NULL primary key, - dtname text NOT NULL, - tablename text, - node bigint -); - CREATE TABLE events ( id bigserial NOT NULL primary key, - tstamp timestamp NOT NULL, - node bigint + tstamp timestamp NOT NULL // ??? better timestamptz? ); CREATE TABLE triples ( id bigserial NOT NULL primary key, - subject bigint NOT NULL, + stype smallint NOT NULL, + svalue bigint NOT NULL, predicate bigint NOT NULL, - datatype integer NOT NULL, - value bigint, + otype smallint NOT NULL, + ovalue bigint, creation bigint NOT NULL, deletion bigint ); @@ -41,36 +40,48 @@ CREATE TABLE texts ( text text NOT NULL ); -ALTER TABLE nodes OWNER TO fco; -ALTER TABLE datatypes OWNER TO fco; -ALTER TABLE namespaces OWNER TO fco; -ALTER TABLE triples OWNER TO fco; -ALTER TABLE texts OWNER TO fco; +ALTER TABLE nodes OWNER TO cco; +ALTER TABLE datatypes OWNER TO cco; +ALTER TABLE namespaces OWNER TO cco; +ALTER TABLE triples OWNER TO cco; +ALTER TABLE events OWNER TO cco; +ALTER TABLE texts OWNER TO cco; -- data -INSERT INTO namespaces (iri, prefix) - VALUES ('http://cyberconcepts.org/cco-common#', 'cco'); -INSERT INTO namespaces (iri, prefix) - VALUES ('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'rdf'); -INSERT INTO namespaces (iri, prefix) - VALUES ('http://www.w3.org/2000/01/rdf-schema#', 'rdfs'); +INSERT INTO events (tstamp) values (transaction_timestamp()); -INSERT INTO nodes (namespace, name) VALUES (1, 'Node'); -- 1 -INSERT INTO nodes (namespace, name) VALUES (2, 'type'); -- 2 -INSERT INTO nodes (namespace, name) VALUES (2, 'Property');-- 3 -INSERT INTO nodes (namespace, name) VALUES (2, 'Class'); -- 4 -INSERT INTO nodes (namespace, name) VALUES (1, 'Datatype');-- 5 +INSERT INTO namespaces (iri, prefix) + VALUES ('http://cyberconcepts.org/cco-common#', 'cco'); -- 1 +INSERT INTO namespaces (iri, prefix) + VALUES ('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'rdf'); -- 2 +INSERT INTO namespaces (iri, prefix) + VALUES ('http://www.w3.org/2000/01/rdf-schema#', 'rdfs'); -- 3 -INSERT INTO datatypes (dtname, tablename) VALUES ('node', 'nodes'); -- 1 -INSERT INTO datatypes (dtname, tablename) VALUES ('string', 'texts'); -- 2 -INSERT INTO datatypes (dtname) VALUES ('int'); -- 3 +INSERT INTO datatypes (dtname, tablename) VALUES ('namespace', 'namespaces'); -- 1 +INSERT INTO datatypes (dtname, tablename) VALUES ('node', 'nodes'); -- 2 +INSERT INTO datatypes (dtname, tablename) VALUES ('datatype', 'datatypes'); -- 3 +INSERT INTO datatypes (dtname, tablename) VALUES ('event', 'events'); -- 4 +INSERT INTO datatypes (dtname, tablename) VALUES ('triple', 'triples'); -- 5 +INSERT INTO datatypes (dtname, tablename) VALUES ('text', 'texts'); -- 6 +INSERT INTO datatypes (dtname) VALUES ('int'); -- 7 +INSERT INTO datatypes (dtname) VALUES ('float'); -- 8 +INSERT INTO datatypes (dtname) VALUES ('decimal'); -- 9 +INSERT INTO datatypes (dtname) VALUES ('timestamp'); -- 10 -INSERT INTO triples (subject, predicate, datatype, value) VALUES (1, 2, 1, 5); -INSERT INTO triples (subject, predicate, datatype, value) VALUES (2, 2, 1, 3); -INSERT INTO triples (subject, predicate, datatype, value) VALUES (3, 2, 1, 4); -INSERT INTO triples (subject, predicate, datatype, value) VALUES (4, 2, 1, 4); -INSERT INTO triples (subject, predicate, datatype, value) VALUES (5, 2, 1, 4); +INSERT INTO nodes (namespace, name) VALUES (2, 'type'); -- 1 +INSERT INTO nodes (namespace, name) VALUES (2, 'Property');-- 2 +INSERT INTO nodes (namespace, name) VALUES (3, 'Class'); -- 3 + +-- basic triples: type assignments for +-- type -> Property; Property, Class -> Class + +INSERT INTO triples (stype, svalue, predicate, otype, ovalue, creation) + VALUES (2, 1, 2, 2, 2, 1); +INSERT INTO triples (stype, svalue, predicate, otype, ovalue, creation) + VALUES (2, 2, 2, 2, 3, 1); +INSERT INTO triples (stype, svalue, predicate, otype, ovalue, creation) + VALUES (2, 3, 2, 2, 3, 1); -- indexes @@ -79,16 +90,14 @@ CREATE INDEX idx_prefix ON namespaces USING btree (prefix); CREATE INDEX idx_node_name ON nodes USING btree (namespace, name); -CREATE INDEX fki_datatype_node ON datatypes USING btree (node); - -CREATE INDEX fki_event_node ON events USING btree (node); - -CREATE INDEX fki_datatype ON triples USING btree (datatype); +CREATE INDEX fki_stype ON triples USING btree (stype); +CREATE INDEX fki_otype ON triples USING btree (otype); CREATE INDEX fki_creation ON triples USING btree (creation); CREATE INDEX fki_deletion ON triples USING btree (deletion); -CREATE INDEX idx_spo ON triples USING btree (subject, predicate, datatype, value); -CREATE INDEX idx_po ON triples USING btree (predicate, datatype, value); -CREATE INDEX idx_os ON triples USING btree (datatype, value, subject); +CREATE INDEX idx_spo ON triples USING btree + (stype, svalue, predicate, otype, ovalue); +CREATE INDEX idx_po ON triples USING btree (predicate, otype, ovalue); +CREATE INDEX idx_os ON triples USING btree (otype, ovalue, stype, svalue); CREATE INDEX fki_language ON texts USING btree (language); @@ -97,18 +106,12 @@ CREATE INDEX fki_language ON texts USING btree (language); ALTER TABLE ONLY nodes ADD CONSTRAINT namespace FOREIGN KEY (namespace) REFERENCES namespaces(id); -ALTER TABLE ONLY datatypes - ADD CONSTRAINT node FOREIGN KEY (node) REFERENCES nodes(id); - -ALTER TABLE ONLY events - ADD CONSTRAINT node FOREIGN KEY (node) REFERENCES nodes(id); - ALTER TABLE ONLY triples - ADD CONSTRAINT subject FOREIGN KEY (subject) REFERENCES nodes(id); + ADD CONSTRAINT stype FOREIGN KEY (stype) REFERENCES datatypes(id); ALTER TABLE ONLY triples ADD CONSTRAINT predicate FOREIGN KEY (predicate) REFERENCES nodes(id); ALTER TABLE ONLY triples - ADD CONSTRAINT datatype FOREIGN KEY (datatype) REFERENCES datatypes(id); + ADD CONSTRAINT otype FOREIGN KEY (otype) REFERENCES datatypes(id); ALTER TABLE ONLY triples ADD CONSTRAINT creation FOREIGN KEY (creation) REFERENCES events(id); ALTER TABLE ONLY triples