Crea ed esegui query su un grafico

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

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per creare grafici ed eseguire query su di essi, 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 degli archi e il grafico. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Creare tabelle di nodi e archi

I grafici vengono creati a partire da tabelle BigQuery esistenti e memorizzati nei set di dati. Per archiviare le tabelle e il grafico 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 tabelle seguenti contengono informazioni su persone e account e sulle relazioni tra ciascuna di queste entità:

  • Person: informazioni sulle persone.
  • Account: informazioni sui conti bancari.
  • PersonOwnAccount: informazioni su chi è il proprietario di quali account.
  • AccountTransferAccount: informazioni sui trasferimenti tra conti.

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

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 grafico

Per creare un grafico, utilizza l'istruzione CREATE PROPERTY GRAPH. L'esempio seguente crea un grafico 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 degli archi, 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
  );

Inserisci i dati

Per aggiornare i dati in un grafico, devi aggiornare i dati nelle tabelle dei nodi e degli archi. Quando crei un grafico, i tuoi dati non vengono spostati o copiati. Un grafico funge da visualizzazione logica dei dati presenti nelle tabelle dei nodi e degli archi. Le query sui grafici restituiscono risultati basati sui dati presenti nelle tabelle dei nodi e degli archi 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 una query su un grafico

Per eseguire query su un grafico, 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            |
+-------+--------+----------------+

Visualizzare i risultati delle query del grafico

Puoi visualizzare i risultati della query del grafico in un blocco note utilizzando il comando magico %%bigquery --graph seguito dalla query GQL. La query deve restituire gli elementi del grafico 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 grafico

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

DROP PROPERTY GRAPH graph_db.FinGraph;

Passaggi successivi