Panoramica dello schema di Spanner Graph

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.

Diagramma di panoramica dello schema di Spanner Graph.

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 tabella Account.

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 tabella Account come chiave dell'elemento.
  • Il nodo Person, invece, specifica esplicitamente id come chiave dell'elemento con la clausola KEY.
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.

Riferimento ai nodi di origine e destinazione

Nell'esempio seguente, crei un grafo di proprietà FinGraph con quanto segue:

  • Nodi Person e Account
  • 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 cui id è uguale al id del bordo.
  • Il nodo di destinazione di un bordo è un nodo Account il cui id è uguale al account_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'etichetta Customer. La proprietà address è definita dall'espressione CONCAT(city, ", ", country), che fa riferimento alle colonne city e country della tabella di input Person.
  • Per Account, il nodo Account espone le proprietà id e create_time tramite l'etichetta Account.
  • Person e Account hanno l'etichetta Entity con proprietà [id, name].
    • Per Person, le proprietà id e name provengono dalle colonne della tabella di input.
    • Per Account, la proprietà name fa riferimento alla colonna nick_name della tabella di input.
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:

Tuttavia, puoi apportare le seguenti modifiche allo schema:

  • Modifica la tabella Account e lo schema delle colonne id e create_time, se consentito da altri requisiti dello schema. Per ulteriori informazioni, consulta la sezione Effettuare aggiornamenti dello schema.

Passaggi successivi