Crea y consulta un gráfico

En este documento, se muestra cómo usar BigQuery Graph para crear un gráfico con información financiera y ejecutar consultas de gráficos con el Graph Query Language (GQL).

Roles obligatorios

Para obtener los permisos que necesitas para trabajar con gráficos, pídele a tu administrador que te otorgue el rol de IAM de editor de datos de BigQuery (roles/bigquery.dataEditor) en el conjunto de datos en el que creas las tablas de nodos, las tablas de aristas y el gráfico. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

Este rol predefinido contiene los permisos necesarios para trabajar con gráficos. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Se requieren los siguientes permisos para trabajar con gráficos:

  • Crea un gráfico: bigquery.propertyGraphs.create
  • Enumera los gráficos y sus metadatos: bigquery.propertyGraphs.list
  • Obtén los metadatos y la definición de un gráfico: bigquery.propertyGraphs.get
  • Actualiza los metadatos y la definición de un gráfico: bigquery.propertyGraphs.update
  • Borra un gráfico: bigquery.propertyGraphs.delete

También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.

Crea tablas de nodos y aristas

Los gráficos se compilan a partir de tablas existentes de BigQuery y se almacenan en conjuntos de datos. Para almacenar las tablas y el gráfico que crees en los siguientes ejemplos, crea un conjunto de datos. La siguiente consulta crea un conjunto de datos llamado graph_db:

CREATE SCHEMA IF NOT EXISTS graph_db;

Las siguientes tablas contienen información sobre personas y cuentas, y las relaciones entre cada una de estas entidades:

  • Person: Información sobre personas
  • Account: Es información sobre cuentas bancarias.
  • PersonOwnAccount: Información sobre quién es propietario de qué cuentas.
  • AccountTransferAccount: Es información sobre las transferencias entre cuentas.

Para crear estas tablas, ejecuta las siguientes instrucciones de 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
);

Crea un gráfico

Para crear un gráfico, puedes usar la declaración CREATE PROPERTY GRAPH o el modelador visual de gráficos. En el siguiente ejemplo, se usa la instrucción CREATE PROPERTY GRAPH para crear un gráfico llamado FinGraph en el conjunto de datos graph_db. Las tablas Account y Person son las tablas de nodos. Las tablas AccountTransferAccount y PersonOwnAccount son las tablas de borde, que representan las relaciones entre las tablas de nodos.

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

Inserta datos

Para actualizar los datos en un grafo, debes actualizar los datos en tus tablas de nodos y aristas. Cuando creas un grafo, tus datos no se mueven ni se copian. En cambio, un grafo actúa como una vista lógica de los datos que existen en tus tablas de nodos y aristas. Tus consultas de grafos devuelven resultados basados en los datos que existen en tus tablas de nodos y aristas en el momento en que ejecutas la consulta.

La siguiente consulta inserta datos en las tablas que creaste:

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

Visualización de un ejemplo de gráfico financiero

Cómo consultar un gráfico

Para consultar un grafo, debes ejecutar consultas que usen el Graph Query Language.

La siguiente consulta usa una instrucción MATCH para encontrar información sobre a quién le transfirió dinero Dana:

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;

Los resultados son similares a los siguientes:

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

También puedes usar gráficos como fuente de datos en Conversational Analytics, que te permite hacer preguntas en lenguaje natural sobre tus gráficos. Por ejemplo, puedes preguntar: "¿A quién le transfirió dinero Dana y cuánto se transfirió?".

Visualiza los resultados de las consultas de gráficos

Puedes visualizar los resultados de tu consulta de gráfico en un notebook con el comando mágico %%bigquery --graph seguido de tu consulta en GQL. La consulta debe devolver elementos del gráfico en formato JSON. Para visualizar los resultados de la consulta que ejecutaste en la sección anterior, ejecuta la siguiente consulta en una celda de código 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;

Visualización de las transferencias de Dana en un notebook

Borra un gráfico

Para borrar un gráfico, usa la instrucción DROP PROPERTY GRAPH. Borrar un gráfico no afecta a las tablas que se usaron para definir los nodos y los bordes del gráfico. La siguiente consulta borra el gráfico FinGraph:

DROP PROPERTY GRAPH graph_db.FinGraph;

¿Qué sigue?