Voor aanvang van de cursus
Grafiekdatabases zijn een belangrijke technologie voor databaseprofessionals. Ik probeer de innovaties en nieuwe technologieën op dit gebied bij te houden en na het werken met relationele en NoSQL-databases zie ik de rol van grafendatabases steeds belangrijker worden. Bij het werken met complexe hiërarchische gegevens zijn niet alleen traditionele databases ineffectief, maar ook NoSQL. Naarmate het aantal verbindingsniveaus en de omvang van de database toenemen, nemen de prestaties vaak af. En naarmate de relaties complexer worden, neemt ook het aantal JOINs toe.
Natuurlijk heeft het relationele model oplossingen voor het werken met hiërarchieën (bijvoorbeeld door gebruik te maken van recursieve CTE's), maar dit zijn nog steeds tijdelijke oplossingen. Tegelijkertijd kunt u dankzij de functionaliteit van SQL Server-grafiekdatabases eenvoudig met meerdere hiërarchieniveaus omgaan. Zowel het datamodel als de queries zijn vereenvoudigd, waardoor de efficiëntie toeneemt. De hoeveelheid code wordt aanzienlijk verminderd.
Grafiekdatabases zijn een expressieve taal voor het weergeven van complexe systemen. Deze technologie wordt al op grote schaal gebruikt in de IT-industrie op gebieden als sociale netwerken, fraudebestrijdingssystemen, IT-netwerkanalyse, sociale aanbevelingen, product- en inhoudaanbevelingen.
De grafiekdatabasefunctionaliteit in SQL Server is geschikt voor scenario's waarin gegevens sterk met elkaar verbonden zijn en goed gedefinieerde relaties hebben.
Grafiekgegevensmodel
Een grafiek is een verzameling hoekpunten (knooppunten) en randen (relaties, rand). Hoekpunten vertegenwoordigen entiteiten, en randen vertegenwoordigen relaties waarvan de attributen informatie kunnen bevatten.
Een grafendatabase modelleert entiteiten als een grafiek zoals gedefinieerd in de grafentheorie. Datastructuren zijn hoekpunten en randen. Attributen zijn eigenschappen van hoekpunten en randen. Een verbinding is een verbinding van hoekpunten.
In tegenstelling tot andere datamodellen geven grafiekdatabases prioriteit aan relaties tussen entiteiten. Daarom is het niet nodig om relaties te berekenen met behulp van externe sleutels of andere middelen. Het is mogelijk om complexe datamodellen te maken met alleen hoekpunt- en randabstracties.
In de moderne wereld vereist het modelleren van relaties steeds complexere technieken. Om relaties te modelleren biedt SQL Server 2017 mogelijkheden voor grafische databases. De hoekpunten en randen van de grafiek worden weergegeven als nieuwe typen tabellen: NODE en EDGE. Grafiekquery's gebruiken een nieuwe T-SQL-functie genaamd MATCH(). Omdat deze functionaliteit is ingebouwd in SQL Server 2017, kan deze zonder conversie in uw bestaande databases worden gebruikt.
Voordelen van het grafiekmodel
Tegenwoordig eisen bedrijven en gebruikers applicaties die steeds meer gegevens verwerken, terwijl ze hoge prestaties en betrouwbaarheid verwachten. Het weergeven van gegevens als een grafiek biedt een handige manier om met complexe relaties om te gaan. Deze aanpak lost veel problemen op en helpt resultaten te behalen binnen een bepaalde context.
Het lijkt erop dat veel toepassingen in de toekomst zullen profiteren van het gebruik van grafische databases.
Datamodellering: van relationeel naar grafisch model
Voorbeeld
Laten we eens kijken naar een voorbeeld van een organisatiestructuur met een hiërarchie van werknemers: een werknemer rapporteert aan een manager, een manager rapporteert aan een senior manager, enzovoort. Afhankelijk van het specifieke bedrijf kan deze hiërarchie een willekeurig aantal niveaus hebben. Maar naarmate het aantal niveaus toeneemt, wordt het berekenen van relaties in een relationele database steeds moeilijker. Het is vrij moeilijk om je de hiërarchie van werknemers, de hiërarchie in marketing of verbindingen in sociale netwerken voor te stellen. Laten we eens kijken hoe SQL Graph het probleem van het omgaan met verschillende hiërarchieniveaus kan oplossen.
Voor dit voorbeeld maken we een eenvoudig datamodel. Laten we een tabel met werknemers maken EMP met identiteitsbewijs EMPNO en kolom M.G.R., met vermelding van de identificatie van de leidinggevende (manager) van de medewerker. Alle informatie over de hiërarchie wordt in deze tabel opgeslagen en kan met behulp van kolommen worden opgevraagd EMPNO и M.G.R..
Het volgende diagram toont hetzelfde organisatiestructuurmodel met vier nestniveaus in een meer vertrouwde vorm. Werknemers zijn de hoekpunten van een grafiek uit een tabel EMP. De entiteit “werknemer” is met zichzelf verbonden door de verbinding “submits” (ReportsTo). In grafiektermen is een link een rand (EDGE) die knooppunten (NODE) van medewerkers met elkaar verbindt.
Laten we een gewone tabel maken EMP en tel daar de waarden op volgens het bovenstaande 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)
Op onderstaande foto zijn de medewerkers te zien:
- medewerker mee EMPNO 7369 gehoorzaamt 7902;
- medewerker mee EMPNO 7902 gehoorzaamt 7566
- medewerker mee EMPNO 7566 gehoorzaamt 7839
Laten we nu eens kijken naar een grafiekweergave van dezelfde gegevens. Het EMPLOYEE-hoekpunt heeft verschillende attributen en is met zichzelf verbonden door de relatie “ondergeschikten” (EmplReportsTo). EmplReportsTo is de naam van de relatie.
De randtabel (EDGE) kan ook attributen bevatten.
Laten we een knooppunttabel EmpNode maken
De syntaxis voor het maken van een knooppunt is vrij eenvoudig: naar de expressie MAAK EEN TABEL wordt aan het einde toegevoegd "ALS 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;
Laten we nu de gegevens van een gewone tabel naar een grafiek converteren. Volgende INSERT voegt gegevens uit een relationele tabel in EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
In de tabel met knooppunten in een speciale kolom $node_id_*
de knooppunt-ID wordt opgeslagen als JSON. De overige kolommen van deze tabel bevatten de attributen van het knooppunt.
Randen maken (EDGE)
Het maken van een edge-tabel lijkt sterk op het maken van een knooppunttabel, behalve dat het trefwoord wordt gebruikt "ALS RAND".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Laten we nu verbindingen tussen werknemers definiëren met behulp van kolommen EMPNO и M.G.R.. Het organisatiestructuurdiagram laat duidelijk zien hoe u moet schrijven 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);
De standaardrandtabel bestaat uit drie kolommen. Eerst, $edge_id
— edge-ID in JSON-vorm. De andere TWEE ($from_id
и $to_id
) vertegenwoordigen de verbinding tussen knooppunten. Bovendien kunnen randen aanvullende eigenschappen hebben. In ons geval wel Afd.nr.
Systeemweergaven
In systeemweergave sys.tables
er zijn twee nieuwe kolommen verschenen:
- is_edge
- is_knooppunt
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
sms
Objecten die verband houden met grafieken bevinden zich in de map Grafiektabellen. Het knooppunttabelpictogram is gemarkeerd met een punt en het randtabelpictogram is gemarkeerd met twee verbonden cirkels (een beetje zoals een bril).
MATCH-expressie
uitdrukking MATCH overgenomen uit CQL (Cypher Query Language). Dit is een efficiënte manier om eigenschappen van een grafiek op te vragen. CQL begint met een expressie MATCH.
syntaxis
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
Примеры
Laten we een paar voorbeelden bekijken.
De onderstaande zoekopdracht geeft de medewerkers weer aan wie Smith en zijn manager rapporteren.
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'
De volgende zoekopdracht is bedoeld voor het vinden van medewerkers en managers op het tweede niveau voor Smith. Als je de zin verwijdert WAAR, dan worden in het resultaat alle werknemers weergegeven.
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'
En tot slot een verzoek voor medewerkers en managers van het derde 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'
Laten we nu van richting veranderen om de bazen van Smith te pakken te krijgen.
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)
Conclusie
SQL Server 2017 heeft zichzelf bewezen als een complete bedrijfsoplossing voor verschillende IT-bedrijfstaken. De eerste versie van SQL Graph is veelbelovend. Ondanks enkele beperkingen is er al voldoende functionaliteit om de mogelijkheden van grafieken te verkennen.
De SQL Graph-functionaliteit is volledig geïntegreerd in SQL Engine. Zoals reeds vermeld heeft SQL Server 2017 echter de volgende beperkingen:
Geen ondersteuning voor polymorfisme.
- Alleen unidirectionele verbindingen worden ondersteund.
- Edges kunnen de kolommen $from_id en $to_id niet bijwerken via UPDATE.
- Transitieve sluitingen worden niet ondersteund, maar kunnen worden verkregen met behulp van CTE.
- Ondersteuning voor In-Memory OLTP-objecten is beperkt.
- Tijdelijke tabellen (systeemversie van tijdelijke tabellen), tijdelijke lokale en globale tabellen worden niet ondersteund.
- Tabeltypen en tabelvariabelen kunnen niet worden gedeclareerd als NODE of EDGE.
- Query's tussen databases worden niet ondersteund.
- Er is geen directe manier of wizard om gewone tabellen naar grafiektabellen te converteren.
- Er is geen GUI om grafieken weer te geven, maar u kunt wel Power BI gebruiken.
Lees verder:
Bron: www.habr.com