Før kursstart
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
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..
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.
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
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.
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
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
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:
- er_kant
- er_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
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).
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'
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'
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'
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)
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.
Les mer:
Kilde: www.habr.com