Questo documento descrive lo schema del grafo di Spanner e fornisce esempi per illustrare i concetti chiave. Per scoprire di più su Spanner Graph, consulta la panoramica di Spanner Graph.
Modello dati del grafico delle proprietà
Un grafo di proprietà ti consente di modellare i dati collegati. Rappresenta le informazioni come una rete di nodi e archi. I nodi simboleggiano le entità nel panorama dei dati, come clienti, prodotti o località. Gli archi mostrano le connessioni tra questi nodi e indicano relazioni come acquistato, segue o situato in.
Sia i nodi che gli archi possono includere le seguenti informazioni:
- Etichette, che classificano i nodi e gli archi in insiemi, ad esempio Città.
- Proprietà, ovvero coppie chiave-valore, ad esempio population.
L'esempio nella Figura 1 mostra come progettare un grafico per modellare le attività finanziarie. Questo grafico include i seguenti tipi di entità modellate come nodi:
- Persona: rappresenta una persona coinvolta nelle transazioni finanziarie.
- Account: rappresenta un conto bancario utilizzato per le transazioni.
Queste entità sono collegate da diversi tipi di relazioni, che sono rappresentate dai seguenti archi diretti:
- Possiede: una persona possiede uno o più account.
- Trasferimenti:il denaro passa da un conto all'altro.
Ogni arco diretto indica una relazione unidirezionale, che va da un nodo di origine
a un nodo di destinazione. Ad esempio, un bordo Transfers
collega un'origineAccount
a una destinazione Account
, indicando il flusso di denaro.
Figura 1. Grafo di esempio con più nodi e archi diretti.
Nodi ed archi possono contenere informazioni aggiuntive nelle proprietà. Ogni proprietà ha un nome e un valore.
- I nodi Person hanno le seguenti proprietà:
name
(STRING
)id
(INT64
)
- Gli archi Transfers hanno la seguente proprietà:
amount
(FLOAT64)
Archi diretti e non diretti
Il grafo di esempio utilizza archi diretti, che indicano una direzione specifica nella relazione tra le entità. Tuttavia, alcune relazioni, come la relazione di amicizia in un social network, non sono dirette e rappresentano una connessione reciproca senza un'origine o un endpoint distinti. In questo caso, puoi modellizzare gli archi non diretti come due archi diretti, uno in ogni direzione.
Progettazione dello schema di Spanner Graph
Spanner Graph ti consente di creare un grafo dalle tabelle utilizzando l'istruzione CREATE PROPERTY GRAPH. Le tabelle utilizzate per creare i grafici sono chiamate tabelle di input. Questo approccio si basa su SQL/PGQ (Property Graph Queries), che fa parte degli standard SQL:2023.
Definizione di un nodo in un grafo di proprietà
Per definire un nodo, aggiungi una definizione di nodo nella clausola NODE TABLES. La forma più semplice di definizione del nodo contiene solo il nome di una tabella di input. Le righe della tabella di input vengono mappate ai nodi del grafo.
Nel seguente esempio, utilizzi la clausola NODE TABLES per definire il nodo Account
nel grafo delle proprietà FinGraph
. La definizione del nodo contiene
la tabella di input Account
.
-- First, create an Account table.
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
-- Next, use the Account table as input table of Account node definition.
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Account
);
Etichetta e proprietà predefinite
Per impostazione predefinita, tutti i nodi utilizzano il nome della tabella di input come etichetta e tutte le colonne della tabella di input vengono esposte come proprietà dei nodi.
Nell'esempio precedente,
- Ogni nodo dell'account ha l'etichetta
Account
. - Ogni nodo dell'account ha proprietà
[id, create_time]
create dalle colonne della tabellaAccount
.
Chiave elemento
Una definizione di nodo definisce anche la chiave dell'elemento, che identifica in modo univoco un nodo del grafico.
- Per impostazione predefinita, la chiave dell'elemento è la chiave primaria della tabella di input.
- Le chiavi degli elementi possono essere definite esplicitamente dalla clausola
KEY
. - Le colonne con vincoli di unicità
UNIQUE INDEX
possono essere utilizzate come chiavi di elemento.
L'esempio seguente definisce il nodo Account
e il nodo Person
.
- Per impostazione predefinita, il nodo
Account
utilizza la chiave primaria della tabellaAccount
come chiave dell'elemento. - Il nodo
Person
, invece, specifica esplicitamenteid
come chiave dell'elemento con la clausolaKEY
.
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id),
Account
);
Mappatura di una riga nella tabella di input a un nodo nel grafo
- Ogni riga con una chiave elemento non null viene mappata a un nodo univoco nel grafo, identificato dalla chiave elemento.
- Le righe con una chiave elemento null vengono ignorate.
Definizione di un bordo in un grafo di proprietà
Per definire un bordo, aggiungi una definizione di bordo alla clausola EDGE TABLES. La forma più semplice di definizione dell'edge contiene solo un nome della tabella di input. Le righe della tabella di input vengono mappate ai bordi del grafico.
L'etichetta e le proprietà predefinite degli archi sono definite nello stesso modo dei nodi.
La chiave dell'elemento di ogni edge è definita nello stesso modo dei nodi.
Riferimento ai nodi di origine e destinazione
Nell'esempio seguente, crei un grafo di proprietà FinGraph
con quanto segue:
- Nodi
Person
eAccount
- bordo
PersonOwnAccount
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE TABLE PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
INTERLEAVE IN PARENT Person;
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person,
Account
)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
);
Una definizione di bordo deve definire il riferimento dei nodi di origine e di destinazione utilizzando
le clausole SOURCE KEY
, DESTINATION KEY
e REFERENCES
. Il seguente
esempio utilizza la definizione di bordo di PersonOwnAccount
per illustrare questo concetto:
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
)
Ogni bordo PersonOwnAccount
collega un nodo Person
(sorgente) a un nodo Account
(destinazione).
- Il nodo di origine di un bordo è un nodo
Person
il cuiid
è uguale alid
del bordo. - Il nodo di destinazione di un bordo è un nodo
Account
il cuiid
è uguale alaccount_id
del bordo.
Inoltre, per il bordo PersonOwnAccount
vale quanto segue:
- La chiave dell'elemento è la chiave primaria della tabella
PersonOwnAccount
, ovvero(id, account_id)
. - Ogni arco ha lo stesso insieme di proprietà delle colonne della tabella
PersonOwnAccount
. - Ogni bordo ha l'etichetta predefinita
PersonOwnAccount
.
Mappatura di una riga in una tabella di input degli archi agli archi nel grafo
- Ogni riga della tabella di input degli spigoli, la cui chiave elemento non è null, solitamente viene mappata a uno spigolo univoco nel grafo.
- Una riga può corrispondere a zero o più archi nel grafico, ad esempio quando il riferimento al nodo di origine corrisponde a zero o più nodi nella tabella dei nodi di origine.
- La stessa tabella di input può essere utilizzata in definizioni di nodi o archi diverse per creare insiemi diversi di nodi o archi. Per ulteriori informazioni, consulta la sezione Unire le tabelle di input dei nodi e degli archi.
Personalizzare etichette e proprietà
Puoi utilizzare le clausole LABEL e PROPERTIES per personalizzare le etichette e le proprietà.
Nell'esempio seguente sono definiti due nodi, Person
e
Account
.
- I nodi
Person
espongono la proprietàaddress
tramite l'etichettaCustomer
. La proprietàaddress
è definita dall'espressioneCONCAT(city, ", ", country),
che fa riferimento alle colonnecity
ecountry
della tabella di inputPerson
. - Per
Account
, il nodoAccount
espone le proprietàid
ecreate_time
tramite l'etichettaAccount
. Person
eAccount
hanno l'etichettaEntity
con proprietà [id, name
].- Per
Person
, le proprietàid
ename
provengono dalle colonne della tabella di input. - Per
Account
, la proprietàname
fa riferimento alla colonnanick_name
della tabella di input.
- Per
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
birthday TIMESTAMP,
country STRING(MAX),
city STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING(MAX),
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id)
LABEL Customer
PROPERTIES (CONCAT(city, ", ", country) AS address)
LABEL Entity PROPERTIES (id, name),
Account KEY (id)
LABEL Account PROPERTIES (id, create_time)
LABEL Entity PROPERTIES (id, nick_name AS name)
);
Coerenza di etichette e proprietà
In un grafico, le etichette e le proprietà sono identificate in modo univoco dai loro nomi. Le etichette e le proprietà con lo stesso nome possono comparire in più definizioni di nodi o bordi. Tuttavia, le etichette e le proprietà con lo stesso nome devono rispettare queste regole:
- Le proprietà con lo stesso nome devono avere lo stesso tipo di valore.
- Le etichette con lo stesso nome devono esporre lo stesso elenco di proprietà.
Nell'esempio precedente, l'etichetta Entity
è definita sia nei nodi Person
sia
Account
. In entrambe le definizioni, hanno lo stesso insieme di nomi di proprietà
[id
, name
] con tipi di valori identici.
Dipendenze tra grafici e altri oggetti dello schema
Il grafo creato da CREATE PROPERTY GRAPH
ha una dipendenza da altri oggetti dello schema, come le tabelle di input delle definizioni di nodi e archi e le colonne della tabella a cui fanno riferimento le proprietà. Se una modifica dello schema viola una di queste dipendenze, la modifica non è consentita.
L'istruzione seguente crea una dipendenza da FinGraph
alla tabella Account
e alle colonne id
, create_time
.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Account PROPERTIES (id, create_time)
);
Di seguito sono riportati alcuni esempi di modifiche allo schema che non puoi apportare:
- Elimina la tabella
Account
, a meno che non rimuovi prima la definizione del nodoAccount
. Per ulteriori informazioni, consulta la sezione Rimuovere definizioni di nodi o bordi esistenti. - Elimina le colonne
create_time
dalla tabellaAccount
, a meno che non rimuovi prima la proprietàcreate_time
dalla definizione del nodoAccount
. Per maggiori informazioni, consulta Aggiornare le definizioni di nodi o archi esistenti.
Tuttavia, puoi apportare le seguenti modifiche allo schema:
- Modifica la tabella
Account
e lo schema delle colonneid
ecreate_time
, se consentito da altri requisiti dello schema. Per ulteriori informazioni, consulta la sezione Effettuare aggiornamenti dello schema.