αα»ααααα
αΆααααααΎααααααα·ααααΆ
ααΌαααααΆααα·ααααααααααΆα ααααΊααΆαα
αα
αααα·ααααΆααααααΆαααα½ααααααΆααα’αααααααΆααααααααΌαααααΆααα·ααααααα αααα»αααααΆααΆαααααΎααΆαααΆαα
αααααααα·α αα·ααα
αα
αααα·ααααΆααααΈααα
αααα»ααααααααα α αΎααααααΆααααΈααααΎααΆαααΆαα½αααΌαααααΆααα·ααααααααααΆαααααα αα·α NoSQL αααα»αααΎαααΆαα½ααΆααΈααααΌαααααΆααα·ααααααααααΆα ααααΆααααααΆαααΆααααα
αααΎαα‘αΎαα αα
αααααααΎααΆαααΆαα½ααα·ααααααααΆααΆαα»αααααααα»αααααααΆα αα·αααααΉαααααΌαααααΆααα·ααααααααααααααααΈααα»ααααααα αααααΆαα NoSQL αα·αααΆαααααα·αααααΆαα ααΆααΉαααΆαα ααΆαα½αααΉαααΆαααΎαα‘αΎαααα
ααα½αααααααα·αααα αα·αααα αααααΌαααααΆααα·αααααα ααΆαααΆαααα
α»αααααααΎαααΆαα α αΎααα
ααααααααααΆααααααααΆαααααααα»αααααΆα α
ααα½α JOINs ααααΎαα‘αΎααααααα
ααΆααΆααα·αααΆαααα αααα»αααααΌααααΆααααααααΆααααααααααΆααααααΆααααααΎααΆαααΆαα½αααΆααΆαα»αααα (α§ααΆα αααααΆαααααΎ CTEs α‘αΎααα·α) ααα»ααααααΆααααααα ααααΆαααααααααΆαα αααα»ααααααΆαα½αααααΆααα αα»αααΆαααααΌαααααΆααα·ααααααααααΆα αα SQL Server ααααΎα±ααααΆααΆααααα½ααααα»αααΆααααααααααααααα·αααΆα αααΎαααααΆααΆαα»ααααα ααΆααααααΌαα·αααααα αα·ααααα½αααααΌαααΆαααααΎα±ααααΆαααα α αΎαααΌα ααααααααα·αααααΆααααααα½αααααααΌαααΆαααΎαα‘αΎαα ααΆαααααααα ααα½ααααααΌααααΆαααααΆααα
ααΌαααααΆααα·ααααααααααΆα ααααΊααΆααΆααΆαααα ααααα·αααααΆααααααΆαα±αααααααααααααα»αααααΆαα αα αα αααα·ααααΆαααααααΌαααΆαααααααΎααααΆαααααΆαααΌααααΌααΆααα αααα»αα§ααααΆα αααα IT αα αααα»ααααααααΌα ααΆ αααααΆαααααα αααααααααααααΆααααΉαααΆααααααααααα ααΆααα·ααΆααααααΆαααααααΆααα·ααααΆ ααΆαααααΆαα’αααΈααααα ααΆαααααΆαα’αααΈααα·ααα αα·αααααΉαααΆαα
αα»αααΆαααΌαααααΆααα·ααααααααααΆα αααα αααα»α SQL Server ααΊαααααααααααΆααααααΆααΈαααΌααααα·ααααααααΆαααααΆααααααααααΆαααΆαααααΆαα αα·αααΆαααααΆαααααααααααΆαααααααααΆαααα’α
ααααΌαα·ααααααααααΆα αα
ααααΆα ααααΊααΆαααα»αααα ααα»α ααααΌα (ααααΆαα ααααΆαα) αα·αααα (ααααΆαααααα ααα)α Vertices ααααΆαα±ααα’αααααΆα α αΎααααααααΆαα±αααααααααΆααααααα»αααααααα’αΆα ααΆαααααααΆαα
ααααΆα ααααΌαααααΆααα·ααααααααααΌα’αααααΆαααΆααααΆα ααααΌα αααααΆαααααααααα»αααααΉααααΈααααΆα ααα αα ααΆαααααααααα·ααααααααΊααααα αα·ααααα αα»αααααααααΊααΆαααααααααααααα·ααα ααα»α ααααΌα αα·ααααα ααΆααααααΆααααΊααΆααΆααααααΆααααααααΌαα
αα·αααΌα ααααΌαα·αααααααααααααα ααΌαααααΆααα·ααααααααααΆα αααααααα’αΆαα·ααΆααααααααΆαααααααααΆαα’αααααΆαα ααΌα αααα αα·αα αΆαααΆα αααααΆααααΆαααααααααααααΎαααααααα α¬ααΆααα·ααΈααααααααααα ααΆα’αΆα ααααΎαα ααΆαααΎααααΈαααααΎαααααΌαα·αααααααααα»αααααααΆααααααααΎαα vertex αα·α abstractions αααα
αα αααα»ααα·αααααααΆααααα αα α»ααααααααα ααααΆααααααααααΌααΆαααΆαα±ααααΆααα αα αααααααΆααααααααΎαα ααΎααααΈααααΎααααΌααααΆαααααα SQL Server 2017 αααααααΌααααααααΆαααΌαααααΆααα·ααααααααααΆα ααα α ααα»α ααααΌα αα·ααααααααααΆα ααααααΌαααΆαααααΆαααΆααααααααΆααΆαααααΈα NODE αα·α EDGE α αααα½αααααΆα ααααααΎαα»αααΆα T-SQL ααααΈα α ααΆ MATCH() α αααααΆααα»αααΆααααααααΌαααΆααααααΎαα‘αΎααα αααα»α SQL Server 2017 ααΆα’αΆα ααααΌαααΆαααααΎαα αααα»αααΌαααααΆααα·αααααααααααΆαααααΆααααααα’αααααααα·αα αΆαααΆα αααΆαααΆααααααααααΌαααααΆααα·ααααααααΆαα½αα‘αΎαα
α’αααααααααααααααααΌααααΆα αα
ααααααααααα α’αΆααΈααααα αα·αα’αααααααΎααααΆααααΆαααΆααααααα·ααΈαααααααΎααΆαααΆαα½ααα·ααααααααΆααααα αααΎαα‘αΎα αααααααααααααΉαααΆααΉαααΆαααααΎαααΆαααααα αα·αααΆαααΏααΆααα ααααΆαααααΆα αααααα·αααααααααααααΌααααααααΆαααΆααααα½ααααααΆαααααααααΆαααααΆαααααααααα»αααααααΆαα αα·ααΈααΆαααααααααααααααΆααααα αΆααΆα αααΎα αα·ααα½αα±ααααα½αααΆααααααααα αααα»αααα·αααααααΆααααααα±ααα
ααΆα αΆααααΌα ααΆαααααα·ααΈααΆα αααΎαααΉαααα½αααΆαα’αααααααααααααΈααΌαααααΆααα·ααααααααααΆα ααααΆαααα’ααΆααα
ααααΌαα·ααααααα ααΈααααΆαααααααα ααΉαααααΌααααΆα αα
α§ααΆα ααα:
ααΌααααα‘ααααΎαα§ααΆα ααααααα ααΆααααααααα’αααααΆααααααΆαααΆααΆαα»αααααα»ααααα·αα αα»ααααα·αααΆαααΆααααα α’αααααααααααα α’ααααααααααααααΆαααΆααααα α’ααααααααααααααΆαααααααααα α’αΆαααααααΎαααα»αα αα»αααΆααααΆαα ααΆα’αΆα ααΆαα ααα½αααααα·αααΆαα½ααα αααα»αααΆααΆαα»αααααααα ααα»αααααα ααααααα ααα½αααααααα·αααΎαα‘αΎα ααΆαααααΆααααΆαααααααα αααα»αααΌαααααΆααα·ααααααααααΆααααααααΆαααααα·ααΆαα ααΆαα·ααΆαααΆαααααα»αααΆααααααααΎαααΆααΆαα»αααααααααα·αααα·α ααΆααΆαα»αααααααα»αααΈααααΆα α¬ααααΆααααααααααααααααααααααααΆααααααα ααΌαααΎαααΈααααααα SQL Graph α’αΆα αααααααΆααααα αΆααααΆααααααααΆαααααα·αααααααααααΆααΆαα»ααααα
αααααΆααα§ααΆα αααααα α αΌαααΎααααααΎαααααΌαα·ααααααααΆααααα αααααΎαααΆααΆααα»ααααα·α EMP ααΆαα½αααααααααΆαα EMPNO αα·ααα½ααα α’αΉαααΈα’αA αααα ααα’α»ααα ααααααααΆαααααααΆα (α’αααααααααααα) αααααα·αααα·αα ααααααΆαααΆααα’ααα’αααΈααΆααΆαα»ααααααααΌαααΆααααααΆαα»ααααα»αααΆααΆαααα α αΎαα’αΆα ααααΌαααΆααα½ααααααααΎαα½ααα EMPNO ΠΈ α’αΉαααΈα’α.
ααααΆααααΆαααΆαααααααααααα αΆαααααΌααααΌαααΆα org ααΌα
ααααΆααΆαα½αααΉαααααα·α XNUMX ααααΆαααΆαααααα»ααα
αααα»ααααααααααααααΆααααααΆααα αα·αααα·αααΊααΆα
ααα»α
ααααΌαααααααΆα ααααΈααΆααΆα EMP. α’αααααΆα "αα·αααα·α" ααααΌαααΆαααααΆαααα
αααα½αααΆαααααααΆαααααα "αααααΌα" (ααΆαααΆααααα
) α αα
αααα»αααΆαααααααΆα αα αααααααΆααααΊααΆααααα½α (EDGE) αααααααΆααααααΆαα (NODEs) αααααα»ααααα·αα
ααααααααΎαααΆααΆαααααααΆα EMP αα·αααααααααααααα
ααΈααααααααΆαααααΆααααΆαααΆαααΎα
CREATE TABLE EMP
(EMPNO INT NOT NULL,
ENAME VARCHAR(20),
JOB VARCHAR(10),
MGR INT,
JOINDATE DATETIME,
SALARY DECIMAL(7, 2),
COMMISIION DECIMAL(7, 2),
DNO INT)
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '02-MAR-1970', 8000, NULL, 2),
(7499, 'ALLEN', 'SALESMAN', 7698, '20-MAR-1971', 1600, 3000, 3),
(7521, 'WARD', 'SALESMAN', 7698, '07-FEB-1983', 1250, 5000, 3),
(7566, 'JONES', 'MANAGER', 7839, '02-JUN-1961', 2975, 50000, 2),
(7654, 'MARTIN', 'SALESMAN', 7698, '28-FEB-1971', 1250, 14000, 3),
(7698, 'BLAKE', 'MANAGER', 7839, '01-JAN-1988', 2850, 12000, 3),
(7782, 'CLARK', 'MANAGER', 7839, '09-APR-1971', 2450, 13000, 1),
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, 1200, 2),
(7839, 'KING', 'PRESIDENT', NULL, '17-JUL-1971', 5000, 1456, 1),
(7844, 'TURNER', 'SALESMAN', 7698, '08-AUG-1971', 1500, 0, 3),
(7876, 'ADAMS', 'CLERK', 7788, '12-MAR-1973', 1100, 0, 2),
(7900, 'JAMES', 'CLERK', 7698, '03-NOV-1971', 950, 0, 3),
(7902, 'FORD', 'ANALYST', 7566, '04-MAR-1961', 3000, 0, 2),
(7934, 'MILLER', 'CLERK', 7782, '21-JAN-1972', 1300, 0, 1)
ααΌαααΆαααααααααα αΆαααΈαα»ααααα·αα
- αα»ααααα·αααΆαα½α EMPNO 7369 α’αα»αααααα 7902;
- αα»ααααα·αααΆαα½α EMPNO 7902 α’αααααααααααααΆαα 7566
- αα»ααααα·αααΆαα½α EMPNO 7566 α’αααααααααααααΆαα 7839
α₯α‘αΌααααααΌαααΎαααΆαααααΆααααα·ααααααααΌα
ααααΆαα
αααα»αααααααααααααΆα αααα½αα ααααΆαα EMPLOYEE ααΆααα»αααααααααΆα
αααΎα α αΎαααααΌαααΆαααααΆαααα
αααα½αααΆαααααααΆαααααα "αααααΌα" (EmplReportsTo) α EmplReportsTo ααΊααΆαααααααααααΆααααααα
ααΆααΆαααα (EDGE) ααα’αΆα ααΆααα»ααααααααααααα
αααααΎαααΆααΆαααααΆαα EmpNode
ααΆααααααααααααααααΆαααααααΎαααααΆααααΊααΆααααααΆααα αα αααααα αααααΎαααΆααΆα αααααααα ααΈαααα αα ααΆ NODE.
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
α₯α‘αΌαααα α αΌαααΎαααααααααα·ααααααααΈααΆααΆαααααααΆαα ααΆααααΆα αααα½αα αααααΆαα INSERT α αααα αΌααα·ααααααααΈααΆααΆαααααΆαααααα EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
αα
αααα»αααΆααΆαααααΆαααααα»ααα½ααααα·ααα $node_id_*
ααααααααΆαααααΆαααΈαααααΌαααΆααααααΆαα»αααΆ JSON α αα½αααααααα
αααααααΆααΆααααααΆααα»αααααααααααααααΆααα
αααααΎαααα (EDGE)
ααΆααααααΎαααΆααΆααααααΊαααααααα ααΉαααΆααααααΎαααΆααΆαααααΆαα ααΎααααααααΆααααααααΉα ααΆ EDGE.
CREATE TABLE empReportsTo(Deptno int) AS EDGE
α₯α‘αΌαααα α
αΌαααΎααααααααααΆαααααααααΆααα»ααααα·ααααααααΎαα½ααα EMPNO ΠΈ α’αΉαααΈα’α. ααΆααΆα org αααα αΆααααΆαα
αααΆααααΈααααααααα INSERT α.
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 1),
(SELECT $node_id FROM EmpNode WHERE id = 13),20);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 2),
(SELECT $node_id FROM EmpNode WHERE id = 6),10);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 3),
(SELECT $node_id FROM EmpNode WHERE id = 6),10)
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 4),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 5),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 6),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 7),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 8),
(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 9),
(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 10),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 11),
(SELECT $node_id FROM EmpNode WHERE id = 8),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 12),
(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 13),
(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 14),
(SELECT $node_id FROM EmpNode WHERE id = 7),30);
ααΆααΆααααααΆααα½αααααΈααΆαααααΆαααΎαα ααΈαα½α $edge_id
- ααΆααααααα’ααααααααΆαααααααα»ααααααα JSON α ααΈαααΆααααα ($from_id
ΠΈ $to_id
) ααααΆαα±ααααααΆαααααααααΆαααααΆααα ααΎαααΈαααααααααα’αΆα
ααΆααααααααααααααα·ααααααα αααα»αααααΈααααααΎααααα Deptno.
αα·αααααΆααααααααα
αα
αααα»ααα·αααααΆααααααααα sys.tables
ααΆααα½αααααΈααΈαα
- ααΊ_ααα
- is_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
α’ααα’ααα’αα
ααααα»αααααΆααααααΉαααααΆα ααααΆαααΈααΆαααα αααα»αααααΆααΆαααααΆα ααα ααΌαααααΆαααΆααΆαααααΆααααααΌαααΆααααααΆαααααα ααα»α α αΎαααΌαααααΆαααΆααΆααααααααΌαααΆααααααΆαααααααααααααΈααααααααΆααααααΆ (αααααΎααα ααΌα ααΆααααααΆααααα·α )α
αααααα MATCH
ααΆααααα ααααα· MATCH ααααΈ CQL (Cypher Query Language)α αααβααΆβαα·ααΈβααβααΆαβααααα·αααααΆαβαααα»αβααΆαβααΆααα½αβααααααβαααααααα·βααααβααααΆα ααα CQL α αΆααααααΎαααααααααα MATCH.
ααΆααααααααααα
MATCH (<graph_search_pattern>)
<graph_search_pattern>::=
{<node_alias> {
{ <-( <edge_alias> )- }
| { -( <edge_alias> )-> }
<node_alias>
}
}
[ { AND } { ( <graph_search_pattern> ) } ]
[ ,...n ]
<node_alias> ::=
node_table_name | node_alias
<edge_alias> ::=
edge_table_name | edge_alias
α§αα ααα
ααΌααααα‘ααααΎαα§ααΆα ααααα½αα ααα½αα
αααα½αααΆαααααααααα αΆααα»ααααα·αααα Smith αα·αα’ααααααααααααααααααΆααααΆαααΆααααα α
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR
FROM
empnode e, empnode e1, empReportsTo m
WHERE
MATCH(e-(m)->e1)
and e.ENAME='SMITH'
αααα½αααΆααααααααΊαααααΆααααΆαααααααααα»ααααα·α αα·αα’ααααααααααααααααα·αααΈααΈααααααΆαα Smithα ααααα·αααΎα’αααααααΆααααααααΌα ααΈαααααααααααΆαααααα»ααααα·αααΆααα’ααααΉαααααΌαααΆααααα αΆαααΆααααααα
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2
WHERE
MATCH(e-(m)->e1-(m1)->e2)
and e.ENAME='SMITH'
α αΎαα
α»αααααα ααααΎααααααΆαααα»ααααα·α αα·αα’ααααααααααααααααα·αααΈααΈα
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
MATCH(e-(m)->e1-(m1)->e2-(m2)->e3)
and e.ENAME='SMITH'
α₯α‘αΌαααα α
αΌαααΎαααααΆααααααΌααα·ααα
ααΎααααΈααα½αααΆαα
α
α αααΆααααα Smith α
SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
MATCH(e<-(m)-e1<-(m1)-e2<-(m2)-e3)
ααα ααααΈααααα·ααααΆα
SQL Server 2017 ααΆααααααΎααααα½αααΆααΆαααααααααΆααα ααααΆααααααααααααΆαααααααΌαααΆα IT α’αΆααΈαααααααΆα αααΎαα ααααααααΌααα SQL Graph ααΊααΆαααααααααααΆααααΆααα αααααΈααΆααΆαααααααααααααααααα ααΆααΆααα»αααΆααααααααααΆαααααα»αααΆαααααααααααΈααααααΆαααααααΆα ααα
αα»αααΆα SQL Graph ααααΌαααΆααα½ααααα αΌααααΆααααααααα αααα»ααααΆαααΈα SQL α ααααααΆαααΆααααα ααΌα αααααΆααααααΆαααα½α ααα αΎα SQL Server 2017 ααΆαααααααααααΌα ααΆααααααα
αα·αααΆαααΆαααΆαααααααααΆαα polymorphism α
- ααΆααααααααααΆαα unidirectional ααα»ααααααααααααΌαααΆαααΆααααα
- Edges αα·αα’αΆα ααααΎαα αα α»ααααααααΆααα½ααα $from_id αα·α $to_id αααααα½αααααΆαααα UPDATE ααΆαααα
- ααΆααα·αα’ααααααΆααα·αααααΌαααΆαααΆαααααα ααα»αααααα½αααα’αΆα ααα½αααΆααααααααΎ CTEsα
- ααΆαααΆααααααΆαααααααααααΆααααααα» OLTP αααα»αα’αααα αα αΆαα
- ααΆααΆαααααααα’αΆαααα (ααΆααΆαααααααα’αΆαααααααααΆαααααααΆαααααααα) ααΆααΆαααΌαααααΆαααααααα’αΆαααα αα·αααΆααααα·αααααΌαααΆαααΆααααααα
- ααααααααΆααΆα αα·αα’αααααΆααΆααα·αα’αΆα αααααΆαααΆααΆ NODE α¬ EDGE ααΆαααα
- αααα½αααααααΆααααΌαααααΆααα·αααααααα·αααααΌαααΆαααΆααααααα
- αα·αααΆααα·ααΈααααΆαα α¬ααααααα’ααααααα½αααΆα (α’ααααααα½αααΆα) ααΎααααΈαααααααααΆααΆαααααααΆαα ααΆααΆααΆαααααΆα ααααα
- αα·αααΆα GUI αααααΆαααααα αΆαααααΆα αααα ααα»αααα Power BI α’αΆα ααααΎααΆαα
α’αΆαβαααααα:
ααααα: www.habr.com