Inför kursstarten vi har förberett ytterligare en anvÀndbar översÀttning för dig.
Grafdatabaser Àr en viktig teknik för databasspecialister. Jag försöker hÄlla mig uppdaterad om innovationer och nya teknologier inom detta omrÄde, och efter att ha arbetat med relations- och NoSQL-databaser ser jag att rollen för grafdatabaser blir allt mer central. NÀr det gÀller komplexa hierarkiska data Àr traditionella databaser inte bara ineffektiva, utan Àven NoSQL. Ofta, med en ökning av antalet nivÄer av relationer och databasens storlek, observeras en minskning av prestanda. Och med en ökning av sambandens komplexitet ökar ocksÄ antalet JOIN.
SjÀlvklart finns det lösningar för att hantera hierarkier i den relationsbaserade modellen (till exempel med hjÀlp av rekursiva CTE), men det förblir iaf en kringgÄende vÀg. Samtidigt gör funktionaliteten i grafdatabaser i SQL Server det möjligt att enkelt hantera flera nivÄer av hierarkier. BÄde datamodellen och frÄgorna förenklas, vilket gör dem mer effektiva. MÀngden kod minskar avsevÀrt.
Grafdatabaser Àr ett uttrycksfullt sprÄk för att representera komplexa system. Denna teknik anvÀnds redan ganska brett inom IT-branschen i sÄdana omrÄden som sociala nÀtverk, anti-bedrÀgerisystem, analys av IT-nÀtverk, sociala rekommendationer, produkt- och innehÄllsrekommendationer.
Funktionaliteten i grafdatabaser i SQL Server passar för scenarier dÀr data Àr starkt sammankopplade och har tydligt definierade relationer.
Grafdatamodell
En graf Àr en mÀngd av noder (vertex, node) och kanter (edge, relationer). Noder representerar entiteter, och kanter representerar relationer, dÀr attribut kan innehÄlla information.
Grafdatabasen modellerar entiteter i form av en graf som den definieras i grafteori. Datatyperna Àr noder och kanter. Attribut Àr egenskaper hos noder och kanter. Relation Àr en koppling mellan noder.
Till skillnad frÄn andra datamodeller prioriterar grafdatabaser relationer mellan entiteter. DÀrför krÀvs det inte att berÀkna relationer med hjÀlp av frÀmmande nycklar eller pÄ andra sÀtt. Man kan skapa komplexa datamodeller med endast abstraktioner av noder och kanter.
I den moderna vÀrlden krÀver modellering av relationer allt mer komplexa metoder. För att modellera relationer erbjuder SQL Server 2017 funktioner för grafdatabaser. Noder och kanter i grafen representeras som nya tabelltyper: NODE och EDGE. För frÄgor till grafen anvÀnds en ny T-SQL-funktion som kallas MATCH(). Eftersom denna funktionalitet Àr inbyggd i SQL Server 2017 kan den anvÀndas i dina befintliga databaser utan att det krÀvs nÄgon konvertering.
Fördelarna med grafmodellen
För nÀrvarande krÀver företag och anvÀndare applikationer som hanterar allt större datamÀngder och förvÀntar sig hög prestanda och tillförlitlighet. Att presentera data som en graf erbjuder bekvÀma medel för att hantera komplexa relationer. Denna metod gör det möjligt att lösa mÄnga problem och hjÀlper till att fÄ resultat inom en given kontext.
Det verkar som att mÄnga applikationer i framtiden kommer att dra nytta av att anvÀnda grafdatabaser.
Datamodellering: frÄn relationsmodellen till grafmodellen

Exempel
LÄt oss titta pÄ ett exempel pÄ en organisationsstruktur med en hierarki av anstÀllda: en anstÀlld rapporterar till en chef, chefen till en seniorchef och sÄ vidare. Beroende pÄ det specifika företaget kan det finnas ett vilket antal nivÄer som helst i denna hierarki. Men med en ökning av nivÄerna blir berÀkning av relationer i en relationsdatabas allt svÄrare. Det Àr ganska utmanande att representera hierarkin av anstÀllda, hierarkin inom marknadsföring eller relationer i sociala medier. LÄt oss se hur SQL Graph kan lösa problemet med att hantera olika nivÄer av hierarki.
För detta exempel skapar vi en enkel datamodell. Vi kommer att skapa en tabell för anstÀllda EMP med identifieraren EMPNO och en kolumn MGR, som anger identifieraren för den anstÀlldes chef (manager). All information om hierarkin lagras i denna tabell och kan begÀras med hjÀlp av kolumnerna EMPNO och MGR.

I nÀsta diagram visas samma modell av organisationsstrukturen med fyra nivÄer av inbÀddning i ett mer bekant format. AnstÀllda Àr noder i grafen frÄn tabellen EMP. Entiteten "anstÀlld" Àr kopplad till sig sjÀlv genom relationen "rapporterar till" (ReportsTo). I termer av grafen Àr relationen en kant (EDGE) som kopplar ihop noder (NODE) av anstÀllda.

LÄt oss skapa en vanlig tabell EMP och lÀgga till vÀrden i enlighet med ovanstÄende diagram.
SKAPA TABELL 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)
INFOGA IN I EMP VĂRDEN
(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)PÄ bild nedan visas anstÀllda:
- den anstÀllde med EMPNO 7369 rapporterar till 7902;
- den anstÀllde med EMPNO 7902 rapporterar till 7566
- den anstÀllde med EMPNO 7566 rapporterar till 7839

Nu ska vi titta pĂ„ representationen av samma data som en graf. Noden ANSTĂLLD har flera attribut och Ă€r kopplad till sig sjĂ€lv genom relationen 'rapporterar till' (EmplReportsTo). EmplReportsTo Ă€r namnet pĂ„ relationen.
I kanttabellen (EDGE) kan det ocksÄ finnas attribut.

LÄt oss skapa nodtabellen EmpNode
Syntaxen för att skapa en nod Àr ganska enkel: till uttrycket SKAPA TABELL lÀggs till "AS NODE".
SKAPA TABELL dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) SOM NODE;Nu omvandlar vi data frĂ„n den vanliga tabellen till en graf. NĂ€sta INSĂTT infogar data frĂ„n den relationella tabellen EMP.
INFOGA IN I EmpNode(EMPNO,ENAME,MGR,DNO) VĂLJ empno,ename,MGR,dno FRĂ
N emp 
I nodtabellen finns i en sÀrskild kolumn $node_id_* lagras nodens identifierare som JSON. I övriga kolumner i denna tabell finns nodens attribut.
Vi skapar kanter (EDGE)
Att skapa kanttabellen liknar att skapa nodtabellen, med undantag för att nyckelordet "AS EDGE".
SKAPA TABELL empReportsTo(Deptno int) SOM EDGE 
Nu definierar vi relationerna mellan anstĂ€llda, med hjĂ€lp av kolumner EMPNO och MGR. PĂ„ organisationsdiagrammet kan man tydligt se hur man skriver INSĂTT.
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); StandardskĂ€rmarna för kanterna bestĂ„r av tre kolumner. Den första, $edge_id â Ă€r identifieraren för kanten i JSON-format. De tvĂ„ andra ($from_id och $to_id) representerar samband mellan noder. Dessutom kan kanter ha ytterligare egenskaper. I vĂ„rt fall Ă€r det Deptno.
Systemvyer
I systemvyn sys.tables har tvÄ nya kolumner tillkommit:
- is_edge
- is_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%' 
SSMS
Objekt som rör grafer finns i mappen Graph Tables. Ikonen för nodtabeller Ă€r markerad med en punkt, medan kant-tabellerna â med tvĂ„ sammanlĂ€nkade cirklar (vilket pĂ„minner om glasögon).

MATCH-uttrycket
Uttrycket MATCH Àr hÀmtat frÄn CQL (Cypher Query Language). Detta Àr ett effektivt sÀtt att frÄga om grafens egenskaper. CQL börjar med uttrycket 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_aliasExempel
LÄt oss titta pÄ nÄgra exempel.
FrÄgan nedan visar de anstÀllda som rapporterar till Smith och hans chef.
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' 
Denna frĂ„ga Ă€r avsedd för att söka efter anstĂ€llda och mellanchefer pĂ„ andra nivĂ„er för Smith. Om vi tar bort meningen DĂR, sĂ„ kommer alla anstĂ€llda att visas i resultatet.
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' 
Och slutligen, frÄgan för anstÀllda och mellanchefer pÄ tredje nivÄ.
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' 
Nu lÄt oss Àndra riktning för att fÄ Smiths chefer.
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) 
Slutsats
SQL Server 2017 har etablerat sig som en heltÀckande företagslösning för olika IT-utmaningar inom företag. Den första versionen av SQL Graph Àr mycket lovande. Trots vissa begrÀnsningar finns det redan nu tillrÀcklig funktionalitet för att utforska grafikens möjligheter.
Funktionen SQL Graph Àr helt integrerad i SQL-motorn. Men som redan nÀmnts har SQL Server 2017 följande begrÀnsningar:
Ingen stöd för polymorfism.
- Endast ensidiga relationer stöds.
- Kanter kan inte uppdatera kolumnerna $from_id och $to_id via UPDATE.
- Transitiva stÀngningar (transitive closure) stöds inte, men de kan Ästadkommas med hjÀlp av CTE.
- BegrÀnsat stöd för In-Memory OLTP-objekt.
- System-versionerade temporÀra tabeller, temporÀra lokala och globala tabeller stöds inte.
- Tabelltyper och tabellvariabler kan inte deklareras som NODE eller EDGE.
- FrÄgor mellan databaser (cross-database queries) stöds inte.
- Det finns inget direkt sÀtt eller nÄgon guide (wizard) för att konvertera vanliga tabeller till grafiska.
- Det finns ingen GUI för att visa grafiker, men Power BI kan anvÀndas.
LĂ€s mer:
KĂ€lla: habr.com
