Microsoft SQL Graph Database Salvatore Pellitteri Microsoft SQL Graph Database
Salvatore Pellitteri | @pellittsa Developer Team Manager in Microsys Srl. Microsoft MVP Azure – Application Integration Microsoft P-Seller competenza Data Platform SQL / BI / Integration Architect
Organizers GetLatestVersion.it
Sponsors
Introduzione «Con il rilascio di SQL Server 2017, Microsoft ha aggiunto il supporto per i graph database per gestire più semplicemente dati che contengono relazioni di entità complesse, pensiamo ai social media per esempio, in cui è possibile avere molteplici relazioni molti-a-molti che cambiano frequentemente»
Agenda Perchè e quando usare Graph Database Costruire il modello e l’architettura Come interrogare e modificare i dati Le gerarchie Considerazioni Visualizzazione (PowerBI & R Server)
perchè graph database
Perchè Graph Database references SQL Server Articles references SQL Server Components & Features writes likes Developers & Administrators likes likes
Perchè Graph Database Analisi di dati altamente interconnessi references SQL Server Articles references Analisi di dati altamente interconnessi Relazioni molti-a-molti complesse e in continua evoluzione Dati gerarchici (HierarchyID) SQL Server Components & Features writes likes Developers & Administrators likes likes
Terminologia Nodo - Vertice Node A Arco – Lato - Spigolo Edge
il modello e l’architettura
Costruire il modello nodes edges Articles Dev & Adm Components D&A write articles Articles reference components Articles reference articles D&A like articles D&A like components D&A like D&A A
Costruire il modello Tabelle “Node” Tabelle “Edge” Una per ogni entità Una per ogni relazione Una per tutte le relazioni Una per gruppi/tipologie di relazioni
Costruire il modello Tabelle “Node” & “Edge” sono user-defined table: Non è necessario costruire database a parte o “speciali” Le tabelle Node devono contenere almeno una proprietà (ovvio) Le tabelle Edge possono contenere proprietà
Node Table CREATE TABLE Components ( ComponentID INT IDENTITY PRIMARY KEY, ComponentName NVARCHAR(100) NOT NULL, ComponentDescription NVARCHAR(100) NOT NULL ) AS NODE;
Node Table Viste sys.tables e sys.columns modificate Colonna $node_id: identifica univocamente un determinato nodo nel database I valori in $node_id vengono generati automaticamente (object_id + valore bigint generato)
Node Table Quando viene selezionata la colonna $node_id, viene visualizzato un valore calcolato sotto forma di stringa JSON. https://docs.microsoft.com/en-us/sql/relational-databases/graphs/sql-graph-architecture?view=sql-server-2017
Edge Table CREATE TABLE Write AS EDGE; CREATE TABLE Reference AS EDGE; CREATE TABLE Likes ( score int ) AS EDGE;
Edge Table Viste sys.tables e sys.columns modificate Colonna $edge_id: identifica univocamente una istanza edge nel database I valori in $edge_id vengono generati automaticamente (object_id + valore bigint generato)
Edge Table Quando viene selezionata la colonna $edge_id, viene visualizzato un valore calcolato sotto forma di stringa JSON. $from_id contiene il $node_id sorgente $to_id contiene il $node_id di destinazione
Node & Edge table
Demo Creazione Modello
interrogare e modificare
Query graph db SELECT DevAdmins.Nickname, Components.ComponentName, Components.ComponentDescription FROM DevAdmins INNER JOIN Likes ON DevAdmins.$node_id = Likes.$from_id INNER JOIN Components ON Likes.$to_id = Components.$node_id;
Query graph db – MATCH function E’ stata aggiunta specificatamente per interrogare le graph table E’ possible usarla solo nelle WHERE di una SELECT che interroga NODE e EDGE table E’ possibile combinarla con altre clausole di WHERE ma solo in AND, OR e NOT non sono disponibili.
Query graph db – MATCH function SELECT DevAdmins.Nickname, Components.ComponentName, Components.ComponentDescription FROM DevAdmins INNER JOIN Likes ON DevAdmins.$node_id = Likes.$from_id INNER JOIN Components ON Likes.$to_id = Components.$node_id; SELECT DevAdmins.Nickname, Components.ComponentName, Components.ComponentDescription FROM DevAdmins, Likes, Components WHERE MATCH(DevAdmins-(Likes)->Components);
Query graph db – MATCH function SELECT DevAdmins.Nickname, Components.ComponentName, Components.ComponentDescription FROM DevAdmins, Likes, Components WHERE MATCH(DevAdmins-(Likes)->Components) AND Likes.score > 3;
Query graph db – MATCH function SELECT DevAdmins.Nickname, Articles.Title, Components.ComponentDescription FROM DevAdmins, Write, Articles, Reference, Components WHERE MATCH(DevAdmins-(Write)->Articles-(Reference)->Components);
Query graph db – MATCH function SELECT DevAdmins.Nickname, Articles.Title, DevAdminsLike.Nickname FROM DevAdmins, Write, Articles, Likes, DevAdmins DevAdminsLike WHERE MATCH(DevAdmins-(Write)->Articles<-(Likes)-DevAdminsLike);
Altre funzioni Node table functions Edge table functions OBJECT_ID_FROM_NODE_ID($node_id) GRAPH_ID_FROM_NODE_ID($node_id) NODE_ID_FROM_PARTS(object_id, graph_id) Edge table functions OBJECT_ID_FROM_EDGE_ID($edge_id) GRAPH_ID_FROM_EDGE_ID($edge_id) EDGE_ID_FROM_PARTS(object_id, graph_id)
Delete & Update DELETE Likes FROM DevAdmins, Likes, Components WHERE MATCH(DevAdmins-(Likes)->Components) AND ComponentID = 3; DELETE Likes WHERE $edge_id = '{"type":"edge","schema":"dbo","table":"Likes","id":8}';
Insert & Delete No constraint / No cascade (SQL 2017) Gestione manuale dell’integrità dei dati Creazione di trigger
Best practice SQL non crea indici unique SQL non crea constraint Dobbiamo creare noi indici unique sia nelle node che nelle edge table per evitare duplicati (best practice) Non ci sono constraint nelle edge che limitano la tipologia di tabelle node sorgenti o destinazioni quindi
Demo Interrogare il modello
le gerarchie
Gerarchie A.D. Dir. Amministrativo Marco Sara Dir. Commerciale Giovanni Bruno Dir. Produzione Michela Luca Dir. IT BI Specialist System Eng. ? Es: BI Specialist fa parte della Direzione IT ma lavora per una persona della Direzione commerciale
Gerarchie CREATE TABLE Employees ( EmployeeID INT IDENTITY PRIMARY KEY, FirstName NVARCHAR(50) NOT NULL, LastName NVARCHAR(50) NOT NULL ) AS NODE; CREATE TABLE ReportsTo AS EDGE; CREATE TABLE WorkFor Percent INT NULL ) AS EDGE; Report To Employees Work For
considerazioni
Limitazioni Table type Table variable Tabelle temporanee Tabelle in-memory Temporal table Cross database query
SQL Server 2019 Edge constraint MATCH in MERGE DML
Cosa manca UNION (ma...) LOOP Polymorphism (ricerca ricorsiva su tutti i nodi e archi) LOOP Transitive closure (ricerca ricorsiva per specifici nodi, archi e profondità) LOOP & Temp Table Shortest path LOOP & TempTable Page rank
Visualization
PowerBI Visualization
PowerBI Visualization Non è possible accedere direttamente alle tabelle Vanno sviluppate delle viste
R Integration
R Integration Installo Machine Learning Services Eseguo la sp_configure 'external scripts enabled’, 1 Download http://igraph.org/nightly/get/r-win/igraph_1.0.1.zip Download https://cran.r-project.org/bin/windows/contrib/3.5/magrittr_1.5.zip RunAs admin "C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\R_SERVICES\bin\R.exe" install.packages("C:\\Users\\salvatore\\OneDrive\\Work\\Events\\2018 - SQL Saturday\\R Integration\\igraph_1.0.1.zip") install.packages("C:\\Users\\salvatore\\OneDrive\\Work\\Events\\2018 - SQL Saturday\\R Integration\\magrittr_1.5.zip")
R Integration
Demo Visualization
Thanks!