· 6 years ago · Jun 21, 2019, 01:06 AM
1CREATE TABLE IF NOT EXISTS edges (
2 src INT NOT NULL REFERENCES nodes(id) ON UPDATE CASCADE ON DELETE CASCADE
3 ,tgt INT NOT NULL REFERENCES nodes(id) ON UPDATE CASCADE ON DELETE CASCADE
4 ,rel TEXT NOT NULL
5 ,rel_type INT NOT NULL
6 ,PRIMARY KEY (src, tgt, rel)
7 ,UNIQUE (src, tgt, rel)
8 );
9
10select * from edges;
11 src | tgt | rel | rel_type
12-----+-----+-----------+----------
13 1 | 2 | 5.4.2.2 | 2
14 2 | 3 | 5.3.1.9 | 2
15 ...
16 5 | 6 | 2.7.1.2 | 1
17 5 | 6 | 2.7.1.147 | 1
18 6 | 2 | 5.3.1.9 | 2
19 6 | 3 | 5.3.1.9 | 2
20 ...
21
22ALTER TABLE edges ADD CONSTRAINT duplicate_rel_check CHECK ((src, tgt) <> (tgt, src) WHERE rel_type = 2);
23
24CREATE UNIQUE INDEX ON edge ( greatest(src, tgt, rel_type=2), least(tgt, src, rel_type=2) );