Questo documento descrive lo schema del grafo di Spanner e fornisce esempi per illustrare i concetti chiave. Per saperne di più sul grafico Spanner, consulta Panoramica di Spanner Graph.
Modello di dati del grafico delle proprietà
Un grafico delle proprietà ti consente di modellare i dati connessi. Rappresenta le informazioni come una rete di nodi e frecce. I nodi simbolizzano le entità nel tuo panorama dei dati come "clienti", "prodotti" o "località". I margini mostrano le connessioni i nodi, acquisendo relazioni come "acquistato", "Segue" o "situato in".
Sia i nodi che i nodi possono includere le seguenti informazioni:
- Etichette, che classificano i nodi e gli archi in insiemi, ad esempio Città.
- Proprietà, che sono coppie chiave-valore, ad esempio population.
L'esempio nella Figura 1 mostra come progettare un grafico per modellare attività finanziarie. Questo grafico include i seguenti tipi di entità modellati come nodi:
- Persona: rappresenta una persona coinvolta nelle transazioni finanziarie.
- Conto:rappresenta un conto bancario utilizzato per le transazioni.
Queste entità sono collegate da diversi tipi di relazioni, che sono rappresentati dai seguenti bordi diretti:
- Di proprietà: una persona possiede uno o più account.
- Trasferimenti: il denaro si sposta da un account a un altro.
Ogni bordo diretto indica una relazione unidirezionale che fluisce da un nodo di origine
in 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 sotto forma di proprietà. Ogni proprietà ha un nome e un valore.
- I nodi Person hanno le seguenti proprietà:
name
(STRING
)id
(INT64
)
- Gli angoli dei trasferimenti hanno la seguente proprietà:
amount
(FLOAT64)
Bordi orientati e non diretti
Il grafico di esempio utilizza bordi diretti, che indicano una direzione specifica la relazione tra le entità. Tuttavia, alcune relazioni, come "amico" relazione in un social network, non sono diretti e rappresentano 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 (query del grafico delle proprietà), che fa parte degli standard SQL:2023.
Definizione di un nodo nel grafico delle proprietà
Per definire un nodo, devi aggiungerne una nella clausola NODE TABLES. La forma più semplice di definizione dei nodi contiene solo il nome di una tabella di input. Le righe della tabella di input vengono mappate ai nodi del grafico.
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à del nodo.
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
La definizione di un nodo definisce anche la chiave dell'elemento, che identifica in modo univoco un del grafico.
- Per impostazione predefinita, la chiave dell'elemento è la chiave primaria della tabella di input.
- Le chiavi elemento possono essere definite esplicitamente dalla clausola
KEY
. - Le colonne con vincoli di univocità
UNIQUE INDEX
possono essere utilizzate come chiavi elemento.
L'esempio seguente definisce il nodo Account
e il nodo Person
.
- Il nodo
Account
utilizza la chiave primaria della tabellaAccount
come elemento per impostazione predefinita. - 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 grafico
- Ogni riga con una chiave elemento non nullo viene mappata a un nodo univoco nella identificato dalla chiave dell'elemento.
- Le righe con una chiave dell'elemento null vengono ignorate.
Definizione di un bordo in un grafo di proprietà
Per definire un perimetro, aggiungi una definizione dell'edge nella clausola EDGE TABLES. La forma più semplice di definizione degli archi contiene solo il nome di una tabella di input. Le righe della tabella di input vengono mappate ai bordi del grafico.
Le proprietà e l'etichetta predefinite dei bordi definiti come i nodi.
La chiave elemento di ciascun bordo è definita come i nodi.
Riferimento sui nodi di origine e di destinazione
Nell'esempio seguente, viene creato un grafico delle proprietà FinGraph
con
seguenti:
- 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 ai 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 perimetro PersonOwnAccount
connette Person
(origine) a Account
(destinazione).
- Il nodo
SOURCE
di un perimetro è un nodoPerson
il cuiid
è uguale al il bordoid
. - Il nodo
DESTINATION
di un perimetro è un nodoAccount
il cuiid
è uguale come bordoaccount_id
.
Inoltre, quanto segue è vero per il bordo PersonOwnAccount
:
- La chiave dell'elemento è la chiave primaria della tabella
PersonOwnAccount
, ossia(id, account_id)
. - Ogni bordo ha lo stesso insieme di proprietà delle colonne
Tabella
PersonOwnAccount
. - Ogni bordo ha l'etichetta
PersonOwnAccount
predefinita.
Mappatura di una riga in una tabella di input degli spigoli agli spigoli nel grafico
- Ogni riga nella tabella di input perimetrale, la cui chiave elemento non è nulla, di solito è mappato a un bordo unico del grafico.
- Una riga potrebbe corrispondere a zero o a più di un bordo nel grafico, ad esempio Ad esempio, quando riferimento dei nodi 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, vedi Unisci input di nodo e perimetro tabelle.
Personalizzare etichette e proprietà
Puoi usare LABEL e PROPRIETÀ per personalizzare etichette e proprietà.
Nell'esempio seguente, sono definiti due nodi, Person
e
Account
.
- I nodi
Person
expose
la proprietàaddress
tramite l'etichettaCustomer
. La La proprietàaddress
viene definita dall'espressioneCONCAT(city, ", ", country),
, che fa riferimento alle colonnecity
ecountry
dell'input tabellaPerson
. - 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 anick_name
colonna 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)
);
Etichetta e coerenza della proprietà
In un grafico, etichette e proprietà sono identificate in modo univoco dai loro nomi. Le etichette e le proprietà con lo stesso nome possono essere visualizzate in più nodi o bordi le tue definizioni. Tuttavia, le etichette e le proprietà con lo stesso nome devono: 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 in Person
che
Account
nodi. 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 grafico creato da CREATE PROPERTY GRAPH
ha una dipendenza da un altro schema
come le tabelle di input delle definizioni di nodi e periferici e la tabella
colonne a cui fanno riferimento le proprietà. Se una modifica allo schema interrompe uno di questi
le dipendenze, la modifica non è consentita.
La seguente istruzione crea una dipendenza da FinGraph
a Account
e le 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 ulteriori informazioni, vedi Aggiorna le definizioni dei nodi o degli 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 maggiori informazioni le informazioni, vedi Aggiorna lo schema.