Introduksjon til grafdatabaser i SQL Server 2017

I forkynne for starten av kurset «MS SQL Server Developer» har vi forberedt en annen nyttig oversettelse for deg.

Grafdatabaser er en viktig teknologi for databasspesialister. Jeg prÞver Ä holde meg oppdatert pÄ innovasjoner og nye teknologier innen dette omrÄdet, og etter Ä ha arbeidet med bÄde relasjons- og NoSQL-databaser, ser jeg at rollen til grafdatabaser blir stadig viktigere. NÄr man arbeider med komplekse hierarkiske data, er bÄde tradisjonelle databaser og NoSQL lite effektive. Ofte, med Þkningen av antall nivÄer av relasjoner og stÞrrelsen pÄ databasen, observeres det en reduksjon i ytelse. NÄr relasjonene blir mer kompliserte, Þker antallet JOIN.

SelvfÞlgelig finnes det lÞsninger for Ä jobbe med hierarkier i den relasjonsmodellen (for eksempel ved hjelp av rekursive CTE-er), men det forblir fortsatt omveier. Samtidig tillater funksjonaliteten til grafdatabaser i SQL Server Ä hÄndtere flere nivÄer av hierarki enkelt. BÄde datamodellen og spÞrringene forenkles, noe som Þker effektiviteten. Mengden kode reduseres betydelig.

Grafdatabaser er et uttrykksfullt sprÄk for Ä representere komplekse systemer. Denne teknologien brukes allerede ganske mye i IT-bransjen innen omrÄder som sosiale medier, anti-svindelsystemer, IT-nettverksanalyse, sosiale anbefalinger, produkt- og innholdsanbefalinger.

Funksjonaliteten til grafdatabaser i SQL Server passer for scenarier hvor dataene er sterkt sammenknyttede og har klart definerte relasjoner.

Grafdatamodell

Grafen er et sett av noder (knuter, node) og kanter (relasjoner, edge). Noder representerer entiteter, mens kanter representerer forbindelser, hvor attributter kan inneholde informasjon.

Grafdatabasen modellerer entiteter i form av en graf, slik det er definert i grafteori. Datastrukturer er noder og kanter. Attributter er egenskaper ved noder og kanter. En relasjon er en forbindelse mellom noder.

I motsetning til andre datamodeller, prioriterer grafdatabaser relasjonene mellom entiteter. Derfor er det ikke nĂždvendig Ă„ beregne forbindelser ved hjelp av fremmednĂžkler eller andre metoder. Det er mulig Ă„ lage komplekse datamodeller ved kun Ă„ bruke abstraksjoner av noder og kanter.

I den moderne verden krever modellering av relasjoner stadig mer komplekse metoder. For modellering av relasjoner tilbyr SQL Server 2017 funksjoner fra grafdatabaser. Noder og kanter i grafen representeres som nye tabelltyper: NODE og EDGE. For spĂžrringer mot grafen brukes en ny T-SQL-funksjon kalt MATCH(). Siden denne funksjonaliteten er innebygd i SQL Server 2017, kan den brukes i dine eksisterende databaser uten behov for noen konvertering.

Fordelen med grafmodellen

I dag etterspĂžr bĂ„de bedrifter og brukere applikasjoner som fungerer med stadig stĂžrre datamengder, og som samtidig forventer hĂžy ytelse og pĂ„litelighet. Å representere data i form av grafer gir praktiske verktĂžy for Ă„ hĂ„ndtere komplekse relasjoner. Denne tilnĂŠrmingen lĂžser mange problemer og hjelper til med Ă„ oppnĂ„ resultater innenfor gitte rammer.

Det ser ut til at mange applikasjoner i fremtiden vil dra nytte av bruk av grafdatabaser.

Modellering av data: fra relasjonsmodell til grafmodell

Introduksjon til grafdatabaser i SQL Server 2017
Eksempel

La oss se pÄ et eksempel pÄ en organisasjonsstruktur med en hierarki av ansatte: en ansatt rapporterer til en manager, manageren rapporterer til en senior manager, og sÄ videre. Avhengig av selskapet kan det vÊre et hvilket som helst antall nivÄer i denne hierarkiet. Men med flere nivÄer blir beregningen av relasjoner i en relasjonsdatabase stadig mer komplisert. Det er ganske vanskelig Ä representere hierarkiet av ansatte, hierarkiet innen markedsfÞring eller relasjoner i sosiale medier. La oss se hvordan vi kan lÞse problemet med behandling av ulike nivÄer av hierarki ved hjelp av SQL Graph.

For dette eksemplet vil vi lage en enkel datamodell. Vi oppretter en tabell for ansatte EMP med et identifikator EMPNO og en kolonne MGR, som angir identifikatoren til lederen (manageren) for den ansatte. All informasjon om hierarkiet lagres i denne tabellen og kan forespĂžrres ved hjelp av kolonnene. EMPNO og MGR.

Introduksjon til grafdatabaser i SQL Server 2017
I det fÞlgende diagrammet vises den samme modellen for organisasjonsstruktur med fire nivÄer av innpakning i en mer kjent form. Ansatte er noder i grafen fra tabellen EMP. Entiteten «ansatt» er knyttet til seg selv med relasjonen «rapporterer til» (ReportsTo). I grafterminologi er en relasjon en kant (EDGE) som forbinder noder (NODE) av ansatte.

Introduksjon til grafdatabaser i SQL Server 2017

La oss lage en vanlig tabell EMP og legge til verdier i henhold til diagrammet over.

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)

I bildet nedenfor er ansatte vist:

  • ansatt med EMPNO 7369 rapporterer til 7902;
  • ansatt med EMPNO 7902 rapporterer til 7566
  • ansatt med EMPNO 7566 rapporterer til 7839

Introduksjon til grafdatabaser i SQL Server 2017
NÄ skal vi se pÄ representasjonen av de samme dataene i form av en graf. Toppen EMPLOYEE har flere attributter og er knyttet til seg selv gjennom forholdet 'rapporterer til' (EmplReportsTo). EmplReportsTo er navnet pÄ forholdet.

I kanten tabellen (EDGE) kan det ogsÄ vÊre attributter.

Introduksjon til grafdatabaser i SQL Server 2017
La oss lage en node-tabell EmpNode

Syntaksen for Ä opprette en node er ganske enkel: til uttrykket CREATE TABLE legges til pÄ slutten "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Ă„ konverterer vi dataene fra en vanlig tabell til en graf. Den fĂžlgende INSERT setter inn data fra den relasjonelle tabellen EMP.

INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp

Introduksjon til grafdatabaser i SQL Server 2017
I node-tabellen lagres identifikatoren til noden i JSON-format i en spesialkolonne $node_id_* De andre kolonnene i denne tabellen inneholder nodeattributter.

Vi lager kanter (EDGE)

Oppretting av en kant-tabell ligner veldig pÄ oppretting av en node-tabell, bortsett fra at nÞkkelordet "AS EDGE".

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Introduksjon til grafdatabaser i SQL Server 2017

La oss nÄ definere forholdene mellom ansatte ved hjelp av kolonnene EMPNO og MGR. Diagrammet av organisasjonsstrukturen viser godt hvordan man skriver 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);

Standarden for kanttabellen bestĂ„r av tre kolonner. Den fĂžrste, $edge_id — identifikatoren for kanten i JSON-format. De to andre ($from_id og $to_id) representerer forbindelse mellom noder. I tillegg kan kanter ha ekstra egenskaper. I vĂ„rt tilfelle er dette Deptno.

Systemvisninger

I systemvisningen sys.tables har det dukket opp to nye kolonner:

  1. is_edge
  2. is_node

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

Introduksjon til grafdatabaser i SQL Server 2017

SSMS

Objekter relatert til grafer ligger i mappen Graftabeller. Ikonet for nodetabell er merket med et punkt, mens kanttabeller har to sammenkoblede sirkler (som ligner litt pÄ briller).

Introduksjon til grafdatabaser i SQL Server 2017

Uttrykket MATCH

Uttrykk MATCH er hentet fra CQL (Cypher Query Language). Dette er en effektiv mÄte Ä forespÞrre egenskaper i grafen. CQL begynner med uttrykket MATCH.

Syntaks

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

Eksempler

La oss se pÄ noen eksempler.

SpĂžrringen under viser ansatte som rapporterer til Smith og hans leder.

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'

Introduksjon til grafdatabaser i SQL Server 2017
ForeslÄtt spÞrring er for Ä sÞke etter ansatte og mellomledere pÄ nivÄ to for Smith. Hvis vi fjerner setningen Den maksimale/minimale hurtig oppfriskningen etter sletting eller blandede DML har ikke samme oppfÞrsel som innsetting-tilfelle. Den sletter og beregner pÄ nytt maks/min verdiene for de berÞrte gruppene. Du mÄ vÊre oppmerksom pÄ dens ytelseseffekt., vil resultatene vise alle ansatte.

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'

Introduksjon til grafdatabaser i SQL Server 2017
Og til slutt, spÞrringen for ansatte og mellomledere pÄ nivÄ tre.

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'

Introduksjon til grafdatabaser i SQL Server 2017
La oss nÄ endre retning for Ä fÄ sjefene til 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)

Introduksjon til grafdatabaser i SQL Server 2017

Konklusjon

SQL Server 2017 har vist seg Ä vÊre en fullverdig bedriftslÞsning for ulike IT-oppgaver i virksomheten. Den fÞrste versjonen av SQL Graph er veldig lovende. Selv med noen begrensninger, er det allerede nÄ tilstrekkelig funksjonalitet for Ä utforske mulighetene med grafer.

SQL Graph-funksjonaliteten er fullt integrert i SQL Engine. Men som nevnt tidligere, har SQL Server 2017 fĂžlgende begrensninger:

Ingen stĂžtte for polymorfisme.

  • Kun enveiskommunikasjon stĂžttes.
  • Kan ikke oppdatere kolonnene $from_id og $to_id via UPDATE.
  • StĂžtte for transitive lukninger (transitive closure) mangler, men de kan hentes ut med CTE.
  • Begrenset stĂžtte for In-Memory OLTP objekter.
  • System-Versioned Temporal Table, temporĂŠre lokale og globale tabeller stĂžttes ikke.
  • Tabelltyper og tabellvariabler kan ikke deklareres som NODE eller EDGE.
  • ForespĂžrsel mellom databaser (cross-database queries) stĂžttes ikke.
  • Ingen direkte mĂ„te eller veiviser (wizard) for Ă„ konvertere vanlige tabeller til grafer.
  • Det finnes ingen GUI for fremstilling av grafer, men Power BI kan brukes.

Introduksjon til grafdatabaser i SQL Server 2017

Les mer:

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster