Condividi tramite


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 Personoggetto . 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.

Diagram showing the SQL Graph database architecture.

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.

Diagram showing the Node and edge table representation.

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_idoggetto .
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_ide $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