test2.sql
text/plain
-- from <https://docs.oracle.com/en/database/oracle/oracle-database/26/sqlrf/graph_table-operator.html>
CREATE TABLE university (
id INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
name VARCHAR(10),
CONSTRAINT u_pk PRIMARY KEY (id));
INSERT INTO university (name) VALUES ('ABC');
INSERT INTO university (name) VALUES ('XYZ');
CREATE TABLE persons (
person_id INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
name VARCHAR(10),
birthdate DATE,
height FLOAT DEFAULT 0,
person_data JSON,
CONSTRAINT person_pk PRIMARY KEY (person_id));
INSERT INTO persons (name, height, birthdate, person_data)
VALUES ('John', 1.80, to_date('13/06/1963', 'DD/MM/YYYY'), '{"department":"IT","role":"Software Developer"}');
INSERT INTO persons (name, height, birthdate, person_data)
VALUES ('Mary', 1.65, to_date('25/09/1982', 'DD/MM/YYYY'), '{"department":"HR","role":"HR Manager"}');
INSERT INTO persons (name, height, birthdate, person_data)
VALUES ('Bob', 1.75, to_date('11/03/1966', 'DD/MM/YYYY'), '{"department":"IT","role":"Technical Consultant"}');
INSERT INTO persons (name, height, birthdate, person_data)
VALUES ('Alice', 1.70, to_date('01/02/1987', 'DD/MM/YYYY'), '{"department":"HR","role":"HR Assistant"}');
CREATE TABLE students (
s_id INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
s_univ_id INTEGER,
s_person_id INTEGER,
subject VARCHAR(10),
CONSTRAINT stud_pk PRIMARY KEY (s_id),
CONSTRAINT stud_fk_person FOREIGN KEY (s_person_id) REFERENCES persons(person_id),
CONSTRAINT stud_fk_univ FOREIGN KEY (s_univ_id) REFERENCES university(id)
);
INSERT INTO students(s_univ_id, s_person_id,subject) VALUES (1,1,'Arts');
INSERT INTO students(s_univ_id, s_person_id,subject) VALUES (1,3,'Music');
INSERT INTO students(s_univ_id, s_person_id,subject) VALUES (2,2,'Math');
INSERT INTO students(s_univ_id, s_person_id,subject) VALUES (2,4,'Science');
CREATE TABLE friendships (
friendship_id INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
person_a INTEGER,
person_b INTEGER,
meeting_date DATE,
CONSTRAINT fk_person_a_id FOREIGN KEY (person_a) REFERENCES persons(person_id),
CONSTRAINT fk_person_b_id FOREIGN KEY (person_b) REFERENCES persons(person_id),
CONSTRAINT fs_pk PRIMARY KEY (friendship_id)
);
INSERT INTO friendships (person_a, person_b, meeting_date) VALUES (1, 3, to_date('01/09/2000', 'DD/MM/YYYY')); -- John -> Bob
INSERT INTO friendships (person_a, person_b, meeting_date) VALUES (2, 4, to_date('19/09/2000', 'DD/MM/YYYY')); -- Mary -> Alice
INSERT INTO friendships (person_a, person_b, meeting_date) VALUES (2, 1, to_date('19/09/2000', 'DD/MM/YYYY')); -- Mary -> John
INSERT INTO friendships (person_a, person_b, meeting_date) VALUES (3, 2, to_date('10/07/2001', 'DD/MM/YYYY')); -- Bob -> Mary
CREATE PROPERTY GRAPH students_graph
VERTEX TABLES (
persons KEY (person_id)
LABEL person
PROPERTIES (person_id, name, birthdate AS dob)
LABEL person_ht
PROPERTIES (height),
university KEY (id)
)
EDGE TABLES (
friendships AS friends
KEY (friendship_id)
SOURCE KEY (person_a) REFERENCES persons(person_id)
DESTINATION KEY (person_b) REFERENCES persons(person_id)
PROPERTIES (friendship_id, meeting_date),
students AS student_of
SOURCE KEY (s_person_id) REFERENCES persons(person_id)
DESTINATION KEY (s_univ_id) REFERENCES university(id)
PROPERTIES (subject)
);
SELECT *
FROM GRAPH_TABLE ( students_graph
MATCH (a IS person) -[e IS friends]-> (b IS person)
WHERE a.name = 'John'
COLUMNS (b.name)
);
-- result: Bob
SELECT *
FROM GRAPH_TABLE ( students_graph
MATCH (a IS person) <-[e IS friends]- (b IS person)
WHERE a.name = 'John'
COLUMNS (b.name)
);
-- result: Mary
SELECT *
FROM GRAPH_TABLE ( students_graph
MATCH (a IS person) -[e IS friends]- (b IS person)
WHERE a.name = 'John'
COLUMNS (b.name)
);
-- result: Mary, Bob