Architettura di SQL Graph
Si applica a: SQL Server 2017 (14.x) e versioni successive Istanza gestita di SQL di Azure di Azure
Informazioni sull'architettura di SQL Graph. Conoscere le nozioni di base semplifica la comprensione di altri articoli di SQL Graph.
Database Sql Graph
Gli utenti possono creare un grafo per ogni database. Un grafico è una raccolta di tabelle di nodi e bordi. Le tabelle node o edge possono essere create in qualsiasi schema nel database, ma appartengono a un solo grafico logico. Una tabella dei nodi è una raccolta di tipi simili di nodi. Ad esempio, una Person
tabella dei nodi contiene tutti i Person
nodi appartenenti a un grafico. Analogamente, una tabella dei bordi è una raccolta di tipi simili di bordi. Ad esempio, una Friends
tabella dei bordi contiene tutti i bordi che connettono un Person
oggetto a un altro Person
oggetto . Poiché i nodi e i bordi vengono archiviati in tabelle, la maggior parte delle operazioni supportate nelle tabelle regolari è supportata nelle tabelle node o edge.
Il diagramma seguente illustra l'architettura del database SQL Graph.
Tabella Node
Una tabella dei nodi rappresenta un'entità in uno schema del grafo. Ogni volta che viene creata una tabella dei nodi, insieme alle colonne definite dall'utente, viene creata una colonna implicita $node_id
che identifica in modo univoco un determinato nodo nel database. I valori in $node_id
vengono generati automaticamente e sono una combinazione di ID oggetto per la tabella del grafo della tabella del nodo e un valore bigint generato internamente. Tuttavia, quando la $node_id
colonna è selezionata, viene visualizzato un valore calcolato sotto forma di stringa JSON. Inoltre, $node_id
è una pseudo-colonna che esegue il mapping a un nome interno con un suffisso univoco. Quando si seleziona la $node_id
pseudo-colonna dalla tabella, il nome della colonna viene visualizzato come $node_id_<unique suffix>
.
Nota
L'uso delle pseudo-colonne nelle query è l'unico modo supportato e consigliato di eseguire query sulla colonna interna $node_id
. Non è consigliabile usare direttamente le $node_id_<hex_string>
colonne in alcuna query.
Inoltre, la rappresentazione JSON calcolata illustrata nelle pseudo-colonne è un dettaglio di implementazione. Non è consigliabile accettare una dipendenza diretta dal formato della rappresentazione JSON. Se è necessario gestire questa rappresentazione JSON, prendere in considerazione l'uso di NODE_ID_FROM_PARTS() e di altre funzioni di sistema correlate.
Non è consigliabile usare direttamente le pseudo-colonne del grafo ($node_id
, $from_id
, $to_id
) nei predicati. Ad esempio, è consigliabile evitare un predicato simile n.$node_id = e.$from_id
a . Tali confronti tendono ad essere inefficienti, a causa della conversione nella rappresentazione JSON. Al contrario, fare affidamento sulla funzione MATCH per quanto possibile.
È consigliabile che gli utenti creino un vincolo o un indice univoco nella $node_id
colonna al momento della creazione della tabella dei nodi, ma se non ne viene creato uno, viene creato automaticamente un indice univoco non cluster predefinito. Tuttavia, qualsiasi indice in una pseudo-colonna del grafo viene creato nelle colonne interne sottostanti. Ovvero, viene visualizzato un indice creato nella $node_id
colonna interna graph_id_<hex_string>
.
Tabella Edge
Una tabella dei bordi rappresenta una relazione in un grafico. I bordi sono sempre diretti e connettono due nodi. Una tabella perimetrale consente agli utenti di modellare relazioni molti-a-molti nel grafico. Le colonne definite dall'utente ("attributi") sono facoltative in una tabella perimetrale. Ogni volta che viene creata una tabella perimetrale, insieme alle colonne definite dall'utente, vengono create tre colonne implicite nella tabella perimetrale:
Nome colonna | Descrizione |
---|---|
$edge_id |
Identifica in modo univoco un determinato arco nel database. Si tratta di una colonna generata e il valore è una combinazione di object_id della tabella dei bordi e di un valore bigint generato internamente. Tuttavia, quando la $edge_id colonna è selezionata, viene visualizzato un valore calcolato sotto forma di stringa JSON. $edge_id è una pseudo-colonna che esegue il mapping a un nome interno con un suffisso univoco. Quando si seleziona $edge_id dalla tabella, il nome della colonna viene visualizzato come $edge_id_<unique suffix> . L'uso di nomi di pseudo-colonna nelle query è il modo consigliato per eseguire query sulla colonna interna e usare il nome interno $edge_id con la stringa esadecimale deve essere evitato. |
$from_id |
Archivia l'oggetto $node_id del nodo, da cui ha origine il bordo. |
$to_id |
Archivia l'oggetto $node_id del nodo in corrispondenza del quale termina il bordo. |
I nodi a cui un determinato arco può connettersi sono controllati dai dati inseriti nelle $from_id
colonne e $to_id
. Nella prima versione non è possibile definire vincoli nella tabella perimetrale, per impedirne la connessione a due tipi di nodi. Ovvero, un arco può connettere due nodi nel grafico, indipendentemente dai relativi tipi.
Analogamente alla $node_id
colonna, è consigliabile che gli utenti creino un indice o un vincolo univoco sulla $edge_id
colonna al momento della creazione della tabella perimetrale, ma se non ne viene creato uno, viene creato automaticamente un indice univoco non cluster predefinito in questa colonna. Tuttavia, qualsiasi indice in una pseudo-colonna del grafo viene creato nelle colonne interne sottostanti. Ovvero, viene visualizzato un indice creato nella $edge_id
colonna interna graph_id_<unique suffix>
. È anche consigliabile, per gli scenari OLTP, che gli utenti creino un indice nelle colonne ($from_id
, $to_id
) per ricerche più veloci nella direzione del bordo.
Il diagramma seguente illustra il modo in cui le tabelle dei nodi e dei bordi vengono archiviate nel database.
Metadati
Usare queste viste di metadati per visualizzare gli attributi di un nodo o di una tabella perimetrale.
sys.tables
Per identificare le tabelle a grafo, è possibile usare le colonne seguenti bit
in sys.tables . Se is_node
è impostato su 1, la tabella è una tabella nodo e se is_edge
è impostata su 1, la tabella è una tabella perimetrale.
Nome colonna | Tipo di dati | Descrizione |
---|---|---|
is_node | bit | Per le tabelle dei nodi, is_node è impostato su 1. |
is_edge | bit | Per le tabelle perimetrali, is_edge è impostato su 1. |
sys.columns
Le graph_type
colonne e graph_type_desc
nella sys.columns
vista sono utili per comprendere i diversi tipi di colonne usate nelle tabelle dei nodi del grafo e dei bordi:
Nome colonna | Tipo di dati | Descrizione |
---|---|---|
graph_type | int | Colonna interna con un set di valori. I valori sono compresi tra 1 e 8 per le colonne del grafo e NULL per altri. |
graph_type_desc | nvarchar(60) | Colonna interna con un set di valori. |
Nella tabella seguente sono elencati i valori validi per graph_type
la colonna:
Valore colonna | Descrizione |
---|---|
1 | GRAPH_ID |
2 | GRAPH_ID_COMPUTED |
3 | GRAPH_FROM_ID |
4 | GRAPH_FROM_OBJ_ID |
5 | GRAPH_FROM_ID_COMPUTED |
6 | GRAPH_TO_ID |
7 | GRAPH_TO_OBJ_ID |
8 | GRAPH_TO_ID_COMPUTED |
sys.columns
archivia anche informazioni sulle colonne implicite create nelle tabelle del nodo o dei bordi. Le informazioni seguenti possono essere recuperate da sys.columns, tuttavia, gli utenti non possono selezionare queste colonne da una tabella nodo o edge.
Le colonne implicite in una tabella node sono:
Nome colonna | Tipo di dati | is_hidden | Comment |
---|---|---|---|
graph_id_\<hex_string> |
bigint | 1 | Valore ID grafo interno. |
$node_id_\<hex_string> |
NVARCHAR | 0 | Rappresentazione di caratteri esterna dell'ID del nodo. |
Le colonne implicite in una tabella perimetrale sono:
Nome colonna | Tipo di dati | is_hidden | Comment |
---|---|---|---|
graph_id_\<hex_string> |
bigint | 1 | Valore ID grafo interno. |
$edge_id_\<hex_string> |
NVARCHAR | 0 | Rappresentazione di caratteri dell'ID bordo. |
from_obj_id_\<hex_string> |
INT | 1 | Valore interno object_id per "from node". |
from_id_\<hex_string> |
bigint | 1 | Valore ID grafo interno per "from node". |
$from_id_\<hex_string> |
NVARCHAR | 0 | rappresentazione di caratteri del "from node". |
to_obj_id_\<hex_string> |
INT | 1 | Interno object_id per il "da nodo a". |
to_id_\<hex_string> |
bigint | 1 | Valore ID grafo interno per il "to node". |
$to_id_\<hex_string> |
NVARCHAR | 0 | Rappresentazione di caratteri esterna dell'oggetto "to node". |
Funzioni di sistema
È possibile usare le funzioni predefinite seguenti per interagire con le pseudo-colonne nelle tabelle dei grafici. Vengono forniti riferimenti dettagliati per ognuna di queste funzioni nei rispettivi riferimenti alle funzioni T-SQL.
Predefinito | Descrizione |
---|---|
OBJECT_ID_FROM_NODE_ID | Estrarre l'ID oggetto per la tabella del grafo da un oggetto node_id . |
GRAPH_ID_FROM_NODE_ID | Estrarre il valore dell'ID grafico da un oggetto node_id . |
NODE_ID_FROM_PARTS | Costruire un node_id da un ID oggetto per la tabella del grafo e un valore ID grafico. |
OBJECT_ID_FROM_EDGE_ID | Estrarre l'ID oggetto per la tabella del grafo da edge_id . |
GRAPH_ID_FROM_EDGE_ID | Estrarre il valore dell'ID grafico per un determinato edge_id oggetto . |
EDGE_ID_FROM_PARTS | Costrutto edge_id dall'ID oggetto per la tabella del grafo e il valore ID grafico. |
Guida di riferimento a Transact-SQL
Informazioni sulle estensioni Transact-SQL introdotte in SQL Server e nel database SQL di Azure che consentono di creare ed eseguire query su oggetti grafo. Le estensioni del linguaggio di query consentono di eseguire query e attraversare il grafo usando la sintassi dell'arte ASCII.
Istruzioni DDL (Data Definition Language)
Attività | Articolo correlato | Note |
---|---|---|
CREATE TABLE | CREATE TABLE (Transact-SQL) | CREATE TABLE è ora estesa per supportare la creazione di una tabella AS NODE o AS EDGE. Una tabella perimetrale può avere o meno attributi definiti dall'utente. |
MODIFICA TABELLA | ALTER TABLE (Transact-SQL) | Le tabelle node e edge possono essere modificate nello stesso modo in cui una tabella relazionale è , usando .ALTER TABLE Gli utenti possono aggiungere o modificare colonne, indici o vincoli definiti dall'utente. Tuttavia, la modifica delle colonne interne del grafo, ad esempio $node_id o $edge_id , genera un errore. |
CREATE INDEX | CREATE INDEX (Transact-SQL) | Gli utenti possono creare indici su pseudo-colonne e colonne definite dall'utente nelle tabelle node e edge. Tutti i tipi di indice sono supportati, inclusi gli indici columnstore cluster e non cluster. |
CREARE VINCOLI EDGE | VINCOLI EDGE (Transact-SQL) | Gli utenti possono ora creare vincoli di arco nelle tabelle perimetrali per applicare semantiche specifiche e mantenere anche l'integrità dei dati |
DROP TABLE | DROP TABLE (Transact-SQL) | Le tabelle node e edge possono essere eliminate nello stesso modo in cui una tabella relazionale è , usando .DROP TABLE Attualmente, non esistono meccanismi per impedire l'eliminazione di nodi a cui fanno riferimento i bordi. Non è disponibile alcun supporto per l'eliminazione a catena dei bordi, all'eliminazione di un nodo (o all'eliminazione dell'intera tabella dei nodi). In tutti questi casi, tutti i bordi connessi ai nodi eliminati devono essere eliminati manualmente per mantenere la coerenza del grafico. |
Istruzioni DML (Data Manipulation Language)
Attività | Articolo correlato | Note |
---|---|---|
INSERT | INSERT (Transact-SQL) | L'inserimento in una tabella dei nodi non è diverso dall'inserimento in una tabella relazionale. I valori per $node_id la colonna vengono generati automaticamente. Il tentativo di inserimento di un valore in $node_id o $edge_id colonna genera un errore. Gli utenti devono fornire valori per $from_id le colonne e $to_id durante l'inserimento in una tabella perimetrale. $from_id e $to_id sono i $node_id valori dei nodi collegati da un determinato arco. |
DELETE | DELETE (Transact-SQL) | I dati delle tabelle nodo o perimetrale possono essere eliminati nello stesso modo in cui vengono eliminati dalle tabelle relazionali. In questa versione, tuttavia, non esistono vincoli per garantire che nessun bordo punti a un nodo eliminato e l'eliminazione a catena dei bordi, al momento dell'eliminazione di un nodo non è supportata. È consigliabile che ogni volta che un nodo viene eliminato, vengono eliminati anche tutti i bordi di connessione a tale nodo. |
UPDATE | UPDATE (Transact-SQL) | I valori nelle colonne definite dall'utente possono essere aggiornati usando l'istruzione UPDATE. Non è possibile aggiornare le colonne interne del grafo, $node_id , $from_id $edge_id e $to_id . |
MERGE | MERGE (Transact-SQL) | MERGE l'istruzione è supportata in un nodo o in una tabella perimetrale. |
Istruzioni di query
Attività | Articolo correlato | Note |
---|---|---|
SELECT | SELECT (Transact-SQL) | Poiché i nodi e i bordi vengono archiviati come tabelle, la maggior parte delle operazioni di tabella è supportata anche nelle tabelle node e edge. |
MATCH | MATCH (Transact-SQL) | MATCH incorporato è stato introdotto per supportare la corrispondenza dei criteri e l'attraversamento attraverso il grafico. |
Limiti
Esistono alcune limitazioni per le tabelle dei nodi e dei bordi:
- Le tabelle temporanee locali o globali non possono essere tabelle perimetrali o nodi.
- I tipi di tabella e le variabili di tabella non possono essere dichiarati come tabella perimetrale o nodo.
- Non è possibile creare tabelle temporali con controllo delle versioni di sistema e tabelle perimetrali.
- Le tabelle node e edge non possono essere tabelle ottimizzate per la memoria.
- Gli utenti non possono aggiornare le
$from_id
colonne e$to_id
di un arco usando l'istruzione UPDATE. Per aggiornare i nodi a cui fa riferimento un arco, gli utenti devono inserire un nuovo arco che punta a nuovi nodi ed eliminare quello precedente. - Le query tra database sugli oggetti grafico non sono supportate.
Vedi anche
Passaggi successivi
- Per iniziare a usare SQL Graph, vedere Database a grafo SQL - Esempio