1. Giới thiệu
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng BigQuery Graph để xây dựng chế độ xem 360 độ về khách hàng và một công cụ đề xuất cho Cymbal Pets, một công ty bán lẻ hư cấu. Bạn sẽ tận dụng sức mạnh của SQL để tạo, truy vấn và phân tích dữ liệu biểu đồ ngay trong BigQuery, kết hợp với tính năng tìm kiếm vectơ để đưa ra các đề xuất nâng cao về sản phẩm.
BigQuery Graph cho phép bạn mô hình hoá mối quan hệ giữa các thực thể dữ liệu (chẳng hạn như khách hàng, sản phẩm và đơn đặt hàng) dưới dạng biểu đồ, giúp bạn dễ dàng trả lời các câu hỏi phức tạp về hành vi của khách hàng và mối quan hệ thân thiết với sản phẩm.

Bạn sẽ thực hiện
- Tạo tập dữ liệu và giản đồ BigQuery cho biểu đồ Cymbal Pets
- Tải dữ liệu mẫu (Khách hàng, Sản phẩm, Đơn đặt hàng, Cửa hàng) từ Cloud Storage
- Tạo một biểu đồ thuộc tính trong BigQuery để kết nối các thực thể này
- Trực quan hoá nhật ký mua hàng của khách hàng bằng cách sử dụng truy vấn đồ thị
- Xây dựng hệ thống đề xuất sản phẩm bằng tính năng tìm kiếm vectơ
- Nâng cao đề xuất bằng mối quan hệ trong biểu đồ "Mua cùng nhau"
Bạn cần có
- Một trình duyệt web như Chrome
- Một dự án trên Google Cloud đã bật tính năng thanh toán
Lớp học lập trình này dành cho nhà phát triển ở mọi cấp độ, kể cả người mới bắt đầu.
2. Trước khi bắt đầu
Tạo một dự án trên Google Cloud
- Trong Google Cloud Console, hãy chọn hoặc tạo một dự án trên Google Cloud.
- Đảm bảo rằng bạn đã bật tính năng thanh toán cho dự án trên Cloud.
Khởi động Cloud Shell
- Nhấp vào Kích hoạt Cloud Shell ở đầu bảng điều khiển Cloud.
- Xác minh hoạt động xác thực:
gcloud auth list
- Xác nhận dự án của bạn:
gcloud config get project
- Đặt nếu cần:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
Bật API
Chạy lệnh này để bật BigQuery API bắt buộc:
gcloud services enable bigquery.googleapis.com
3. Xác định giản đồ
Trước tiên, bạn cần tạo một tập dữ liệu để lưu trữ các bảng liên quan đến biểu đồ và xác định giản đồ cho các nút và cạnh.
- Trong lớp học lập trình này, chúng ta sẽ thực thi các lệnh SQL. Bạn có thể chạy các lệnh này trong BigQuery Studio > Trình chỉnh sửa SQL hoặc sử dụng lệnh
bq querytrong Cloud Shell.
Chúng tôi giả định rằng bạn đang sử dụng Trình chỉnh sửa SQL của BigQuery để có trải nghiệm tốt hơn với các câu lệnh tạo nhiều dòng. - Tạo tập dữ liệu
cymbal_pets_demo:
CREATE SCHEMA IF NOT EXISTS cymbal_pets_demo;
- Tạo các bảng cho
order_items,products,orders,stores,customersvàco_related_products_for_angelica. Các bảng này sẽ đóng vai trò là dữ liệu nguồn cho biểu đồ của chúng ta.
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
);
Giờ đây, bạn đã xác định cấu trúc cho dữ liệu biểu đồ của mình.
4. Tải dữ liệu
Bây giờ, hãy điền dữ liệu mẫu vào các bảng từ Cloud Storage.
Chạy các câu lệnh LOAD DATA sau trong trình chỉnh sửa SQL của 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']
);
Bạn sẽ thấy thông báo xác nhận rằng các hàng đã được tải vào từng bảng.
5. Tạo biểu đồ thuộc tính
Sau khi tải dữ liệu, giờ đây, bạn có thể xác định biểu đồ thuộc tính. Thông tin này cho BigQuery biết bảng nào đại diện cho nút (các thực thể như Khách hàng, Sản phẩm) và bảng nào đại diện cho cạnh (các mối quan hệ như "Đã truy cập", "Đã đặt", "Có").

Chạy câu lệnh DDL sau:
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
);
Thao tác này sẽ tạo ra biểu đồ PetsOrderGraph, cho phép chúng ta thực hiện các thao tác duyệt qua biểu đồ bằng cách sử dụng toán tử GRAPH_TABLE.
6. Trực quan hoá Nhật ký mua hàng của tất cả khách hàng
Mở Sổ tay mới trong BigQuery Studio.

Đối với các phần trực quan hoá và đề xuất của lớp học lập trình này, chúng ta sẽ sử dụng một sổ tay Google Colab trong BigQuery Studio. Nhờ đó, chúng ta có thể dễ dàng hình dung kết quả của biểu đồ.
BigQuery Graph Notebook được triển khai dưới dạng IPython Magics. Bằng cách thêm lệnh %%bigquery (lệnh đặc biệt) bằng hàm TO_JSON, bạn có thể trực quan hoá kết quả như minh hoạ trong các phần sau.
Giả sử Cymbal Pets muốn có hình ảnh trực quan 360 độ về tất cả khách hàng và giao dịch mua mà họ đã thực hiện trong một khoảng thời gian cụ thể.
Chạy lệnh sau trong một ô mới:
%%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
Bạn sẽ thấy một bản trình bày trực quan về kết quả biểu đồ.

7. Hình dung nhật ký mua hàng của Angelica
Giả sử Cymbal Pets muốn tìm hiểu sâu về một khách hàng tên là Angelica Russell. Họ muốn phân tích những sản phẩm mà Angelica đã mua trong vòng 3 tháng qua và những cửa hàng mà khách hàng này đã ghé thăm.
%%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. Đề xuất về sản phẩm bằng tính năng tìm kiếm vectơ
Cymbal Pets muốn đề xuất sản phẩm cho Angelica dựa trên những gì cô ấy đã mua gần đây. Chúng ta có thể sử dụng tính năng tìm kiếm vectơ để tìm những sản phẩm có thông tin nhúng tương tự với các sản phẩm mà cô ấy đã mua trước đây.
Chạy tập lệnh SQL sau đây trong một ô Colab mới. Tập lệnh này:
- Xác định những sản phẩm mà Angelica đã mua gần đây.
- Sử dụng
VECTOR_SEARCHđể tìm 4 sản phẩm tương tự hàng đầu trong bảngproducts.
Lưu ý: Bước này giả định rằng bạn đã chạy AI.GENERATE_EMBEDDINGS để tạo một cột vectơ nhúng trong bảng sản phẩm.
%%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;
Bạn sẽ thấy một danh sách các sản phẩm được đề xuất có ý nghĩa tương tự như sản phẩm mà Angelica đã mua.

9. Đề xuất sử dụng mối quan hệ "Mua cùng nhau"
Một kỹ thuật đề xuất hiệu quả khác là "Lọc cộng tác" – đề xuất những sản phẩm mà những người dùng khác thường mua cùng nhau. Chúng tôi đã mô hình hoá điều này dưới dạng một cạnh BoughtTogether trong biểu đồ của mình.
Để đề xuất các sản phẩm thường được mua cùng nhau, Cymbal Pets đã thực hiện một truy vấn đồ thị phân tích ngoại tuyến để tìm ra những sản phẩm hàng đầu cần đề xuất cho từng sản phẩm mà Angelica đã mua.
%%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

Chạy truy vấn này để đề xuất các sản phẩm được kết nối trực tiếp với giao dịch mua của Angelica thông qua cạnh 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
);
Truy vấn này đi từ Khách hàng -> Đơn đặt hàng -> Sản phẩm -> (Mua cùng nhau) -> Sản phẩm được đề xuất, cho bạn thấy các đề xuất dựa trên hành vi mua hàng tập thể.

10. Dọn dẹp
Để tránh các khoản phí phát sinh cho tài khoản Google Cloud của bạn, hãy xoá các tài nguyên đã tạo trong lớp học lập trình này.
Xoá tập dữ liệu và tất cả các bảng:
DROP SCHEMA IF EXISTS cymbal_pets_demo CASCADE;
Nếu đã tạo một dự án mới cho lớp học lập trình này, bạn cũng có thể xoá dự án đó:
gcloud projects delete $PROJECT_ID
11. Xin chúc mừng
Xin chúc mừng! Bạn đã tạo thành công chế độ xem 360 độ về khách hàng và công cụ đề xuất bằng BigQuery Graph.
Kiến thức bạn học được
- Cách tạo biểu đồ thuộc tính trong BigQuery.
- Cách tải dữ liệu vào các nút và cạnh của biểu đồ.
- Cách truy vấn các mẫu đồ thị bằng cách sử dụng
GRAPH_TABLEvàMATCH. - Cách kết hợp các truy vấn đồ thị với tính năng tìm kiếm vectơ để đưa ra đề xuất kết hợp.
Các bước tiếp theo
- Khám phá tài liệu về BigQuery Graph.
- Tìm hiểu thêm về Tính năng tìm kiếm vectơ trong BigQuery.