1. Introduction
Dans cet atelier de programmation, vous allez apprendre à utiliser BigQuery Graph pour créer une vue à 360° des clients et un moteur de recommandations pour Cymbal Pets, une entreprise de vente au détail fictive. Vous exploiterez la puissance de SQL pour créer, interroger et analyser des données graphiques directement dans BigQuery, en les combinant à la recherche vectorielle pour obtenir des recommandations de produits avancées.
BigQuery Graph vous permet de modéliser les relations entre vos entités de données (comme les clients, les produits et les commandes) sous forme de graphique. Vous pouvez ainsi répondre facilement à des questions complexes sur le comportement des clients et les affinités des produits.

Objectifs de l'atelier
- Créer un ensemble de données et un schéma BigQuery pour le graphique Cymbal Pets
- Charger des exemples de données (clients, produits, commandes, magasins) depuis Cloud Storage
- Créez un graphique de propriétés dans BigQuery en associant ces entités.
- Visualiser l'historique des achats des clients à l'aide de requêtes graphiques
- Créer un système de recommandation de produits à l'aide de la recherche vectorielle
- Améliorer les recommandations à l'aide des relations du graphique "Acheté ensemble"
Prérequis
- Un navigateur Web (par exemple, Chrome)
- Un projet Google Cloud avec facturation activée
Cet atelier de programmation s'adresse aux développeurs de tous niveaux, y compris aux débutants.
2. Avant de commencer
Créer un projet Google Cloud
- Dans la console Google Cloud, sélectionnez ou créez un projet Google Cloud.
- Assurez-vous que la facturation est activée pour votre projet Cloud.
Démarrer Cloud Shell
- Cliquez sur Activer Cloud Shell en haut de la console Google Cloud.
- Vérifiez l'authentification :
gcloud auth list
- Confirmez votre projet :
gcloud config get project
- Définissez-le si nécessaire :
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
Activer les API
Exécutez la commande suivante pour activer l'API BigQuery requise :
gcloud services enable bigquery.googleapis.com
3. Définir le schéma
Vous devez d'abord créer un ensemble de données pour stocker vos tables liées aux graphiques et définir le schéma de vos nœuds et de vos arêtes.
- Pour cet atelier de programmation, nous allons exécuter des commandes SQL. Vous pouvez exécuter ces commandes dans BigQuery Studio > Éditeur SQL ou utiliser la commande
bq querydans Cloud Shell.
Nous partons du principe que vous utilisez l'éditeur SQL BigQuery pour une meilleure expérience avec les instructions CREATE multilignes. - Créez l'ensemble de données
cymbal_pets_demo:
CREATE SCHEMA IF NOT EXISTS cymbal_pets_demo;
- Créez les tables pour
order_items,products,orders,stores,customersetco_related_products_for_angelica. Ces tables serviront de données sources pour notre graphique.
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
);
Vous avez maintenant défini la structure de vos données de graphique.
4. Charger les données
Maintenant, insérez des exemples de données provenant de Cloud Storage dans les tables.
Exécutez les instructions LOAD DATA suivantes dans l'éditeur SQL 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']
);
Un message de confirmation doit vous indiquer que des lignes ont été chargées dans chaque table.
5. Créer le graphique de propriété
Une fois les données chargées, vous pouvez définir le graphique de propriétés. Cela indique à BigQuery quelles tables représentent des nœuds (entités telles que "Clients" ou "Produits") et quelles tables représentent des arêtes (relations telles que "A visité", "A passé" ou "A").

Exécutez l'instruction LDD suivante :
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
);
Cela crée le graphique PetsOrderGraph, qui nous permet d'effectuer des traversées de graphes à l'aide de l'opérateur GRAPH_TABLE.
6. Visualiser l'historique des achats de tous les clients
Ouvrez Nouveau notebook dans BigQuery Studio.

Pour les parties visualisation et recommandation de cet atelier de programmation, nous utiliserons un notebook Google Colab dans BigQuery Studio. Cela nous permet de visualiser facilement les résultats du graphique.
Collez le code suivant dans une cellule de code :
!pip install bigquery-magics==0.12.1
BigQuery Graph Notebook est implémenté en tant que commande magique IPython. En ajoutant la commande magique %%bigquery avec la fonction TO_JSON, vous pouvez visualiser les résultats comme indiqué dans les sections suivantes.
Imaginons que Cymbal Pets souhaite obtenir une visualisation à 360 degrés de tous les clients et des achats qu'ils ont effectués au cours d'une période spécifique.
Exécutez la commande suivante dans une nouvelle cellule :
%%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
Vous devriez voir une représentation visuelle du résultat du graphique.

7. Visualiser l'historique des achats d'Angelica
Imaginons que Cymbal Pets souhaite en savoir plus sur une cliente nommée Angelica Russell. Elle souhaite analyser les produits qu'Angelica a achetés au cours des trois derniers mois, ainsi que les magasins qu'elle a visités.
%%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. Recommandation de produits à l'aide de la recherche vectorielle
Cymbal Pets souhaite recommander des produits à Angelica en fonction de ses achats récents. Nous pouvons utiliser la recherche vectorielle pour trouver des produits dont les embeddings sont similaires à ceux de ses achats précédents.
Exécutez le script SQL suivant dans une nouvelle cellule Colab. Ce script :
- Identifie les produits qu'Angelica a achetés récemment.
- Utilise
VECTOR_SEARCHpour trouver les quatre produits similaires les plus pertinents dans le tableauproducts.
Remarque : Cette étape suppose que vous avez déjà exécuté AI.GENERATE_EMBEDDINGS pour créer une colonne d'embeddings dans la table "products".
%%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;
Une liste de produits recommandés sémantiquement semblables à ceux qu'Angelica a achetés devrait s'afficher.

9. Recommandation utilisant les relations "Acheté ensemble"
Le filtrage collaboratif est une autre technique de recommandation efficace. Il consiste à recommander des produits fréquemment achetés ensemble par d'autres utilisateurs. Nous avons modélisé cela comme une arête BoughtTogether dans notre graphique.
Pour recommander des produits achetés ensemble, Cymbal Pets a exécuté une requête analytique hors connexion sur un graphique afin d'identifier les meilleurs produits à recommander pour chaque produit acheté par 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

Exécutez cette requête pour recommander des produits directement liés aux achats d'Angelica via l'arête 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
);
Cette requête traverse les données de client à produit recommandé en passant par commande et produit acheté ensemble. Elle vous montre des recommandations basées sur le comportement d'achat collectif.

10. Effectuer un nettoyage
Pour éviter que les ressources créées lors de cet atelier de programmation ne soient facturées en permanence sur votre compte Google Cloud, supprimez-les.
Supprimez l'ensemble de données et toutes les tables :
DROP SCHEMA IF EXISTS cymbal_pets_demo CASCADE;
Si vous avez créé un projet pour cet atelier de programmation, vous pouvez également le supprimer :
gcloud projects delete $PROJECT_ID
11. Félicitations
Félicitations ! Vous avez créé une vue client à 360° et un moteur de recommandation à l'aide de BigQuery Graph.
Connaissances acquises
- Comment créer un graphique de propriétés dans BigQuery.
- Comment charger des données dans les nœuds et les arêtes du graphique
- Comment interroger des modèles de graphiques à l'aide de
GRAPH_TABLEetMATCH. - Découvrez comment combiner des requêtes graphiques avec la recherche vectorielle pour obtenir des recommandations hybrides.
Étapes suivantes
- Consultez la documentation BigQuery Graph.
- En savoir plus sur la recherche vectorielle dans BigQuery