Creare ed eseguire query su un grafo

Questo documento mostra come utilizzare BigQuery Graph per creare un grafo con informazioni finanziarie ed eseguire query sui grafi utilizzando il Graph Query Language (GQL).

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per lavorare con i grafi, chiedi all'amministratore di concederti il ruolo IAM Editor dati BigQuery (roles/bigquery.dataEditor) sul set di dati in cui crei le tabelle dei nodi, le tabelle dei bordi e il grafo. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Questo ruolo predefinito contiene le autorizzazioni necessarie per lavorare con i grafi. Per vedere quali sono esattamente le autorizzazioni richieste, espandi la sezione Autorizzazioni obbligatorie:

Autorizzazioni obbligatorie

Per lavorare con i grafi sono necessarie le seguenti autorizzazioni:

  • Crea un grafo: bigquery.propertyGraphs.create
  • Elenca i grafi e i relativi metadati: bigquery.propertyGraphs.list
  • Ottieni i metadati e la definizione di un grafo: bigquery.propertyGraphs.get
  • Aggiorna i metadati e la definizione di un grafo: bigquery.propertyGraphs.update
  • Elimina un grafo: bigquery.propertyGraphs.delete

Potresti anche ottenere queste autorizzazioni con ruoli personalizzati o altri ruoli predefiniti.

Creare tabelle dei nodi e dei bordi

I grafi vengono creati da tabelle BigQuery esistenti e archiviati nei set di dati. Per archiviare le tabelle e il grafo che crei negli esempi seguenti, crea un set di dati. La seguente query crea un set di dati denominato graph_db:

CREATE SCHEMA IF NOT EXISTS graph_db;

Le seguenti tabelle contengono informazioni su persone e account, nonché sulle relazioni tra ciascuna di queste entità:

  • Person: informazioni sulle persone.
  • Account: informazioni sui conti bancari.
  • PersonOwnAccount: informazioni su chi possiede quali account.
  • AccountTransferAccount: informazioni sui trasferimenti tra account.

Per creare queste tabelle, esegui le seguenti CREATE TABLE istruzioni:

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

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

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

CREATE OR REPLACE TABLE graph_db.AccountTransferAccount (
  id               INT64 NOT NULL,
  to_id            INT64 NOT NULL,
  amount           FLOAT64,
  create_time      TIMESTAMP NOT NULL,
  order_number     STRING,
  PRIMARY KEY (id, to_id, create_time) NOT ENFORCED,
  FOREIGN KEY (id) REFERENCES graph_db.Account(id) NOT ENFORCED,
  FOREIGN KEY (to_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);

Creare un grafo

Per creare un grafo, puoi utilizzare l' CREATE PROPERTY GRAPHistruzione o il modellatore di grafi visivo. L'esempio seguente utilizza l'istruzione CREATE PROPERTY GRAPH per creare un grafo denominato FinGraph nel set di dati graph_db. Le tabelle Account e Person sono le tabelle dei nodi. Le tabelle AccountTransferAccount e PersonOwnAccount sono le tabelle dei bordi, che rappresentano le relazioni tra le tabelle dei nodi.

CREATE OR REPLACE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Account,
    graph_db.Person
  )
  EDGE TABLES (
    graph_db.PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
      LABEL Owns,
    graph_db.AccountTransferAccount
      SOURCE KEY (id) REFERENCES Account (id)
      DESTINATION KEY (to_id) REFERENCES Account (id)
      LABEL Transfers
  );

Inserire i dati

Per aggiornare i dati in un grafo, aggiorna i dati nelle tabelle dei nodi e dei bordi. Quando crei un grafo, i dati non vengono spostati o copiati. Un grafo funge invece da visualizzazione logica dei dati esistenti nelle tabelle dei nodi e dei bordi. Le query sui grafi restituiscono risultati in base ai dati esistenti nelle tabelle dei nodi e dei bordi al momento dell'esecuzione della query.

La seguente query inserisce i dati nelle tabelle che hai creato:

INSERT INTO graph_db.Account
  (id, create_time, is_blocked, nick_name)
VALUES
  (7,"2020-01-10 06:22:20.222",false,"Vacation Fund"),
  (16,"2020-01-27 17:55:09.206",true,"Vacation Fund"),
  (20,"2020-02-18 05:44:20.655",false,"Rainy Day Fund");

INSERT INTO graph_db.Person
  (id, name, birthday, country, city)
VALUES
  (1,"Alex","1991-12-21 00:00:00","Australia","Adelaide"),
  (2,"Dana","1980-10-31 00:00:00","Czech_Republic","Moravia"),
  (3,"Lee","1986-12-07 00:00:00","India","Kollam");

INSERT INTO graph_db.AccountTransferAccount
  (id, to_id, amount, create_time, order_number)
VALUES
  (7,16,300,"2020-08-29 15:28:58.647","304330008004315"),
  (7,16,100,"2020-10-04 16:55:05.342","304120005529714"),
  (16,20,300,"2020-09-25 02:36:14.926","103650009791820"),
  (20,7,500,"2020-10-04 16:55:05.342","304120005529714"),
  (20,16,200,"2020-10-17 03:59:40.247","302290001255747");

INSERT INTO graph_db.PersonOwnAccount
  (id, account_id, create_time)
VALUES
  (1,7,"2020-01-10 06:22:20.222"),
  (2,20,"2020-01-27 17:55:09.206"),
  (3,16,"2020-02-18 05:44:20.655");

Visualizzazione dell'esempio di grafico finanziario

Eseguire query su un grafo

Per eseguire query su un grafo, esegui query che utilizzano il Graph Query Language.

La seguente query utilizza un'istruzione MATCH per trovare informazioni su a chi Dana ha trasferito denaro:

GRAPH graph_db.FinGraph
MATCH
  (person:Person {name: "Dana"})-[own:Owns]->
  (account:Account)-[transfer:Transfers]->(account2:Account)<-[own2:Owns]-(person2:Person)
RETURN
  person.name AS owner,
  transfer.amount AS amount,
  person2.name AS transferred_to
ORDER BY person2.name;

I risultati sono simili ai seguenti:

+-------+--------+----------------+
| owner | amount | transferred_to |
+-------+--------+----------------+
| Dana  | 500.0  | Alex           |
| Dana  | 200.0  | Lee            |
+-------+--------+----------------+

Puoi anche utilizzare i grafi come origine dati in analisi conversazionale, che ti consente di porre domande in linguaggio naturale sui grafi. Ad esempio, potresti chiedere "A chi ha trasferito denaro Dana e quanto è stato trasferito?"

Visualizzare i risultati delle query sui grafi

Puoi visualizzare i risultati delle query sui grafi in un notebook utilizzando il comando magico %%bigquery --graph seguito dalla query GQL. La query deve restituire gli elementi del grafo in formato JSON. Per visualizzare i risultati della query eseguita nella sezione precedente, esegui la seguente query in una cella di codice del notebook:

%%bigquery --graph
GRAPH graph_db.FinGraph
MATCH
  p = ((person:Person {name: "Dana"})-[own:Owns]->
  (account:Account)-[transfer:Transfers]->(acount2:Account)<-[own2:Owns]-(person2:Person))
RETURN
  TO_JSON(p) AS path;

Visualizzazione dei trasferimenti di Dana in un notebook

Eliminare un grafo

Per eliminare un grafo, utilizza l'istruzione DROP PROPERTY GRAPH statement. L'eliminazione di un grafo non ha alcun effetto sulle tabelle utilizzate per definire i nodi e i bordi del grafo. La seguente query elimina il grafo FinGraph:

DROP PROPERTY GRAPH graph_db.FinGraph;

Passaggi successivi