Crea y consulta un grafo
BigQuery Graph te permite modelar datos relacionales como nodos y bordes para consultar relaciones complejas con el Graph Query Language (GQL). En este instructivo, crearás tablas de nodos y aristas para un conjunto de datos financieros, definirás un grafo de propiedades y ejecutarás consultas de patrones de grafos.
Roles obligatorios
Para obtener los permisos que
necesitas para trabajar con grafos,
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 bordes y el grafo.
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 grafos. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:
Permisos necesarios
Se requieren los siguientes permisos para trabajar con grafos:
-
Crea un grafo:
bigquery.propertyGraphs.create -
Enumera los grafos y sus metadatos:
bigquery.propertyGraphs.list -
Obtén los metadatos y la definición de un grafo:
bigquery.propertyGraphs.get -
Actualiza los metadatos y la definición de un grafo:
bigquery.propertyGraphs.update -
Borra un grafo:
bigquery.propertyGraphs.delete
También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.
Crea tablas de nodos y de bordes
Los grafos se crean a partir de tablas de BigQuery existentes y se almacenan en
conjuntos de datos.
Para almacenar las tablas y el grafo que creas 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;
En las siguientes tablas, se incluye información sobre las personas y las cuentas, y las relaciones entre cada una de estas entidades:
Person: información sobre personas.Account: información sobre cuentas bancariasPersonOwnAccount: información sobre quién es el propietario de cada cuenta.AccountTransferAccount: información sobre las transferencias entre cuentas
Para crear estas tablas, ejecuta las siguientes
sentencias 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 grafo, puedes usar la
declaración CREATE PROPERTY GRAPH
o el modelador de grafos visual.
En el siguiente ejemplo, se usa la sentencia CREATE PROPERTY GRAPH para crear un
grafo 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 aristas, 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 de un grafo, actualiza los datos de las tablas de nodos y de bordes. 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");

Consulta un gráfico
Para consultar un grafo, ejecuta consultas que usen el Graph Query Language.
En la siguiente consulta, se usa una
declaració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 grafos como fuente de datos en Conversational Analytics, lo que te permite hacer preguntas en lenguaje natural sobre tus grafos. Por ejemplo, puedes preguntar "¿A quién le transfirió dinero Dana y cuánto se transfirió?".
Visualiza los resultados de las consultas de grafos
Puedes
visualizar los resultados de tu consulta de grafo
en un notebook con el comando mágico %%bigquery --graph seguido de tu
consulta de GQL. La consulta debe devolver elementos del grafo 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;

Borra un grafo
Para borrar un grafo, usa la declaración DROP PROPERTY GRAPH. Borrar un grafo no tiene ningún efecto
en las tablas que se usaron para definir los nodos y los vínculos del grafo. La siguiente
consulta borra el grafo FinGraph:
DROP PROPERTY GRAPH graph_db.FinGraph;
¿Qué sigue?
- Consulta la introducción a BigQuery Graph.
- Obtén más información sobre los esquemas de grafos.
- Obtén más información para escribir consultas de gráficos.
- Obtén más información sobre el lenguaje de consulta de grafos (GQL).
- Para obtener un instructivo sobre la detección de fraudes, consulta Detección de fraudes con BigQuery Graph.
- Para obtener un instructivo sobre los perfiles de clientes, consulta Crea recomendaciones de Customer 360 con BigQuery Graph.
- Para obtener un instructivo sobre las cadenas de suministro, consulta Trazabilidad de la cadena de suministro con BigQuery Graph.