1. Introducción
En este codelab, aprenderás a usar BigQuery Graph para crear una vista de 360 grados del cliente y un motor de recomendaciones para Cymbal Pets, una empresa ficticia de venta minorista. Aprovecharás la potencia de SQL para crear, consultar y analizar datos de gráficos directamente en BigQuery, combinándolos con la búsqueda de vectores para obtener recomendaciones de productos avanzadas.
BigQuery Graph te permite modelar las relaciones entre tus entidades de datos (como clientes, productos y pedidos) como un gráfico, lo que facilita responder preguntas complejas sobre el comportamiento de los clientes y las afinidades de los productos.

Actividades
- Crea un conjunto de datos y un esquema de BigQuery para el gráfico de Cymbal Pets.
- Carga datos de muestra (clientes, productos, pedidos, tiendas) desde Cloud Storage.
- Crea un gráfico de propiedades en BigQuery que conecte estas entidades.
- Visualiza el historial de compras de los clientes con consultas de gráficos.
- Compila un sistema de recomendación de productos con la búsqueda de vectores.
- Mejora las recomendaciones con las relaciones de gráficos "Comprados juntos".
Requisitos
- Un navegador web, como Chrome
- Un proyecto de Google Cloud con la facturación habilitada.
Este codelab está destinado a desarrolladores de todos los niveles, incluidos los principiantes.
2. Antes de comenzar
Cómo crear un proyecto de Google Cloud
- En la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.
- Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud.
Inicie Cloud Shell
- Haz clic en Activar Cloud Shell en la parte superior de la consola de Google Cloud.
- Verifica la autenticación:
gcloud auth list
- Confirma tu proyecto:
gcloud config get project
- Configúralo si es necesario:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
Habilita las APIs
Ejecuta este comando para habilitar la API de BigQuery requerida:
gcloud services enable bigquery.googleapis.com
3. Define el esquema
Primero, debes crear un conjunto de datos para almacenar tus tablas relacionadas con el gráfico y definir el esquema de tus nodos y bordes.
- Para este codelab, ejecutaremos comandos de SQL. Puedes ejecutar estos comandos en el BigQuery Studio > Editor de SQL o usar el comando
bq queryen Cloud Shell.
Supondremos que usas el Editor de SQL de BigQuery para obtener una mejor experiencia con las instrucciones de creación de varias líneas. - Crea el conjunto de datos
cymbal_pets_demo:
CREATE SCHEMA IF NOT EXISTS cymbal_pets_demo;
- Crea las tablas para
order_items,products,orders,stores,customersyco_related_products_for_angelica. Estas tablas servirán como datos de origen para nuestro gráfico.
CREATE TABLE IF NOT EXISTS cymbal_pets_demo.order_items
(
order_id INT64,
product_id INT64,
order_item_id INT64,
quantity INT64,
price FLOAT64,
PRIMARY KEY (order_id, product_id, order_item_id) NOT ENFORCED
)
CLUSTER BY order_item_id;
CREATE TABLE IF NOT EXISTS cymbal_pets_demo.products
(
product_id INT64,
product_name STRING,
brand STRING,
category STRING,
subcategory INT64,
animal_type INT64,
search_keywords INT64,
price FLOAT64,
description STRING,
inventory_level INT64,
supplier_id INT64,
average_rating FLOAT64,
uri STRING,
embedding ARRAY<FLOAT64>,
PRIMARY KEY (product_id) NOT ENFORCED
)
CLUSTER BY product_id;
CREATE TABLE IF NOT EXISTS cymbal_pets_demo.orders
(
customer_id INT64,
order_id INT64,
shipping_address_city STRING,
store_id INT64,
order_date DATE,
order_type STRING,
payment_method STRING,
PRIMARY KEY (order_id) NOT ENFORCED
)
PARTITION BY order_date
CLUSTER BY order_id;
CREATE TABLE IF NOT EXISTS cymbal_pets_demo.stores
(
store_id INT64,
store_name STRING,
address_state STRING,
address_city STRING,
latitude FLOAT64,
longitude FLOAT64,
opening_hours STRUCT<Monday STRING, Tuesday STRING, Wednesday STRING, Thursday STRING, Friday STRING, Saturday STRING, Sunday STRING>,
manager_id INT64,
PRIMARY KEY (store_id) NOT ENFORCED
)
CLUSTER BY store_id;
CREATE TABLE IF NOT EXISTS cymbal_pets_demo.customers
(
customer_id INT64,
first_name STRING,
last_name STRING,
email STRING,
gender STRING,
address_city STRING,
address_state STRING,
loyalty_member BOOL,
PRIMARY KEY (customer_id) NOT ENFORCED
)
CLUSTER BY customer_id;
CREATE TABLE IF NOT EXISTS cymbal_pets_demo.co_related_products_for_angelica
(
angelica_product_id INT64,
other_product_id INT64,
co_purchase_count INT64
);
Ahora definiste la estructura de los datos de tu gráfico.
4. Carga los datos
Ahora, propaga las tablas con datos de muestra de Cloud Storage.
Ejecuta las siguientes instrucciones LOAD DATA en el editor de SQL de BigQuery:
LOAD DATA INTO `cymbal_pets_demo.customers`
FROM FILES (
format = 'AVRO',
uris = ['gs://sample-data-and-media/cymbal-pets/tables/customers/*.avro']
);
LOAD DATA INTO `cymbal_pets_demo.order_items`
FROM FILES (
format = 'AVRO',
uris = ['gs://sample-data-and-media/cymbal-pets/tables/order_items/*.avro']
);
LOAD DATA INTO `cymbal_pets_demo.orders`
FROM FILES (
format = 'AVRO',
uris = ['gs://sample-data-and-media/cymbal-pets/tables/orders/*.avro']
);
LOAD DATA INTO `cymbal_pets_demo.products`
FROM FILES (
format = 'AVRO',
uris = ['gs://sample-data-and-media/cymbal-pets/tables/products/*.avro']
);
LOAD DATA INTO `cymbal_pets_demo.stores`
FROM FILES (
format = 'AVRO',
uris = ['gs://sample-data-and-media/cymbal-pets/tables/stores/*.avro']
);
Deberías ver un mensaje de confirmación que indica que se cargaron filas en cada tabla.
5. Crea el gráfico de propiedades
Con los datos cargados, ahora puedes definir el gráfico de propiedades. Esto le indica a BigQuery qué tablas representan nodos (entidades como clientes y productos) y qué tablas representan bordes (relaciones como "Visitó", "Realizó" y "Tiene").

Ejecuta la siguiente sentencia de DDL:
CREATE OR REPLACE PROPERTY GRAPH cymbal_pets_demo.PetsOrderGraph
NODE TABLES (
cymbal_pets_demo.customers KEY(customer_id) LABEL Customer,
cymbal_pets_demo.products KEY(product_id) LABEL Products,
cymbal_pets_demo.stores KEY(store_id) LABEL Stores,
cymbal_pets_demo.orders KEY(order_id) LABEL Orders
)
EDGE TABLES (
cymbal_pets_demo.orders as customer_to_store_edge
KEY (order_id)
SOURCE KEY (customer_id) references customers(customer_id)
DESTINATION KEY (store_id) references stores(store_id)
LABEL Visited
PROPERTIES ALL COLUMNS,
cymbal_pets_demo.order_items
KEY (order_item_id)
SOURCE KEY (order_id) references orders(order_id)
DESTINATION KEY (product_id) references products(product_id)
LABEL Has
PROPERTIES ALL COLUMNS,
cymbal_pets_demo.orders as customer_to_orders_edge
KEY (order_id)
SOURCE KEY (customer_id) references customers(customer_id)
DESTINATION KEY (order_id) references orders(order_id)
LABEL Placed
PROPERTIES ALL COLUMNS,
cymbal_pets_demo.co_related_products_for_angelica
KEY (angelica_product_id)
SOURCE KEY (angelica_product_id) references products(product_id)
DESTINATION KEY (other_product_id) references products(product_id)
LABEL BoughtTogether
PROPERTIES ALL COLUMNS
);
Esto crea el gráfico PetsOrderGraph, que nos permite realizar recorridos de gráficos con el operador GRAPH_TABLE.
6. Visualiza el historial de compras de todos los clientes
Abre New Notebook en BigQuery Studio.

Para las partes de visualización y recomendación de este codelab, usaremos un notebook de Google Colab en BigQuery Studio. Esto nos permite visualizar fácilmente los resultados del gráfico.
El notebook de BigQuery Graph se implementa como IPython Magics. Si agregas el comando mágico %%bigquery con la función TO_JSON, puedes visualizar los resultados como se muestra en las siguientes secciones.
Supongamos que Cymbal Pets quiere obtener una visualización de 360 grados de todos los clientes y las compras que realizaron en un período específico.
Ejecuta lo siguiente en una celda nueva:
%%bigquery --graph
GRAPH cymbal_pets_demo.PetsOrderGraph
# finds the customer node and then finds all
# the Orders nodes that are connected to that customer through the
# Placed relationship
MATCH (customer:Customer)-[placed:Placed]->(ordr:Orders)-[has:Has]->(product:Products)
# filters the Orders nodes to only include those where the
# order_date is within the last 3 months.
WHERE ordr.order_date >= date('2024-11-27')
# # This line finds all the Products nodes that are connected to the
# # filtered Orders nodes through the Has relationship.
MATCH p=(customer:Customer)-[placed:Placed]->(ordr:Orders)-[has:Has]->(product:Products)
LIMIT 40
RETURN
TO_JSON(p) as paths
Deberías ver una representación visual del resultado del gráfico.

7. Visualiza el historial de compras de Angelica
Supongamos que Cymbal Pets quiere profundizar en un cliente llamado Angelica Russell. Quieren analizar los productos que Angelica compró en los últimos 3 meses y las tiendas que visitó el cliente.
%%bigquery --graph
GRAPH cymbal_pets_demo.PetsOrderGraph
# finds the customer node with the name "Angelica Russell" and then finds all
# the Orders nodes that are connected to that customer through the
# Placed relationship and all the Products nodes that are connected to the
# filtered Orders nodes through the Has relationship.
MATCH p=(customer:Customer {first_name: 'Angelica', last_name: 'Russell'})-[placed:Placed]->(ordr:Orders)-[has:Has]->(product:Products)
# filters the Orders nodes to only include those where the
# order_date is within the last 3 months.
WHERE ordr.order_date >= date('2024-11-27')
# finds the Stores nodes where Angelica placed order from
MATCH p2=(customer)-[visited:Visited]->(store:Stores)
RETURN
TO_JSON(p) as path, TO_JSON(p2) as path2

8. Recomendación de productos con la búsqueda de vectores
Cymbal Pets quiere recomendar productos a Angelica en función de lo que compró recientemente. Podemos usar la búsqueda de vectores para encontrar productos con incorporaciones similares a sus compras anteriores.
Ejecuta la siguiente secuencia de comandos de SQL en una celda nueva de Colab. Esta secuencia de comandos hace lo siguiente:
- Identifica los productos que Angelica compró recientemente.
- Usa
VECTOR_SEARCHpara encontrar los 4 productos similares principales de la tablaproducts.
Nota: En este paso, se supone que ya ejecutaste AI.GENERATE_EMBEDDINGS para crear una columna de incorporaciones en la tabla de productos.
%%bigquery
DECLARE products_bought_by_angelica ARRAY<INT64>;
-- 1. Get IDs of products bought by Angelica
SET products_bought_by_angelica = (
SELECT ARRAY_AGG(product_id) FROM
GRAPH_TABLE(
cymbal_pets_demo.PetsOrderGraph
MATCH (c:Customer {first_name: 'Angelica', last_name: 'Russell'})-[placed:Placed]->(o:Orders)
WHERE o.order_date >= date('2024-11-27')
MATCH (o)-[has_edge:Has]->(p:Products)
RETURN DISTINCT p.product_id as product_id
));
-- 2. Find similar products using vector search
SELECT
query.product_name as AngelicaBought,
base.product_name as RecommendedProducts,
base.category
FROM
VECTOR_SEARCH(
TABLE cymbal_pets_demo.products,
'embedding',
(SELECT * FROM cymbal_pets_demo.products
WHERE product_id IN UNNEST(products_bought_by_angelica)),
'embedding',
top_k => 4)
WHERE query.product_name <> base.product_name;
Deberías ver una lista de productos recomendados que son semánticamente similares a lo que compró Angelica.

9. Recomendación con relaciones "Comprados juntos"
Otra técnica de recomendación potente es el "filtrado colaborativo", que recomienda productos que otros usuarios compran con frecuencia juntos. Modelamos esto como un borde BoughtTogether en nuestro gráfico.
Para recomendar productos comprados juntos, Cymbal Pets ejecutó una consulta de gráfico analítico sin conexión para encontrar los productos principales que se recomendarán para cada producto que compró Angelica.
%%bigquery
CREATE OR REPLACE TABLE cymbal_pets_demo.co_related_products_for_angelica AS
SELECT
angelica_product_id,
other_product_id,
co_purchase_count
FROM (
SELECT
angelicaProduct.product_id AS angelica_product_id,
otherProduct.product_id AS other_product_id,
count(otherProduct) AS co_purchase_count,
# ensures that the row numbering is done separately for each angelica_product_id
ROW_NUMBER() OVER (PARTITION BY angelicaProduct.product_id ORDER BY count(otherProduct) DESC) AS rn
FROM
GRAPH_TABLE (cymbal_pets_demo.PetsOrderGraph
MATCH (angelica:Customer {first_name: 'Angelica', last_name: 'Russell'})-[:Placed]->(o:Orders)-[:Has]->(angelicaProduct:Products)
WHERE o.order_date >= date('2024-11-27')
WITH angelica, angelicaProduct
MATCH (otherCustomer:Customer)-[:Placed]->(otherOrder:Orders)-[:Has]->(angelicaProduct) # Find orders where Angelica's products were bought
WHERE otherCustomer <> angelica # Exclude Angelica's own orders
WITH angelicaProduct, otherOrder
MATCH (otherOrder)-[:HAS]->(otherProduct:Products) # Find other products in those orders
WHERE angelicaProduct <> otherProduct # Exclude the original product.
RETURN angelicaProduct, otherProduct, otherOrder
)
GROUP BY
angelicaProduct.product_id, otherProduct.product_id
)
WHERE rn <= 3; # only keep top 3 co-related products

Ejecuta esta consulta para recomendar productos que estén conectados directamente a las compras de Angelica a través del borde BoughtTogether:
%%bigquery
SELECT * FROM GRAPH_TABLE(
cymbal_pets_demo.PetsOrderGraph
MATCH (customer:Customer {first_name: 'Angelica', last_name: 'Russell'})-[placed:Placed]->(ordr:Orders)
WHERE ordr.order_date >= date('2024-11-27')
MATCH (ordr)-[has:Has]->(product:Products)
MATCH (product)-[bought_together:BoughtTogether]->(recommended_product:Products)
RETURN
product.product_name AS OriginalProduct,
recommended_product.product_name AS Recommended,
bought_together.co_purchase_count AS Strength
);
Esta consulta atraviesa Cliente -> Pedido -> Producto -> (Comprados juntos) -> Producto recomendado, lo que te muestra recomendaciones basadas en el comportamiento de compra colectivo.

10. Limpia
Para evitar cargos continuos en tu cuenta de Google Cloud, borra los recursos creados durante este codelab.
Borra el conjunto de datos y todas las tablas:
DROP SCHEMA IF EXISTS cymbal_pets_demo CASCADE;
Si creaste un proyecto nuevo para este codelab, también puedes borrarlo:
gcloud projects delete $PROJECT_ID
11. Felicitaciones
¡Felicitaciones! Creaste correctamente una vista de 360 grados del cliente y un motor de recomendaciones con BigQuery Graph.
Qué aprendiste
- Cómo crear un gráfico de propiedades en BigQuery
- Cómo cargar datos en nodos y bordes de gráficos
- Cómo consultar patrones de gráficos con
GRAPH_TABLEyMATCH - Cómo combinar consultas de gráficos con la búsqueda de vectores para obtener recomendaciones híbridas
Próximos pasos
- Explora la documentación de BigQuery Graph.
- Obtén más información sobre la búsqueda de vectores en BigQuery.