Pred začiatkom kurzu
Grafové databázy sú dôležitou technológiou pre databázových profesionálov. Snažím sa držať krok s inováciami a novými technológiami v tejto oblasti a po práci s relačnými a NoSQL databázami vidím, že úloha grafových databáz je čoraz dôležitejšia. Pri práci s komplexnými hierarchickými dátami sú neefektívne nielen tradičné databázy, ale aj NoSQL. Často, keď sa zvyšuje počet úrovní pripojenia a veľkosť databázy, výkon klesá. A ako sa vzťahy stávajú zložitejšími, zvyšuje sa aj počet JOINov.
Samozrejme, relačný model má riešenia pre prácu s hierarchiami (napríklad pomocou rekurzívnych CTE), ale stále ide o riešenia. Funkcionalita databáz grafov SQL Server vám zároveň umožňuje jednoducho zvládnuť viacero úrovní hierarchie. Dátový model aj dotazy sú zjednodušené, a preto sa zvyšuje ich efektivita. Množstvo kódu je výrazne znížené.
Grafové databázy sú expresívnym jazykom na reprezentáciu zložitých systémov. Táto technológia je už pomerne široko používaná v IT priemysle v oblastiach, ako sú sociálne siete, systémy boja proti podvodom, analýza IT sietí, sociálne odporúčania, odporúčania produktov a obsahu.
Funkcionalita grafovej databázy v SQL Serveri je vhodná pre scenáre, kde sú dáta vysoko prepojené a majú dobre definované vzťahy.
Grafový dátový model
Graf je množina vrcholov (uzlov) a hrán (vzťahy, hrana). Vrcholy predstavujú entity a hrany predstavujú vzťahy, ktorých atribúty môžu obsahovať informácie.
Databáza grafov modeluje entity ako graf, ako je definované v teórii grafov. Dátové štruktúry sú vrcholy a hrany. Atribúty sú vlastnosti vrcholov a hrán. Spojenie je spojenie vrcholov.
Na rozdiel od iných dátových modelov, grafové databázy uprednostňujú vzťahy medzi entitami. Preto nie je potrebné počítať vzťahy pomocou cudzích kľúčov alebo iných prostriedkov. Je možné vytvárať komplexné dátové modely iba pomocou vrcholových a okrajových abstrakcií.
V modernom svete si modelovanie vzťahov vyžaduje čoraz zložitejšie techniky. Na modelovanie vzťahov ponúka SQL Server 2017 funkcie grafovej databázy. Vrcholy a hrany grafu sú reprezentované ako nové typy tabuliek: NODE a EDGE. Grafové dotazy používajú novú funkciu T-SQL s názvom MATCH(). Keďže táto funkcia je zabudovaná do SQL Server 2017, možno ju použiť vo vašich existujúcich databázach bez potreby akejkoľvek konverzie.
Výhody grafového modelu
Firmy a používatelia dnes požadujú aplikácie, ktoré zvládajú čoraz viac údajov, pričom očakávajú vysoký výkon a spoľahlivosť. Reprezentácia údajov vo forme grafu ponúka pohodlný prostriedok na zvládnutie zložitých vzťahov. Tento prístup rieši mnohé problémy a pomáha dosiahnuť výsledky v danom kontexte.
Zdá sa, že mnohé aplikácie budú v budúcnosti využívať výhody grafových databáz.
Dátové modelovanie: od relačného po grafový model
Príklad
Pozrime sa na príklad organizačnej štruktúry s hierarchiou zamestnancov: zamestnanec sa hlási manažérovi, manažér sa hlási vyššiemu manažérovi atď. V závislosti od konkrétnej spoločnosti môže byť v tejto hierarchii ľubovoľný počet úrovní. Ale so zvyšujúcim sa počtom úrovní je výpočet vzťahov v relačnej databáze čoraz ťažší. Je dosť ťažké predstaviť si hierarchiu zamestnancov, hierarchiu v marketingu či prepojenia na sociálnych sieťach. Pozrime sa, ako môže SQL Graph vyriešiť problém spracovania rôznych úrovní hierarchie.
Pre tento príklad vytvoríme jednoduchý dátový model. Vytvorme si tabuľku zamestnancov EMP s ID EMPNO a stĺpec M.G.R., s uvedením identifikátora nadriadeného zamestnanca (manažéra). Všetky informácie o hierarchii sú uložené v tejto tabuľke a možno ich vyhľadávať pomocou stĺpcov EMPNO и M.G.R..
Nasledujúci diagram zobrazuje rovnaký model organizačnej štruktúry so štyrmi úrovňami vnorenia v známejšej forme. Zamestnanci sú vrcholy grafu z tabuľky EMP. Entita „zamestnanec“ je sama so sebou spojená spojením „submits“ (ReportsTo). Z hľadiska grafu je odkaz hranou (EDGE), ktorá spája uzly (NODE) zamestnancov.
Vytvorme si bežnú tabuľku EMP a pridajte tam hodnoty podľa vyššie uvedeného diagramu.
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)
Nasledujúci obrázok zobrazuje zamestnancov:
- zamestnanec s EMPNO 7369 poslúcha 7902;
- zamestnanec s EMPNO 7902 poslúchne 7566
- zamestnanec s EMPNO 7566 poslúchne 7839
Teraz sa pozrime na grafovú reprezentáciu tých istých údajov. Vrchol EMPLOYEE má niekoľko atribútov a je sám so sebou spojený vzťahom „podriadení“ (EmplReportsTo). EmplReportsTo je názov vzťahu.
Tabuľka okrajov (EDGE) môže tiež obsahovať atribúty.
Vytvorme tabuľku uzlov EmpNode
Syntax na vytvorenie uzla je celkom jednoduchá: k výrazu VYTVORIŤ TABUĽKU sa pridáva na koniec "AKO UZOL".
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
Teraz prevedieme údaje z bežnej tabuľky na grafovú. Ďalšie INSERT vkladá údaje z relačnej tabuľky EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
V tabuľke uzlov v špeciálnom stĺpci $node_id_*
identifikátor uzla je uložený ako JSON. Zvyšné stĺpce tejto tabuľky obsahujú atribúty uzla.
Vytváranie hrán (EDGE)
Vytvorenie tabuľky okrajov je veľmi podobné vytváraniu tabuľky uzlov, až na to, že sa použije kľúčové slovo "AKO OKRAJ".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Teraz definujme prepojenia medzi zamestnancami pomocou stĺpcov EMPNO и M.G.R.. Schéma organizačnej štruktúry jasne ukazuje, ako písať 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);
Predvolená tabuľka okrajov pozostáva z troch stĺpcov. Najprv, $edge_id
— identifikátor hrany vo forme JSON. Ďalšie dve ($from_id
и $to_id
) predstavujú spojenie medzi uzlami. Okrem toho môžu mať hrany ďalšie vlastnosti. V našom prípade je Deptno.
Systémové zobrazenia
V systémovom zobrazení sys.tables
objavili sa dva nové stĺpce:
- is_edge
- is_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
Objekty súvisiace s grafmi sa nachádzajú v priečinku Tabuľky grafov. Ikona tabuľky uzlov je označená bodkou a ikona tabuľky okrajov je označená dvoma spojenými kruhmi (trochu ako okuliare).
MATCH výraz
vyjadrenie MATCH prevzaté z CQL (Cypher Query Language). Toto je efektívny spôsob dotazovania na vlastnosti grafu. CQL začína výrazom MATCH.
syntax
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
príklady
Pozrime sa na niekoľko príkladov.
Dotaz nižšie zobrazuje zamestnancov, ktorým Smith a jeho manažér podliehajú.
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'
Nasledujúci dotaz slúži na nájdenie zamestnancov a manažérov druhej úrovne pre Smith. Ak odstránite vetu KDE, potom sa vo výsledku zobrazia všetci zamestnanci.
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'
A na záver žiadosť pre zamestnancov a manažérov tretieho stupňa.
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'
Teraz zmeňme smer, aby sme získali Smithových šéfov.
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)
Záver
SQL Server 2017 sa etabloval ako kompletné podnikové riešenie pre rôzne úlohy v oblasti IT. Prvá verzia SQL Graph je veľmi sľubná. Aj napriek určitým obmedzeniam už existuje dostatok funkcií na preskúmanie možností grafov.
Funkcia SQL Graph je plne integrovaná do SQL Engine. Ako však už bolo uvedené, SQL Server 2017 má nasledujúce obmedzenia:
Žiadna podpora polymorfizmu.
- Podporované sú iba jednosmerné pripojenia.
- Edge nemôže aktualizovať stĺpce $from_id a $to_id prostredníctvom UPDATE.
- Tranzitívne uzávery nie sú podporované, ale možno ich získať pomocou CTE.
- Podpora objektov OLTP v pamäti je obmedzená.
- Dočasné tabuľky (System-Versioned Temporal Table), dočasné lokálne a globálne tabuľky nie sú podporované.
- Typy tabuliek a premenné tabuľky nemožno deklarovať ako NODE alebo EDGE.
- Dopyty medzi databázami nie sú podporované.
- Neexistuje žiadny priamy spôsob alebo sprievodca na konverziu bežných tabuliek na tabuľky grafov.
- Neexistuje žiadne grafické rozhranie na zobrazenie grafov, ale môžete použiť službu Power BI.
Čítaj viac:
Zdroj: hab.com