Inden kursusstart
Grafdatabaser er en vigtig teknologi for databaseprofessionelle. Jeg forsøger at følge med innovationer og nye teknologier på dette område, og efter at have arbejdet med relationelle og NoSQL-databaser ser jeg grafdatabasernes rolle blive stadig vigtigere. Når man arbejder med komplekse hierarkiske data, er ikke kun traditionelle databaser ineffektive, men også NoSQL. Ofte falder ydeevnen efterhånden som antallet af forbindelsesniveauer og størrelsen af databasen øges. Og efterhånden som relationerne bliver mere komplekse, stiger antallet af JOINs også.
Relationsmodellen har selvfølgelig løsninger til at arbejde med hierarkier (for eksempel ved brug af rekursive CTE'er), men disse er stadig løsninger. Samtidig giver funktionaliteten af SQL Server grafdatabaser dig mulighed for nemt at håndtere flere niveauer af hierarki. Både datamodellen og forespørgsler er forenklet, og derfor øges deres effektivitet. Mængden af kode er væsentligt reduceret.
Grafdatabaser er et udtryksfuldt sprog til at repræsentere komplekse systemer. Denne teknologi er allerede meget udbredt i IT-branchen inden for områder som sociale netværk, anti-svindelsystemer, IT-netværksanalyser, sociale anbefalinger, produkt- og indholdsanbefalinger.
Grafdatabasefunktionaliteten i SQL Server er velegnet til scenarier, hvor data er meget indbyrdes forbundet og har veldefinerede relationer.
Grafisk datamodel
En graf er et sæt af hjørner (knuder) og kanter (relationer, kant). Hjørner repræsenterer enheder, og kanter repræsenterer relationer, hvis attributter kan indeholde information.
En grafdatabase modellerer enheder som en graf som defineret i grafteori. Datastrukturer er hjørner og kanter. Attributter er egenskaber ved toppunkter og kanter. En forbindelse er en forbindelse af hjørner.
I modsætning til andre datamodeller prioriterer grafdatabaser relationer mellem enheder. Derfor er der ikke behov for at beregne relationer ved hjælp af fremmednøgler eller andre midler. Det er muligt at skabe komplekse datamodeller ved kun at bruge vertex- og kantabstraktioner.
I den moderne verden kræver modellering af forhold stadig mere komplekse teknikker. For at modellere relationer tilbyder SQL Server 2017 grafdatabasefunktioner. Grafens toppunkter og kanter er repræsenteret som nye typer tabeller: NODE og EDGE. Grafforespørgsler bruger en ny T-SQL-funktion kaldet MATCH(). Da denne funktionalitet er indbygget i SQL Server 2017, kan den bruges i dine eksisterende databaser uden behov for nogen konvertering.
Fordele ved grafmodellen
I dag efterspørger virksomheder og brugere applikationer, der håndterer flere og flere data, mens de forventer høj ydeevne og pålidelighed. Repræsentation af data som en graf er et praktisk middel til at håndtere komplekse relationer. Denne tilgang løser mange problemer og hjælper med at opnå resultater inden for en given kontekst.
Det ser ud til, at mange applikationer vil drage fordel af at bruge grafdatabaser i fremtiden.
Datamodellering: fra relationel til grafmodel
Eksempel
Lad os se på et eksempel på en organisationsstruktur med et hierarki af medarbejdere: en medarbejder rapporterer til en leder, en leder rapporterer til en seniorleder og så videre. Afhængigt af den specifikke virksomhed kan der være et vilkårligt antal niveauer i dette hierarki. Men efterhånden som antallet af niveauer stiger, bliver det mere og mere vanskeligt at beregne relationer i en relationel database. Det er ret svært at forestille sig hierarkiet af medarbejdere, hierarki i markedsføring eller forbindelser i sociale netværk. Lad os se, hvordan SQL Graph kan løse problemet med at håndtere forskellige niveauer af hierarki.
Til dette eksempel vil vi lave en simpel datamodel. Lad os lave en tabel over medarbejdere EMP med ID EMPNO og kolonne MGR, med angivelse af identifikatoren for medarbejderens supervisor (leder). Al information om hierarkiet er gemt i denne tabel og kan forespørges ved hjælp af kolonner EMPNO и MGR.
Følgende diagram viser den samme organisationsstrukturmodel med fire niveauer af indlejring i en mere velkendt form. Medarbejdere er hjørnerne af en graf fra en tabel EMP. Enheden "medarbejder" er forbundet med sig selv ved forbindelsen "submits" (ReportsTo). I grafiske termer er et link en kant (EDGE), der forbinder noder (NODE) af medarbejdere.
Lad os lave en almindelig tabel EMP og tilføj værdierne der i overensstemmelse med ovenstående diagram.
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)
Billedet herunder viser medarbejderne:
- medarbejder med EMPNO 7369 adlyder 7902;
- medarbejder med EMPNO 7902 adlyder 7566
- medarbejder med EMPNO 7566 adlyder 7839
Lad os nu se på en grafrepræsentation af de samme data. Medarbejderens toppunkt har flere attributter og er forbundet med sig selv af forholdet "underordnede" (EmplReportsTo). EmplReportsTo er navnet på forholdet.
Kanttabellen (EDGE) kan også indeholde attributter.
Lad os oprette en node tabel EmpNode
Syntaksen for at skabe en node er ret enkel: til udtrykket Opret tabel tilføjes til sidst "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;
Lad os nu konvertere dataene fra en almindelig tabel til en graftabel. Næste INSERT indsætter data fra en relationstabel EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
I tabellen over noder i en speciel kolonne $node_id_*
node-id'et gemmes som JSON. De resterende kolonner i denne tabel indeholder nodens attributter.
Oprettelse af kanter (EDGE)
Oprettelse af en kanttabel minder meget om at oprette en nodetabel, bortset fra at nøgleordet bruges "SOM KANT".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Lad os nu definere forbindelser mellem medarbejdere ved hjælp af kolonner EMPNO и MGR. Organisationsstrukturdiagrammet viser tydeligt, 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);
Standardkanttabellen består af tre kolonner. Først, $edge_id
— kantidentifikator i JSON-form. De to andre ($from_id
и $to_id
) repræsenterer forbindelsen mellem noder. Derudover kan kanter have yderligere egenskaber. I vores tilfælde er det Afd.nr.
Systemvisninger
I systemvisning sys.tables
to nye kolonner er dukket op:
- er_kant
- er_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
Objekter relateret til grafer er placeret i mappen Graph Tables. Nodebordsikonet er markeret med en prik, og kantbordsikonet er markeret med to forbundne cirkler (lidt ligesom briller).
MATCH udtryk
ekspression MATCH taget fra CQL (Cypher Query Language). Dette er en effektiv måde at forespørge på egenskaber for en graf. CQL starter med et udtryk 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
Примеры
Lad os se på et par eksempler.
Forespørgslen nedenfor viser de medarbejdere, 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'
Følgende forespørgsel er til at finde medarbejdere og ledere på andet niveau for Smith. Hvis du fjerner sætningen HVOR, så vil resultatet vise alle medarbejdere.
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'
Og endelig en anmodning til medarbejdere og ledere på tredje niveau.
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'
Lad os nu skifte retning for at 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)
Konklusion
SQL Server 2017 har etableret sig som en komplet virksomhedsløsning til forskellige IT-forretningsopgaver. Den første version af SQL Graph er meget lovende. Selv på trods af nogle begrænsninger, er der allerede tilstrækkelig funktionalitet til at udforske grafernes muligheder.
SQL Graph-funktionalitet er fuldt integreret i SQL Engine. Som allerede nævnt har SQL Server 2017 imidlertid følgende begrænsninger:
Ingen polymorfi-støtte.
- Kun ensrettede forbindelser understøttes.
- Edges kan ikke opdatere kolonnerne $from_id og $to_id via UPDATE.
- Transitive lukninger understøttes ikke, men de kan fås ved hjælp af CTE.
- Understøttelse af OLTP-objekter i hukommelsen er begrænset.
- Temporale tabeller (System-Versioned Temporal Table), midlertidige lokale og globale tabeller understøttes ikke.
- Tabeltyper og tabelvariabler kan ikke erklæres som NODE eller EDGE.
- Forespørgsler på tværs af databaser understøttes ikke.
- Der er ingen direkte måde eller guide til at konvertere almindelige tabeller til graftabeller.
- Der er ingen GUI til at vise grafer, men du kan bruge Power BI.
Læs mere:
Kilde: www.habr.com