Chapter31_Examples
Chapter31_Examples
1
CREATE DATABASE graph_db;
GO;
USE graph_db;
CREATE TABLE dbo.Company (
ID INT NOT NULL PRIMARY KEY,
name VARCHAR (100) NULL,
sector VARCHAR(25) NULL,
city VARCHAR (100) NULL) AS NODE;
CREATE TABLE dbo.Employee (
ID INT NOT NULL PRIMARY KEY,
name VARCHAR (100) NULL,
age INT NULL,
sex char (10) NULL) AS NODE;
CREATE TABLE dbo.City (
ID INT NOT NULL PRIMARY KEY,
name VARCHAR(100) NULL,
stateName VARCHAR(100) NULL) AS NODE;
-- Example 31.2
USE graph_db;
INSERT INTO Employee (ID,Name,Sex)
VALUES (1,'Matthew Smith','Male');
INSERT INTO Employee (ID,Name,Sex)
VALUES (2,'Ann Jones','Female');
INSERT INTO Employee (ID,Name,Sex)
VALUES (3,'John Barrimore','Male');
INSERT INTO Employee (ID,Name,Sex)
VALUES (4,'James James','Male');
INSERT INTO Employee (ID,Name,Sex)
VALUES (5,'Elsa Bertoni','Female');
INSERT INTO Employee (ID,Name,Sex)
VALUES (6,'Elke Hansel','Female');
INSERT INTO Company VALUES (1,'Comp_A','Pharma','Kansas City');
INSERT INTO Company VALUES (2,'Comp_B','Manufacturing','Hoboken');
INSERT INTO Company VALUES (3,'Comp_C','Pharma','Indianopolis');
INSERT INTO Company VALUES (4,'Comp_D','IT','Lexington');
INSERT INTO Company VALUES (5,'Comp_E','IT','Madison');
INSERT INTO City VALUES (1,'Kansas City','Kansas');
INSERT INTO City VALUES (2,'Hoboken','New Jersey');
INSERT INTO City VALUES (3,'Indianopolis','Indiana');
INSERT INTO City VALUES (4,'Lexington','Kentucky');
INSERT INTO City VALUES (5,'Minneapolis','Wisconsin');
INSERT INTO City VALUES (6,'Madison','Wisconsin');
-- Example 31.3
USE graph_db;
CREATE TABLE WorksIn (starts INT) AS EDGE;
CREATE TABLE LocatedIn AS EDGE;
CREATE TABLE LivesIn (Since DATE NULL
CONSTRAINT Emp_to_City CONNECTION (Employee TO City)) AS EDGE;
-- Example 31.4
--To insert data into an edge table we need to provide the reference for
-- the $from_id and $to_id as a reference point to both nodes
USE graph_db;
INSERT INTO WorksIn VALUES ((SELECT $node_id FROM Employee WHERE id = 1),
(SELECT $node_id FROM Company WHERE id = 1), 2015);
INSERT INTO WorksIn VALUES ((SELECT $node_id FROM Employee WHERE id = 2),
(SELECT $node_id FROM Company WHERE id = 2), 2018);
INSERT INTO WorksIn VALUES ((SELECT $node_id FROM Employee WHERE id = 3),
(SELECT $node_id FROM Company WHERE id = 3), 2015);
INSERT INTO WorksIn VALUES ((SELECT $node_id FROM Employee WHERE id = 4),
(SELECT $node_id FROM Company WHERE id = 3), 2016);
INSERT INTO WorksIn VALUES ((SELECT $node_id FROM Employee WHERE id = 5),
(SELECT $node_id FROM Company WHERE id = 3), 2017);
INSERT INTO WorksIn VALUES ((SELECT $node_id FROM Employee WHERE id = 6),
(SELECT $node_id FROM Company WHERE id = 4), 2018);
-- Example 31.5
USE graph_db;
INSERT INTO LocatedIn VALUES ((SELECT $node_id FROM Company WHERE id = 1),
(SELECT $node_id FROM City WHERE id=2))
INSERT INTO LocatedIn VALUES ((SELECT $node_id FROM Company WHERE id = 2),
(SELECT $node_id FROM City WHERE id=1));
INSERT INTO LocatedIn VALUES ((SELECT $node_id FROM Company WHERE id = 3),
(SELECT $node_id FROM City WHERE id=3));
INSERT INTO LocatedIn VALUES ((SELECT $node_id FROM Company WHERE id = 4),
(SELECT $node_id FROM City WHERE id=2));
-- Example 31.6
USE graph_db;
INSERT INTO LivesIn VALUES ((SELECT $node_id FROM Employee WHERE id = 1),
(SELECT $node_id FROM City WHERE id=6), '1.1.2018');
INSERT INTO LivesIn VALUES ((SELECT $node_id FROM Employee WHERE id = 2),
(SELECT $node_id FROM City WHERE id=5), '2.1.2018');
INSERT INTO LivesIn VALUES ((select $node_id FROM Employee WHERE id = 3),
(SELECT $node_id FROM City WHERE id=4), '3.1.2018');
INSERT INTO LivesIn VALUES ((SELECT $node_id FROM Employee WHERE id = 4),
(SELECT $node_id FROM City WHERE id=2), '4.1.2018');
INSERT INTO LivesIn VALUES ((SELECT $node_id FROM Employee WHERE id = 5),
(SELECT $node_id FROM City WHERE id=3), '5.1.2018')
INSERT INTO LivesIn VALUES ((SELECT $node_id FROM Employee WHERE id = 6),
(SELECT $node_id FROM City WHERE id=1), '6.1.2018');
-- Example 31.7
-- Get the names of the companies and the names of their employees
USE graph_db;
SELECT DISTINCT Cmp.Name CName, Emp.Name EName
FROM Employee Emp, WorksIn, Company Cmp
WHERE MATCH(Emp-(WorksIn)->Cmp);
-- Example 31.8
-- Get the name of the company where Matthew Smith works
USE graph_db;
SELECT Cmp.Name CName
FROM Employee Emp, WorksIn, Company Cmp
WHERE MATCH(Emp-(WorksIn)->Cmp)
AND Emp.Name= 'Matthew Smith';
-- Example 31.9
-- Get the list of the employees who live in Madison
USE graph_db;
SELECT Emp.Name EName
FROM Employee Emp, LivesIn, City
WHERE MATCH(Emp-(LivesIn)->City)
AND City.Name='Madison';
-- Example 31.10
-- Get the list of companies located in the city of Hoboken
-- Sort the companies according to their names
USE graph_db;
SELECT Cmp.Name CName
FROM City C, LocatedIn, Company Cmp
WHERE MATCH(Cmp-(LocatedIn)->C)
AND C.Name='Hoboken' ORDER BY 1;
-- Example 31.11
USE graph_db;
SELECT Employee.name EName, Company.name CName
FROM Employee, WorksIn, Company, LocatedIn, City
WHERE MATCH(Employee-(WorksIn)->Company
AND Company-(LocatedIn)->City )
AND WorksIn.Starts='2017' AND Company.name='Comp_C';
-- Example 31.12
USE graph_db;
SELECT Employee.name, Company.name
FROM Employee, WorksIn, Company, LocatedIn, City
WHERE MATCH(Employee-(WorksIn)->Company-(LocatedIn)->City)
AND WorksIn.Starts='2017' and Company.name='Comp_C';
-- Example 31.13
-- Create an edge table for the recursive relationship
USE graph_db;
CREATE TABLE dbo.Is_Liked(start_date DATE) AS EDGE;
-- Insert several rows
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee WHERE ID = 1),
(SELECT $node_id FROM Employee WHERE ID = 2),'1.1.2017');
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee WHERE ID = 1),
(SELECT $node_id FROM Employee WHERE ID = 3),'2.1.2018');
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee WHERE ID = 1),
(SELECT $node_id FROM Employee WHERE ID = 4),'3.1.2019');
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee WHERE ID = 2),
(SELECT $node_id FROM Employee WHERE ID = 3),'4.1.2016');
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee WHERE ID = 2),
(SELECT $node_id FROM Employee WHERE ID = 5),'5.1.2017');
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee WHERE ID = 2),
(SELECT $node_id FROM Employee WHERE ID = 6),'6.1.2017');
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee where ID = 3),
(SELECT $node_id FROM Employee WHERE ID = 4),'7.1.2018');
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee where ID = 4),
(SELECT $node_id FROM Employee WHERE ID = 5),'8.1.2016');
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee where ID = 4),
(SELECT $node_id FROM Employee WHERE ID = 6),'9.1.2017');
INSERT INTO Is_Liked VALUES
((SELECT $node_id FROM employee where ID = 5),
(SELECT $node_id FROM Employee WHERE ID = 6),'10.1.2019');
-- Example 31.14
USE graph_db;
SELECT E1.name AS SourceName, E2.name AS TargetName
FROM Employee E1, Is_Liked, Employee E2
WHERE MATCH(E1-(Is_Liked)->E2);
-- Example 31.15
-- Display all employees that like Matthew Smith
USE graph_db;
SELECT E2.name AS FriendName
FROM Employee E1, Is_Liked, Employee E2
WHERE MATCH(E1-(Is_Liked)->E2)
AND E1.name = 'Matthew Smith';
-- Example 31.16
-- Display all employees who are liked by Matthew Smith
USE graph_db
SELECT E2.name AS FriendName
FROM Employee E1, Is_Liked, Employee E2
WHERE MATCH(E2-(Is_Liked)->E1) AND E1.name = 'Matthew Smith';
-- Example 31.17
-- Display all employees who like employees that like Ann Jones
USE graph_db;
SELECT Person3.name AS FriendName
FROM Employee Person1, Employee Person2,
Is_Liked, Is_Liked Is_Liked2, Employee Person3
WHERE MATCH(Person1-(Is_Liked)->Person2-(Is_Liked2)->Person3)
AND Person1.name = 'Ann Jones';
-- Example 31.18
USE graph_db;
INSERT into LivesIn VALUES ((SELECT $node_id FROM Employee WHERE id = 6),
(SELECT $node_id FROM City WHERE id = 5), '2.1.2018');
-- Example 31.19
USE graph_db;
SELECT E.Name, C.Name
FROM Employee E, LivesIn, City C
WHERE MATCH(E -(LivesIn)->C) AND E.id = 6 AND C.id = 5;
-- Example 31.20
USE graph_db;
DELETE FROM LivesIn
WHERE $from_id =(SELECT $node_id FROM Employee WHERE id = 6)
AND $to_id = (SELECT $node_id FROM City WHERE id = 5);
-- Example 31.21
USE graph_db;
DELETE LivesIn
FROM Employee E, LivesIn, City C
WHERE MATCH(E-(LivesIn)->C) AND E.id = 6 AND C.id = 5;
-- Example 31.22
USE graph_db;
UPDATE WorksIn SET Starts = 2020
WHERE $from_id = (SELECT $node_id FROM Employee WHERE id = 6)
AND $to_id = (SELECT $node_id FROM Company WHERE id = 1);
-- Example 31.23
USE graph_db;
SELECT name, is_node, is_edge
FROM sys.tables
WHERE is_node = 1 OR is_edge = 1;
-- Example 31.24
USE graph_db;
SELECT EC.name AS Edge_constraint
, OBJECT_NAME(EC.parent_object_id) AS Edge_table
, OBJECT_NAME(ECC.from_object_id) AS From_node_table
, OBJECT_NAME(ECC.to_object_id) AS To_node_table
FROM sys.edge_constraints EC
INNER JOIN sys.edge_constraint_clauses ECC
ON EC.object_id = ECC.object_id
WHERE EC.parent_object_id = object_id('LivesIn');
-- Example 31.25
USE graph_db;
SELECT NODE_ID_FROM_PARTS(OBJECT_ID('dbo.Company'), 0);
-- Example 31.26
DECLARE @table1 INT = OBJECT_ID('dbo.Company');
DECLARE @table2 INT = OBJECT_ID('dbo.City');
INSERT INTO LocatedIn ($from_id, $to_id)
VALUES (NODE_ID_FROM_PARTS(@table1, 1),
NODE_ID_FROM_PARTS(@table2, 2));
-- Example 31.27
USE graph_db;
CREATE TABLE dbo.Employee1 (
ID int NOT NULL PRIMARY KEY,
name varchar (100) NULL, sex char (10) NULL);
INSERT INTO Employee1 VALUES (1,'Matthew Smith','Male');
INSERT INTO Employee1 VALUES (2,'Ann Jones','FeMale');
INSERT INTO Employee1 VALUES (3,'John Barrimore','Male');
INSERT INTO Employee1 VALUES (4,'James James','Male');
INSERT INTO Employee1 VALUES (5,'Elsa Bertoni','FeMale');
INSERT INTO Employee1 VALUES (6,'Elke Hansel','FeMale');
-- Example 31.28
USE graph_db;
CREATE TABLE Employee1_Friend
(EmployeeID INT NOT NULL, FriendID INT);
INSERT INTO Employee1_Friend values (1,2)
INSERT INTO Employee1_Friend values (1,3)
INSERT INTO Employee1_Friend values (1,4)
INSERT INTO Employee1_Friend values (2,3)
INSERT INTO Employee1_Friend values (2,5)
INSERT INTO Employee1_Friend values (2,6)
INSERT INTO Employee1_Friend values (3,4)
INSERT INTO Employee1_Friend values (4,5)
INSERT INTO Employee1_Friend values (4,6)
INSERT INTO Employee1_Friend values (5,6)
-- Example 31.29
USE graph_db;
SELECT e1.name
FROM employee1 e1 JOIN Employee1_Friend
ON Employee1_Friend.FriendID = e1.ID JOIN employee1 e2
ON Employee1_Friend.EmployeeID = e2.ID
WHERE e2.name = 'Matthew Smith';
-- Example 31.30
USE graph_db;
SELECT e1.name
FROM employee1 e1 JOIN Employee1_Friend
ON Employee1_Friend.EmployeeID = e1.ID
JOIN employee1 e2
ON Employee1_Friend.FriendID = e2.ID
WHERE e2.name = 'Matthew Smith';
-- Example 31.31
USE graph_db;
SELECT e1.name AS EMP_Name, e2.name AS FriendOfFriend
FROM Employee1_Friend ef1 JOIN employee1 e1
ON ef1.EmployeeID = e1.ID
JOIN Employee1_Friend ef2 ON ef2.EmployeeID = ef1.FriendID
JOIN employee1 e2 ON ef2.FriendID = e2.ID
WHERE e1.name = 'Ann Jones' AND ef2.FriendID <> e1.ID;