Introduktion till SQL Server 2017 Graph Databases

Innan kursstart "MS SQL Server Developer" Vi har förberett ytterligare en användbar översättning åt dig.

Grafdatabaser är en viktig teknik för databasproffs. Jag försöker följa innovationer och nya teknologier inom detta område och efter att ha arbetat med relations- och NoSQL-databaser ser jag att grafdatabasernas roll blir mer och mer. När man arbetar med komplexa hierarkiska data är inte bara traditionella databaser utan även NoSQL ineffektiva. Ofta, med ett ökat antal länknivåer och storleken på databasen, sker en minskning av prestanda. Och när relationerna blir mer komplexa ökar också antalet JOINs.

Naturligtvis finns det i relationsmodellen lösningar för att arbeta med hierarkier (till exempel genom att använda rekursiva CTE), men dessa är fortfarande lösningar. Samtidigt gör funktionaliteten i SQL Server-grafdatabaser det enkelt att hantera flera nivåer av hierarki. Både datamodellen och frågorna är förenklade, och därför ökar deras effektivitet. Minskar mängden kod avsevärt.

Grafdatabaser är ett uttrycksfullt språk för att representera komplexa system. Denna teknik används redan ganska flitigt inom IT-branschen inom områden som sociala nätverk, anti-bedrägerisystem, IT-nätverksanalys, sociala rekommendationer, produkt- och innehållsrekommendationer.

Grafdatabasfunktionaliteten i SQL Server är lämplig för scenarier där data är starkt sammankopplade och har väldefinierade relationer.

Grafisk datamodell

En graf är en uppsättning av hörn (noder, noder) och kanter (relationer, kant). Vertices representerar entiteter och kanter representerar länkar vars attribut kan innehålla information.

En grafdatabas modellerar enheter som en graf enligt definition i grafteorin. Datastrukturer är hörn och kanter. Attribut är egenskaper hos hörn och kanter. En anslutning är en anslutning av hörn.

Till skillnad från andra datamodeller prioriterar grafdatabaser relationer mellan enheter. Därför finns det inget behov av att beräkna relationer med hjälp av främmande nycklar eller på annat sätt. Det är möjligt att skapa komplexa datamodeller med endast vertex- och kantabstraktioner.

I dagens värld kräver modellering av relationer mer och mer sofistikerade tekniker. För att modellera relationer erbjuder SQL Server 2017 grafdatabasfunktioner. Topparna och kanterna på grafen representeras som nya typer av tabeller: NODE och EDGE. Graffrågor använder en ny T-SQL-funktion som heter MATCH(). Eftersom denna funktionalitet är inbyggd i SQL Server 2017 kan den användas i dina befintliga databaser utan att behöva göra någon databaskonvertering.

Fördelar med grafmodellen

Nuförtiden efterfrågar företag och användare applikationer som arbetar med mer och mer data, samtidigt som de förväntar sig hög prestanda och tillförlitlighet. Grafrepresentationen av data erbjuder ett bekvämt sätt att hantera komplexa relationer. Detta tillvägagångssätt löser många problem och hjälper till att få resultat inom ett givet sammanhang.

Det ser ut som att många applikationer kommer att dra nytta av grafdatabaser i framtiden.

Datamodellering: Från relationell till grafmodellering

Introduktion till SQL Server 2017 Graph Databases
Exempel

Låt oss titta på ett exempel på en organisationsstruktur med en hierarki av anställda: en anställd rapporterar till en chef, en chef rapporterar till en högre chef och så vidare. Beroende på det specifika företaget kan det finnas hur många nivåer som helst i den här hierarkin. Men i takt med att antalet nivåer ökar, blir det svårare och svårare att beräkna samband i en relationsdatabas. Det är ganska svårt att föreställa sig hierarkin av anställda, hierarkin i marknadsföring eller sociala medier. Låt oss se hur SQL Graph kan lösa problemet med att hantera olika nivåer av hierarki.

För det här exemplet, låt oss göra en enkel datamodell. Skapa en tabell över anställda EMP med id EMPNO och kolumn MGRA som pekar på ID för chefen (chefen) för den anställde. All information om hierarkin lagras i denna tabell och kan efterfrågas med hjälp av kolumner EMPNO и MGR.

Introduktion till SQL Server 2017 Graph Databases
Följande diagram visar också samma organisationsdiagrammodell med fyra kapslingsnivåer i en mer bekant form. Anställda är toppen av grafen från tabellen EMP. Entiteten "anställd" är kopplad till sig själv genom relationen "submits" (ReportsTo). I grafiska termer är en länk en kant (EDGE) som förbinder noder (NODER) för anställda.

Introduktion till SQL Server 2017 Graph Databases

Låt oss skapa ett vanligt bord EMP och lägg till värden där enligt diagrammet ovan.

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)

Bilden nedan visar de anställda:

  • anställd med EMPNO 7369 är underordnad 7902;
  • anställd med EMPNO 7902 underordnad 7566
  • anställd med EMPNO 7566 underordnad 7839

Introduktion till SQL Server 2017 Graph Databases
Låt oss nu titta på representationen av samma data i form av en graf. EMPLOYEE-noden har flera attribut och är länkad till sig själv genom en "submits"-relation (EmplReportsTo). EmplReportsTo är namnet på relationen.

Kanttabellen (EDGE) kan också ha attribut.

Introduktion till SQL Server 2017 Graph Databases
Skapa en nodtabell EmpNode

Syntaxen för att skapa en nod är ganska enkel: till uttrycket SKAPA BORD läggs till i slutet SOM NOD.

CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;

Låt oss nu konvertera data från en vanlig tabell till en grafisk. Nästa INFOGA infogar data från en relationstabell EMP.

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

Introduktion till SQL Server 2017 Graph Databases
I nodtabellen i en speciell kolumn $node_id_* värd-ID:t lagras som JSON. De återstående kolumnerna i denna tabell innehåller nodens attribut.

Skapa kanter (EDGE)

Att skapa en kanttabell är mycket likt att skapa en nodtabell, förutom att nyckelordet SOM KANT.

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Introduktion till SQL Server 2017 Graph Databases

Låt oss nu definiera relationer mellan anställda med hjälp av kolumner EMPNO и MGR. Organisationsschemat visar tydligt hur man skriver INFOGA.

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

Kanttabellen har tre kolumner som standard. Först, $edge_id — kantidentifierare i form av JSON. De andra två ($from_id и $to_id) representerar förhållandet mellan noder. Dessutom kan kanter ha ytterligare egenskaper. I vårt fall detta Avd.nr.

Systemvyer

I systemvy sys.tables Det finns två nya kolumner:

  1. är_kant
  2. är_nod

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

Introduktion till SQL Server 2017 Graph Databases

ssms

Objekt relaterade till grafer finns i mappen Graph Tables. Nodtabellsikonen är markerad med en prick och kanttabellikonen är markerad med två sammankopplade cirklar (som ser lite ut som glasögon).

Introduktion till SQL Server 2017 Graph Databases

MATCH uttryck

uttryck MATCH hämtat från CQL (Cypher Query Language). Detta är ett effektivt sätt att fråga egenskaperna hos en graf. CQL börjar med ett uttryck 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

Примеры

Låt oss titta på några exempel.

Frågan nedan visar de anställda som Smith och hans chef rapporterar till.

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 SQL Server 2017 Graph Databases
Följande fråga är för att hitta anställda och chefer på andra nivån för Smith. Om du tar bort erbjudandet VAR, då kommer alla anställda att visas som ett resultat.

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 SQL Server 2017 Graph Databases
Och slutligen en begäran om anställda och chefer 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 SQL Server 2017 Graph Databases
Låt oss nu ä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 SQL Server 2017 Graph Databases

Slutsats

SQL Server 2017 har etablerat sig som en komplett företagslösning för en mängd olika IT-behov. Den första versionen av SQL Graph är mycket lovande. Även trots vissa begränsningar finns det redan tillräckligt med funktionalitet för att utforska möjligheterna med grafer.

SQL Graph-funktionalitet är helt integrerad i SQL Engine. Men som redan nämnts har SQL Server 2017 följande begränsningar:

Inget stöd för polymorfism.

  • Endast enkelriktade länkar stöds.
  • Edges kan inte uppdatera sina $from_id och $to_id kolumner via UPDATE.
  • Transitiva stängningar stöds inte, men de kan erhållas med hjälp av CTE.
  • Begränsat stöd för OLTP-objekt i minnet.
  • Temporala tabeller (System-Versioned Temporal Table), tillfälliga lokala och globala tabeller stöds inte.
  • Tabelltyper och tabellvariabler kan inte deklareras som NODE eller EDGE.
  • Frågor över databaser stöds inte.
  • Det finns inget direkt sätt eller någon form av guide (trollkarl) att konvertera vanliga tabeller till graftabeller.
  • Det finns inget GUI för att visa grafer, men Power BI kan användas.

Introduktion till SQL Server 2017 Graph Databases

Läs mer:

Källa: will.com

Lägg en kommentar