Kursuse alguse eelĂ”htul oleme teie jaoks valmistanud veel ĂŒhe kasuliku tĂ”lke.
Graafikandmed on andmebaasiekspertide jaoks tÀhtis tehnoloogia. JÀlgin pidevalt uusi innovatsioone ja tehnoloogiaid selles valdkonnas ning pÀrast tööd relatsiooniliste ja NoSQL andmebaasidega nÀen, et graafikandmete roll kasvab pidevalt. Kompleksete hierarhiliste andmete töötlemisel ei ole mitte ainult traditsioonilised andmebaasid, vaid ka NoSQL efektiivselt toimivad. Tihti, kui seoste tasemed ja andmebaasi suurus suurenevad, vÀheneb jÔudlus. SuhtlemisvÔrkude keerukus suurendab JOINide arvu.
Loomulikult on relatsioonilises mudelis lahendusi hierarhiatega töötamiseks (nt rekursiivsed CTE-d), kuid need jÀÀvad endiselt ringtee lahendusteks. Samas vÔimaldab SQL Serveri graafikandmete funktsionaalsus hÔlpsasti töödelda mitut hierarhiasuhet. Andmemudel ja pÀringud muutuvad lihtsamaks, seega tÔuseb nende efektiivsus. Koodi maht vÀheneb mÀrkimisvÀÀrselt.
Graafide andmebaasid on vĂ€ljendusrikas keel keerukate sĂŒsteemide esitlemiseks. Seda tehnoloogiat kasutatakse juba ĂŒsna laialdaselt IT-sektoris sellistes valdkondades nagu sotsiaalmeedia, pettusevastased sĂŒsteemid, IT-vĂ”rkude analĂŒĂŒs, sotsiaalsed soovitused ning toote- ja sisu soovitused.
SQL Serveri graafide andmebaasi funktsioon sobib stsenaariumidesse, kus andmed on omavahel tihedalt seotud ja neil on selgelt mÀÀratletud seosed.
Graafide andmemudel
Graaf on tipude (sÔlmede, node) ja servade (seoste, edge) kogum. Tipud esindavad entiteete ja servad seoseid, mille atribuudid vÔivad sisaldada teavet.
Graafide andmebaas modelleerib entiteete graafina, nagu on mÀÀratletud graafiateoorias. Andmestruktuurid on tipud ja servad. Atribuudid on tipude ja servade omadused. Seos on tipude ĂŒhendus.
Erinevalt teistest andmemudelitest on graafikute andmebaasides prioriteediks osaluste omavahelised seosed. SeetÔttu ei ole vaja seoseid arvutada vÀliste vÔtmete vÔi muude meetodite abil. Saate luua keerulisi andmemudeleid, kasutades ainult tippe ja servi abstraktsioonidena.
Kaasaegses maailmas nĂ”uab seoste modelleerimine ĂŒha keerukamaid meetodeid. SQL Server 2017 pakub graafikute andmebaaside vĂ”imalusi seoste modelleerimiseks. Graafi tipud ja servad esitatakse uutena tabelitĂŒĂŒpidena: NODE ja EDGE. Graafile pĂ€ringute tegemiseks kasutatakse uut T-SQL funktsiooni nimega MATCH(). Kuna see funktsionaalsus on sisse ehitatud SQL Server 2017, saab seda kasutada teie olemasolevates andmebaasides ilma nende konverteerimiseta.
Graafikute mudeli kasutegur
Praegu nĂ”uavad ettevĂ”tted ja kasutajad rakendusi, mis suudavad hallata ĂŒha suuremat andmemahtu, samas oodates kĂ”rget jĂ”udlust ja usaldusvÀÀrsust. Andmete esitamine graafina pakub mugavaid vahendeid keeruliste seoste töötlemiseks. See lĂ€henemine aitab lahendada paljusid probleeme ning annab tulemusi kindlas kontekstis.
Tundub, et tulevikus saavad paljud rakendused kasu graafipÔhiste andmebaaside kasutamisest.
Andmemudeli loomine: suheline mudel graafimudeliks

NĂ€ide
Vaatame nĂ€idet organisatsioonilisest struktuurist, kus on töötajate hierarhia: töötaja allub juhile, juht vanemjuhile ning nii edasi. SĂ”ltuvalt konkreetsest ettevĂ”ttest vĂ”ib selles hierarhias olla erinev arv tasandeid. Kuid kui tasandite arv suureneb, muutub seoste arvutamine relatsioonilises andmebaasis ĂŒha keerulisemaks. On ĂŒsna keeruline esitada töötajate hierarhiat, turunduse hierarhiat vĂ”i suhteid sotsiaalmeedias. Vaatame, kuidas SQL Graph aitab lahendada erinevate hierarhiatasemete töötlemise probleemi.
Selle nÀite jaoks loome lihtsa andmemudeli. Loome töötajate tabeli EMP identifikaatoriga EMPNO ja veergudega MGR, mis viitab töötaja juhataja (juhi) identifikaatorile. KÔik hierarhia teave on salvestatud sellesse tabelisse ja seda saab pÀrida veergude kaudu. EMPNO ja MGR.

JĂ€rgmises joonises on kujutatud sama organisatsioonilise struktuuri mudelit nelja taseme sĂŒvenemisega tuttavamas vormis. Töötajad on graafiku tipud tabelist. EMP. Töötaja âemployeeâ on seotud iseendaga suhtega âallubâ (ReportsTo). Graafiteooria mĂ”istes on suhe â serv (EDGE), mis ĂŒhendab töötajate sĂ”lmeid (NODE).

Loo tavaline tabel EMP ja lisame sinna vÀÀrtused vastavalt ĂŒlaltoodud diagrammile.
Loo TABEL 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)Allpool toodud joonisel on nÀidatud töötajad:
- töötaja EMPNO 7369 allub 7902-le;
- töötaja EMPNO 7902 allub 7566-le
- töötaja EMPNO 7566 allub 7839-le.

NĂŒĂŒd vaatame neid andmeid graafina. Tipp EMPLOYEE omab mitmeid atribuute ja on omavahel seotud sidemete âalluvusâ (EmplReportsTo) kaudu. EmplReportsTo on sideme nimi.
Servade (EDGE) tabelis vÔivad samuti olla atribuute.

Loome sÔlmede tabeli EmpNode.
SĂ”lme loomise sĂŒntaks on ĂŒsna lihtne: vĂ€ljendi CREATE TABLE lĂ”ppu lisatakse âAS 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;NĂŒĂŒd muudame andmed tavalisest tabelist graafiks. JĂ€rgmine INSERT sisestab andmed relatsioonilisest tabelist. EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp 
SĂ”lmede tabelis on spetsiaalses veerus $node_id_* salvestatakse sĂ”lme identifikaator JSON-vormingus. ĂlejÀÀnud veergudes on selle tabeli sĂ”lme atribuudid.
Loome servad (EDGE).
Servade tabeli loomine on vĂ€ga sarnane sĂ”lmede tabeli loomisega, vĂ€lja arvatud see, et kasutatakse vĂ”ti sĂ”na âAS EDGEâ..
CREATE TABLE empReportsTo(Deptno int) AS EDGE. 
NĂŒĂŒd mÀÀratleme suhted töötajate vahel, kasutades veerge EMPNO ja MGR. Organisatsioonidiagrammil on selgelt nĂ€ha, kuidas kirjutada. 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); Vaikimisi servide tabel koosneb kolmest veerust. Esimene, $edge_id â JSON-vormis servatuvastus. Kaks muud ($from_id ja $to_id) esindavad seost sĂ”lmede vahel. Lisaks vĂ”ivad servadel olla tĂ€iendavad omadused. Meie puhul on need Deptno.
SĂŒsteemi vaated
SĂŒsteemi vaates sys.tables ilmunud kaks uut veergu:
- is_edge
- is_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%' 
SSMS
Graafikuga seotud objektid asuvad kaustas Graph Tables. SĂ”lmtabeli ikoonil on punkt ja servade tabelitel â kaks ĂŒhendatud ringi (mis meenutab veidi prille).

VĂ€ljend MATCH
VÀljend MATCH on pÀrit CQL-ist (Cypher Query Language). See on tÔhus viis graafi omaduste pÀrimiseks. CQL algab vÀljendiga MATCH.
SĂŒntaks
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_aliasNĂ€ited
Vaatame paar nÀidet.
Allolev pÀring nÀitab töötajaid, kelle alluvuses on Smith ja tema juht.
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' 
JÀrgmine pÀring on mÔeldud töötajate ja keskastme juhtide leidmiseks Smithi jaoks. Kui eemaldada lause WHERE, kuvatakse kÔik töötajad.
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' 
Ja lÔpuks, pÀring töötajate ja kolmanda taseme juhtide jaoks.
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' 
NĂŒĂŒd lĂ€heme suunda muutma, et leida Smithi ĂŒlemusi.
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) 
KokkuvÔte
SQL Server 2017 on ennast tĂ”estanud kui tĂ€ielik ettevĂ”tte lahendus erinevate IT-ĂŒlesannete jaoks. Esimene versioon SQL Graph on vĂ€ga paljutĂ”otav. Hoolimata mĂ”nest piirangust on juba praegu piisavalt funktsionaalsust graafide vĂ”imaluste uurimiseks.
SQL Graph funktsioon on tÀielikult integreeritud SQL Engine'isse. Siiski, nagu juba mainitud, on SQL Server 2017-l jÀrgmised piirangud:
PolĂŒmorfismi toetamist ei ole.
- Toetatakse ainult suunatud seoseid.
- Kaartel ei saa vÀrskendada veerge $from_id ja $to_id UPDATE korral.
- Transitiivsete sulgemiste toetamist ei ole, kuid neid saab saada CTE abil.
- Toetamine In-Memory OLTP objektide jaoks on piiratud.
- Temporaalsetel tabelitel (System-Versioned Temporal Table), ajutistel kohalikudel ja globaalsetel tabelitel toetamist ei ole.
- Tabeli tĂŒĂŒpe ja tabeli muutujaid ei saa kuulutada NODE'iks ega EDGE'iks.
- Andmebaaside vahelisi pÀringuid (cross-database queries) ei toetata.
- Puudub otsene viis vÔi mingisugune maagia (wizard) tavapÀraste tabelite konvertimiseks graafikuteks.
- Graafikute kuvamiseks puudub GUI, kuid Power BI-d saab kasutada.
Loe edasi:
Allikas: habr.com
