Panoramica dello schema

Questo documento spiega i componenti di uno schema di grafo di proprietà e mostra come creare e gestire uno schema di grafo.

I grafi consentono di modellare i dati connessi che rappresentano le informazioni come una rete di nodi e archi. Uno schema di grafo è costituito da nodi e archi, insieme a etichette che classificano il tipo e proprietà che li descrivono. Definisci uno schema di grafo di proprietà mappando le righe delle tabelle di input ai nodi e agli archi del grafo e definendo etichette e proprietà personalizzate. Per saperne di più su BigQuery Graph, consulta la panoramica di BigQuery Graph.

Informazioni sul modello dei dati del grafo di proprietà

Un grafo di proprietà consente di modellare i dati connessi come una rete di nodi e archi. I nodi rappresentano le entità nei dati, come clienti, prodotti o località. Gli archi rappresentano le connessioni tra questi nodi, acquisendo relazioni come acquisti, follower o località.

I nodi e gli archi possono includere le seguenti informazioni:

  • Etichette: classificano i tipi di nodi e archi. Ad esempio, gli studenti di una classe potrebbero avere un'etichetta Student e un'etichetta Person. Se non definisci esplicitamente un'etichetta per un nodo o un arco, BigQuery Graph utilizza il nome della tabella di input come etichetta predefinita.

  • Proprietà: utilizzate per descrivere nodi e archi. Ad esempio, un nodo che rappresenta una persona potrebbe avere una proprietà name con il valore Alex e una proprietà id con il valore 1.

L'esempio nella Figura 1 mostra come potresti progettare un grafo per modellare le attività finanziarie. Questo grafo include i seguenti tipi di entità modellate come nodi:

  • Persona: rappresenta una persona coinvolta in transazioni finanziarie.
  • Account: rappresenta un conto bancario utilizzato per le transazioni.

Queste entità sono collegate da diversi tipi di relazioni, rappresentate dai seguenti archi diretti:

  • Owns: una persona possiede uno o più account.
  • Trasferimenti: il denaro si sposta da un conto all'altro.

Ogni arco diretto indica una relazione unidirezionale che scorre da un nodo di origine a un nodo di destinazione. Ad esempio, un arco Transfers collega un Account di origine a un Account di destinazione, indicando il flusso di denaro.

Nodi, archi, etichette e proprietà di un grafico finanziario.

Figura 1. Esempio di grafo con più nodi e archi diretti.

I nodi e gli archi includono informazioni aggiuntive nelle proprietà.

  • I nodi Person includono queste proprietà:

    • name (STRING)
    • id (INT64)
  • Gli archi Transfers includono questa proprietà:

    • amount (FLOAT64)

Archi diretti e non diretti

Gli archi diretti indicano una direzione specifica nella relazione tra le entità. Ad esempio, una persona possiede un conto, ma un conto non possiede una persona. Tuttavia, alcune relazioni, come la relazione di amicizia in un social network, non sono dirette e rappresentano una connessione reciproca. In questo caso, puoi modellare gli archi non diretti come due archi diretti, uno in ogni direzione.

Progettare lo schema

BigQuery Graph consente di utilizzare l' CREATE PROPERTY GRAPH per creare un grafo dalle tabelle. Le tabelle che creano i grafi sono chiamate tabelle di input.

Definire un nodo

I nodi sono definiti dalle righe delle tabelle. Per definire un nodo, aggiungi una definizione di nodo nella NODE TABLES clausola. La forma più semplice di una definizione di nodo contiene il nome di una tabella di input con una chiave primaria. BigQuery Graph mappa le righe della tabella di input ai nodi del grafo.

Nell'esempio seguente, utilizzi la clausola NODE TABLES per definire il nodo Account nel grafo di proprietà FinGraph. La definizione del nodo contiene la tabella di input Account.

-- Create an Account table.
CREATE TABLE graph_db.Account (
  id           INT64 NOT NULL,
  create_time  TIMESTAMP,
  PRIMARY KEY (id) NOT ENFORCED
);

-- Use the Account table as the input table for the Account node definition.
CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Account
  );

Per impostazione predefinita, BigQuery utilizza il nome della tabella come etichetta ed espone tutte le colonne della tabella di input come proprietà.

  • Ogni nodo del conto utilizza l'etichetta Account.
  • Ogni nodo del conto include le proprietà id e create_time dalle colonne della tabella Account.

Chiave dell'elemento

Una definizione di nodo definisce anche la chiave dell'elemento, una raccolta di colonne che identifica in modo univoco un nodo del grafo. Per impostazione predefinita, la chiave dell'elemento è la chiave primaria della tabella di input. In alternativa, puoi utilizzare la clausola KEY per definire esplicitamente le chiavi degli elementi.

L'esempio seguente definisce un nodo Account e un nodo Person. Il nodo Account utilizza la chiave primaria della tabella Account come chiave dell'elemento. Il nodo Person specifica esplicitamente la colonna id come chiave dell'elemento utilizzando la clausola KEY.

CREATE TABLE graph_db.Person (
  id           INT64 NOT NULL,
  name         STRING
);

CREATE TABLE graph_db.Account (
  id           INT64 NOT NULL,
  create_time  TIMESTAMP,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person KEY (id),
    graph_db.Account
  );
  • Ogni riga con una chiave dell'elemento non nulla viene mappata a un nodo univoco nel grafo identificato dalla chiave dell'elemento.
  • Le righe con una chiave dell'elemento nulla vengono ignorate.

La stessa tabella di input può essere utilizzata in più definizioni di nodi. In questo caso, una determinata riga della tabella di input viene mappata a un nodo per ogni definizione di nodo.

Definire un arco

Gli archi sono definiti dalle righe delle tabelle. Per definire un arco, aggiungi una definizione di arco alla EDGE TABLES clausola. La forma più semplice di definizione di arco contiene il nome di una tabella di input e definisce i riferimenti ai nodi di origine e di destinazione. BigQuery Graph utilizza questa definizione per mappare le righe della tabella di input agli archi del grafo.

Per impostazione predefinita, BigQuery utilizza il nome della tabella come etichetta ed espone tutte le colonne della tabella di input come proprietà.

Riferimenti ai nodi di origine e di destinazione

Una definizione di arco definisce il riferimento al nodo di origine e di destinazione utilizzando le clausole SOURCE KEY, DESTINATION KEY e REFERENCES. Devi definire i nodi di origine e di destinazione prima di utilizzarli nella definizione dell'arco.

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

  • Nodi Person e Account
  • Arco PersonOwnAccount
CREATE TABLE graph_db.Person (
  id            INT64 NOT NULL,
  name          STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE TABLE graph_db.Account (
  id            INT64 NOT NULL,
  create_time   TIMESTAMP,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE TABLE graph_db.PersonOwnAccount (
  id            INT64 NOT NULL,
  account_id    INT64 NOT NULL,
  create_time   TIMESTAMP,
  FOREIGN KEY (account_id) REFERENCES graph_db.Account (id) NOT ENFORCED,
  PRIMARY KEY (id, account_id) NOT ENFORCED
);

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person,
    graph_db.Account
  )
  EDGE TABLES (
    PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
  );

Ogni PersonOwnAccount arco collega un nodo Person (origine) a un nodo Account (destinazione).

  • Il nodo di origine di un arco è un nodo Person in cui la proprietà id è uguale alla proprietà id dell'arco.
  • Il nodo di destinazione di un arco è un nodo Account in cui la proprietà id è uguale alla proprietà account_id dell'arco.
  • 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 arco ha l'etichetta predefinita PersonOwnAccount.

Mappare le righe agli archi

Ogni riga della tabella di input dell'arco con una chiave dell'elemento non nulla viene in genere mappata a un singolo arco nel grafo. Tuttavia, se il riferimento al nodo di origine o di destinazione corrisponde a zero o più nodi nella tabella dei nodi di origine o di destinazione, la riga nella tabella di input dell'arco potrebbe generare zero o più archi nel grafo.

Definire nodi e archi in una singola tabella

Puoi definire un nodo e i relativi archi in entrata o in uscita in una singola tabella se le colonne della tabella definiscono una relazione con un'altra tabella. Questo approccio riduce il numero di tabelle, semplifica la gestione dei dati e può migliorare il rendimento delle query eliminando la necessità di un join a una tabella degli archi separata.

Ad esempio, se la seguente tabella Account ha una chiave primaria composta (owner_id, account_id), la colonna owner_id può essere una chiave esterna che fa riferimento a una tabella Person. Questa struttura consente alla tabella Account di rappresentare sia il nodo Account sia l'arco in entrata dal nodo Person.

CREATE TABLE graph_db.Person (
  id INT64 NOT NULL,
  PRIMARY KEY (id) NOT ENFORCED
);

-- Assume each account has exactly one owner.
CREATE TABLE graph_db.Account (
  owner_id INT64 NOT NULL,
  account_id INT64 NOT NULL,
  FOREIGN KEY (owner_id) REFERENCES graph_db.Person(id) NOT ENFORCED,
  PRIMARY KEY (owner_id, account_id) NOT ENFORCED
);

Puoi utilizzare la tabella Account per definire sia il nodo Account sia l'arco in entrata Owns. Questo è mostrato nella seguente istruzione CREATE PROPERTY GRAPH. Nella clausola EDGE TABLES, assegna alla tabella Account l'alias Owns. Questo perché ogni elemento nello schema del grafo deve avere un nome univoco.

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person,
    graph_db.Account
  )
  EDGE TABLES (
    graph_db.Account AS Owns
      SOURCE KEY (owner_id) REFERENCES Person
      DESTINATION KEY (owner_id, account_id) REFERENCES Account
  );

Personalizzare etichette e proprietà

Puoi utilizzare le LABEL e le PROPERTIES clausole per personalizzare etichette e proprietà.

L'esempio seguente definisce un nodo Person con una proprietà personalizzata e un nodo Account con più etichette:

CREATE TABLE graph_db.Person (
  id               INT64 NOT NULL,
  name             STRING,
  birthday         TIMESTAMP,
  country          STRING,
  city             STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE TABLE graph_db.Account (
  id               INT64 NOT NULL,
  create_time      TIMESTAMP,
  is_blocked       BOOL,
  nick_name        STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person KEY (id)
      LABEL Customer
      PROPERTIES (CONCAT(city, ", ", country) AS address)
      LABEL Entity PROPERTIES (id, name),
    graph_db.Account KEY (id)
      LABEL Account PROPERTIES (id, create_time)
      LABEL Entity PROPERTIES (id, nick_name AS name)
  );
  • I nodi Person utilizzano l'etichetta Customer per esporre la proprietà address. La proprietà address è definita dall'espressione CONCAT(city, ", ", country), che fa riferimento alle colonne city e country della tabella di input Person.

  • Il nodo Account utilizza l'etichetta Account per esporre le proprietà id e create_time.

I nodi Person e Account hanno entrambi l'etichetta Entity con le proprietà id e name.

  • Nel nodo Person, le proprietà id e name provengono dalle colonne della tabella di input.
  • Nel nodo Account, la proprietà name fa riferimento alla colonna nick_name della tabella di input.

Coerenza di etichette e proprietà

In un grafo, le etichette e le proprietà sono identificate in modo univoco dai relativi nomi. Puoi utilizzare etichette e proprietà con lo stesso nome in più definizioni di nodi o archi. Tuttavia, le etichette e le proprietà con lo stesso nome devono rispettare queste regole:

  • Le proprietà con lo stesso nome devono utilizzare 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 in quelli Account. Entrambe le definizioni includono lo stesso insieme di nomi di proprietà, id e name, con tipi di valori identici.

Gestire le dipendenze dello schema

I grafi dipendono dallo schema delle tabelle di input per le definizioni di nodi e archi e dalle colonne delle tabelle a cui fanno riferimento le proprietà. BigQuery Graph non verifica se l'eliminazione o la modifica di tabelle o colonne invalida uno schema di grafo esistente.

È tua responsabilità evitare modifiche allo schema che causano interruzioni. Segui queste best practice:

  • Prima di eliminare una tabella utilizzata in una definizione di nodo del grafo, rimuovi prima la definizione del nodo dal grafo.
  • Prima di rimuovere una colonna da una tabella esposta come proprietà in un grafo, rimuovi la proprietà dalla definizione del nodo o dell'arco corrispondente.

Visualizzare gli schemi dei grafi

Puoi visualizzare lo schema del grafo in un notebook.

Aggiornare uno schema di grafo

Per apportare modifiche allo schema di un grafo esistente, devi ridefinire lo schema del grafo utilizzando l'istruzione CREATE PROPERTY GRAPH.

Eliminare uno schema di grafo

Per eliminare un grafo di proprietà, utilizza l'istruzione DROP PROPERTY GRAPH statement.

Passaggi successivi