Introduksjon til SQL Server 2017 Graph Databases

Før kursstart "MS SQL Server Developer" Vi har utarbeidet en annen nyttig oversettelse for deg.

Grafdatabaser er en viktig teknologi for databasefagfolk. Jeg prøver å holde tritt med innovasjoner og nye teknologier på dette området, og etter å ha jobbet med relasjons- og NoSQL-databaser ser jeg rollen til grafdatabaser blir stadig viktigere. Når du arbeider med komplekse hierarkiske data, er ikke bare tradisjonelle databaser ineffektive, men også NoSQL. Ofte, etter hvert som antall tilkoblingsnivåer og størrelsen på databasen øker, reduseres ytelsen. Og etter hvert som relasjonene blir mer komplekse, øker også antallet JOINs.

Selvfølgelig har relasjonsmodellen løsninger for å jobbe med hierarkier (for eksempel ved bruk av rekursive CTE), men disse er fortsatt løsninger. Samtidig lar funksjonaliteten til SQL Server-grafdatabaser deg enkelt håndtere flere nivåer av hierarki. Både datamodellen og spørringene er forenklet, og derfor øker effektiviteten. Mengden kode er betydelig redusert.

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

Grafdatabasefunksjonaliteten i SQL Server er egnet for scenarier der data er svært sammenkoblet og har veldefinerte relasjoner.

Grafisk datamodell

En graf er et sett med toppunkter (noder) og kanter (relasjoner, kant). Topper representerer enheter, og kanter representerer relasjoner hvis attributter kan inneholde informasjon.

En grafdatabase modellerer enheter som en graf som definert i grafteori. Datastrukturer er hjørner og kanter. Attributter er egenskaper til toppunkter og kanter. En forbindelse er en forbindelse av toppunkter.

I motsetning til andre datamodeller, prioriterer grafdatabaser forhold mellom enheter. Derfor er det ikke nødvendig å beregne relasjoner ved å bruke fremmednøkler eller andre midler. Det er mulig å lage komplekse datamodeller ved å bruke kun toppunkt- og kantabstraksjoner.

I den moderne verden krever modellering av forhold stadig mer komplekse teknikker. For å modellere relasjoner tilbyr SQL Server 2017 grafdatabasefunksjoner. Toppunktene og kantene på grafen er representert som nye typer tabeller: NODE og EDGE. Grafspørringer bruker 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.

Fordeler med grafmodellen

I dag etterspør bedrifter og brukere applikasjoner som håndterer mer og mer data, samtidig som de forventer høy ytelse og pålitelighet. Å representere data som en graf er en praktisk måte å håndtere komplekse relasjoner på. Denne tilnærmingen løser mange problemer og bidrar til å oppnå resultater innenfor en gitt kontekst.

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

Datamodellering: fra relasjonell til grafmodell

Introduksjon til SQL Server 2017 Graph Databases
Eksempel

La oss se på et eksempel på en organisasjonsstruktur med et hierarki av ansatte: en ansatt rapporterer til en leder, en leder rapporterer til en seniorleder, og så videre. Avhengig av det spesifikke selskapet, kan det være et hvilket som helst antall nivåer i dette hierarkiet. Men etter hvert som antallet nivåer øker, blir det vanskeligere og vanskeligere å beregne relasjoner i en relasjonsdatabase. Det er ganske vanskelig å forestille seg hierarkiet til ansatte, hierarkiet i markedsføring eller forbindelser i sosiale nettverk. La oss se hvordan SQL Graph kan løse problemet med å håndtere ulike nivåer av hierarki.

For dette eksemplet skal vi lage en enkel datamodell. La oss lage en tabell over ansatte EMP med ID EMPNO og kolonne M.G.R., som indikerer identifikatoren til den ansattes overordnede (leder). All informasjon om hierarkiet er lagret i denne tabellen og kan spørres ved hjelp av kolonner EMPNO и M.G.R..

Introduksjon til SQL Server 2017 Graph Databases
Følgende diagram viser den samme organisasjonsstrukturmodellen med fire hekkingsnivåer i en mer kjent form. Ansatte er toppunktene i en graf fra en tabell EMP. Enheten "ansatt" er knyttet til seg selv ved tilkoblingen "sender inn" (ReportsTo). I grafiske termer er en lenke en kant (EDGE) som forbinder noder (NODE) ​​til ansatte.

Introduksjon til SQL Server 2017 Graph Databases

La oss lage et vanlig bord EMP og legg til verdiene der i samsvar med diagrammet ovenfor.

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)

Bildet under viser de ansatte:

  • ansatt med EMPNO 7369 adlyder 7902;
  • ansatt med EMPNO 7902 adlyder 7566
  • ansatt med EMPNO 7566 adlyder 7839

Introduksjon til SQL Server 2017 Graph Databases
La oss nå se på en grafrepresentasjon av de samme dataene. ANSATTE-toppunktet har flere attributter og er knyttet til seg selv av "underordnede"-forholdet (EmplReportsTo). EmplReportsTo er navnet på forholdet.

Kanttabellen (EDGE) kan også inneholde attributter.

Introduksjon til SQL Server 2017 Graph Databases
La oss lage en nodetabell EmpNode

Syntaksen for å lage en node er ganske enkel: til uttrykket LAG TABELL legges til på slutten "SOM 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;

La oss nå konvertere dataene fra en vanlig tabell til en grafisk. Neste INSERT setter inn data fra en relasjonstabell EMP.

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

Introduksjon til SQL Server 2017 Graph Databases
I tabellen over noder i en spesiell kolonne $node_id_* nodeidentifikatoren lagres som JSON. De resterende kolonnene i denne tabellen inneholder nodens attributter.

Lage kanter (EDGE)

Å lage en kanttabell ligner veldig på å lage en nodetabell, bortsett fra at nøkkelordet brukes "SOM KANT".

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Introduksjon til SQL Server 2017 Graph Databases

La oss nå definere forbindelser mellom ansatte ved hjelp av kolonner EMPNO и M.G.R.. Organisasjonsstrukturdiagrammet viser tydelig 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);

Standard kanttabellen består av tre kolonner. Først, $edge_id — kantidentifikator i JSON-form. De to andre ($from_id и $to_id) representerer forbindelsen mellom noder. I tillegg kan kanter ha tilleggsegenskaper. I vårt tilfelle er det det Deptnr.

Systemvisninger

I systemvisning sys.tables to nye kolonner har dukket opp:

  1. er_kant
  2. er_node

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

Introduksjon til SQL Server 2017 Graph Databases

ssms

Objekter relatert til grafer er plassert i mappen Graph Tables. Nodetabellikonet er merket med en prikk, og kanttabellikonet er merket med to sammenkoblede sirkler (litt som briller).

Introduksjon til SQL Server 2017 Graph Databases

MATCH uttrykk

uttrykket MATCH hentet fra CQL (Cypher Query Language). Dette er en effektiv måte å spørre etter egenskapene til en graf. CQL starter med et uttrykk 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

Примеры

La oss se på noen få eksempler.

Spørringen nedenfor viser de ansatte som Smith og hans leder rapporterer til.

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 SQL Server 2017 Graph Databases
Følgende spørring er for å finne ansatte og ledere på andre nivå for Smith. Hvis du fjerner setningen HVOR, så vil resultatet 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 SQL Server 2017 Graph Databases
Og til slutt, en forespørsel til ansatte og ledere 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'

Introduksjon til SQL Server 2017 Graph Databases
La oss nå endre retning for å få Smiths sjefer.

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 SQL Server 2017 Graph Databases

Konklusjon

SQL Server 2017 har etablert seg som en komplett bedriftsløsning for ulike IT-forretningsoppgaver. Den første versjonen av SQL Graph er veldig lovende. Selv til tross for noen begrensninger, er det allerede nok funksjonalitet til å utforske egenskapene til grafer.

SQL Graph-funksjonalitet er fullt integrert i SQL Engine. Som allerede nevnt har SQL Server 2017 imidlertid følgende begrensninger:

Ingen støtte for polymorfisme.

  • Kun enveisforbindelser støttes.
  • Edges kan ikke oppdatere kolonnene $from_id og $to_id via UPDATE.
  • Transitive lukkinger støttes ikke, men de kan fås ved hjelp av CTE.
  • Støtte for OLTP-objekter i minnet er begrenset.
  • Temporelle tabeller (systemversjonsbasert midlertidig tabell), midlertidige lokale og globale tabeller støttes ikke.
  • Tabelltyper og tabellvariabler kan ikke deklareres som NODE eller EDGE.
  • Forespørsler på tvers av databaser støttes ikke.
  • Det er ingen direkte måte eller veiviser for å konvertere vanlige tabeller til graftabeller.
  • Det er ingen GUI for å vise grafer, men du kan bruke Power BI.

Introduksjon til SQL Server 2017 Graph Databases

Les mer:

Kilde: www.habr.com

Legg til en kommentar