Introduktion till grafdatabaser i SQL Server 2017

Inför kursstarten «MS SQL Server Developer» 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

Introduktion till grafdatabaser i SQL Server 2017
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.

Introduktion till grafdatabaser i SQL Server 2017
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.

Introduktion till grafdatabaser i SQL Server 2017

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

Introduktion till grafdatabaser i SQL Server 2017
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.

Introduktion till grafdatabaser i SQL Server 2017
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

Introduktion till grafdatabaser i SQL Server 2017
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

Introduktion till grafdatabaser i SQL Server 2017

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:

  1. is_edge
  2. is_node

SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'

Introduktion till grafdatabaser i SQL Server 2017

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).

Introduktion till grafdatabaser i SQL Server 2017

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_alias

Exempel

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'

Introduktion till grafdatabaser i SQL Server 2017
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'

Introduktion till grafdatabaser i SQL Server 2017
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'

Introduktion till grafdatabaser i SQL Server 2017
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)

Introduktion till grafdatabaser i SQL Server 2017

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.

Introduktion till grafdatabaser i SQL Server 2017

LĂ€s mer:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster