Créer et interroger un graphique

Ce document explique comment utiliser BigQuery Graph pour créer un graphique contenant des informations financières et exécuter des requêtes graphiques à l'aide du langage de requête de graphe (GQL).

Rôles requis

Pour obtenir les autorisations nécessaires pour créer et interroger des graphiques, demandez à votre administrateur de vous accorder le rôle IAM Éditeur de données BigQuery (roles/bigquery.dataEditor) sur l'ensemble de données dans lequel vous créez les tables de nœuds, les tables d'arêtes et le graphique. Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.

Créer des tables de nœuds et d'arêtes

Les graphiques sont créés à partir de tables BigQuery existantes et stockés dans des ensembles de données. Pour stocker les tables et le graphique que vous créez dans les exemples suivants, créez un ensemble de données. La requête suivante crée un ensemble de données nommé graph_db :

CREATE SCHEMA IF NOT EXISTS graph_db;

Les tableaux suivants contiennent des informations sur les personnes et les comptes, ainsi que sur les relations entre chacune de ces entités :

  • Person : informations sur les personnes.
  • Account : informations sur les comptes bancaires.
  • PersonOwnAccount : informations sur les propriétaires des comptes.
  • AccountTransferAccount : informations sur les transferts entre comptes.

Pour créer ces tables, exécutez les instructions CREATE TABLE suivantes :

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
);

Créer un graphique

Pour créer un graphique, utilisez l'instruction CREATE PROPERTY GRAPH. L'exemple suivant crée un graphique appelé FinGraph dans l'ensemble de données graph_db. Les tables Account et Person sont les tables de nœuds. Les tables AccountTransferAccount et PersonOwnAccount sont les tables d'arêtes, qui représentent les relations entre les tables de nœuds.

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
  );

Insérer des données

Pour mettre à jour les données d'un graphique, vous devez mettre à jour les données de vos tables de nœuds et d'arêtes. Lorsque vous créez un graphique, vos données ne sont ni déplacées ni copiées. Au lieu de cela, un graphique sert de vue logique des données qui existent dans vos tables de nœuds et d'arêtes. Vos requêtes de graphiques renvoient des résultats basés sur les données qui existent dans vos tables de nœuds et d'arêtes au moment où vous exécutez la requête.

La requête suivante insère des données dans les tables que vous avez créées :

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");

Exemple de visualisation d'un graphique financier

Interroger un graphique

Pour interroger un graphique, vous exécutez des requêtes qui utilisent le langage de requête Graph.

La requête suivante utilise une instruction MATCH pour trouver des informations sur la personne à qui Dana a transféré de l'argent :

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;

Les résultats ressemblent à ce qui suit :

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

Visualiser les résultats des requêtes graphiques

Vous pouvez visualiser les résultats de votre requête de graphe dans un notebook à l'aide de la commande magique %%bigquery --graph suivie de votre requête GQL. La requête doit renvoyer des éléments de graphique au format JSON. Pour visualiser les résultats de la requête que vous avez exécutée dans la section précédente, exécutez la requête suivante dans une cellule de code de 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;

Visualisation des transferts de Dana dans un notebook

Supprimer un graphique

Pour supprimer un graphique, utilisez l'instruction DROP PROPERTY GRAPH. La suppression d'un graphique n'a aucune incidence sur les tables qui ont été utilisées pour définir les nœuds et les arêtes du graphique. La requête suivante supprime le graphique FinGraph :

DROP PROPERTY GRAPH graph_db.FinGraph;

Étapes suivantes