1. مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام BigQuery Graph لإنشاء عرض شامل للعملاء ومحرّك اقتراحات لشركة Cymbal Pets، وهي شركة بيع بالتجزئة وهمية. ستستفيد من قوة SQL لإنشاء بيانات بيانية والاستعلام عنها وتحليلها مباشرةً في BigQuery، وستجمعها مع البحث المتّجه للحصول على اقتراحات متقدّمة بشأن المنتجات.
تتيح لك ميزة "الرسومات البيانية في BigQuery" تصميم العلاقات بين عناصر بياناتك (مثل العملاء والمنتجات والطلبات) على شكل رسم بياني، ما يسهّل الإجابة عن الأسئلة المعقّدة حول سلوك العملاء والمنتجات المفضّلة لديهم.

الإجراءات التي ستنفذّها
- إنشاء مجموعة بيانات ومخطط في BigQuery للرسم البياني Cymbal Pets
- تحميل بيانات نموذجية (العملاء والمنتجات والطلبات والمتاجر) من Cloud Storage
- إنشاء "رسم بياني للمواقع" في BigQuery يربط بين هذه الكيانات
- عرض سجلّات شراء العملاء بشكل مرئي باستخدام طلبات بحث بيانية
- إنشاء نظام لاقتراح المنتجات باستخدام البحث المتّجه
- تحسين الاقتراحات باستخدام علاقات الرسم البياني "تم شراؤه معًا"
المتطلبات
- متصفّح ويب، مثل Chrome
- مشروع Google Cloud تم تفعيل الفوترة فيه
هذا الدرس العملي مخصّص للمطوّرين من جميع المستويات، بما في ذلك المبتدئين.
2. قبل البدء
إنشاء مشروع على Google Cloud
- في Google Cloud Console، اختَر مشروعًا على Google Cloud أو أنشِئ مشروعًا.
- تأكَّد من تفعيل الفوترة لمشروعك على السحابة الإلكترونية.
بدء Cloud Shell
- انقر على تفعيل Cloud Shell في أعلى "وحدة تحكّم Google Cloud".
- إثبات صحة المصادقة:
gcloud auth list
- أكِّد مشروعك:
gcloud config get project
- اضبطه إذا لزم الأمر:
export PROJECT_ID=<YOUR_PROJECT_ID>
gcloud config set project $PROJECT_ID
تفعيل واجهات برمجة التطبيقات
نفِّذ الأمر التالي لتفعيل BigQuery API المطلوبة:
gcloud services enable bigquery.googleapis.com
3- تحديد المخطط
أولاً، عليك إنشاء مجموعة بيانات لتخزين الجداول ذات الصلة بالرسم البياني وتحديد المخطط للعُقد والحواف.
- في هذا الدرس التطبيقي، سننفّذ أوامر SQL. يمكنك تنفيذ هذه الأوامر في BigQuery Studio > محرِّر SQL، أو استخدام الأمر
bq queryفي Cloud Shell.
سنفترض أنّك تستخدم أداة تعديل SQL في BigQuery للحصول على تجربة أفضل مع عبارات الإنشاء المتعددة الأسطر. - أنشئ مجموعة بيانات
cymbal_pets_demo:
CREATE SCHEMA IF NOT EXISTS cymbal_pets_demo;
- أنشئ الجداول الخاصة بـ
order_itemsوproductsوordersوstoresوcustomersوco_related_products_for_angelica. ستكون هذه الجداول بمثابة بيانات المصدر للرسم البياني.
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
);
لقد حدّدت الآن بنية بيانات الرسم البياني.
4. تحميل البيانات
الآن، املأ الجداول ببيانات نموذجية من Cloud Storage.
نفِّذ عبارات LOAD DATA التالية في محرّر 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']
);
من المفترض أن يظهر لك تأكيد بأنّه تم تحميل الصفوف في كل جدول.
5- إنشاء الرسم البياني للمواقع
بعد تحميل البيانات، يمكنك الآن تحديد الرسم البياني للسمات. يحدّد هذا الخيار لجداول BigQuery الجداول التي تمثّل العُقد (مثل العملاء والمنتجات) والجداول التي تمثّل الحواف (مثل العلاقات "زار" و"وضع" و"يملك").

نفِّذ جملة 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
);
يؤدي ذلك إلى إنشاء الرسم البياني PetsOrderGraph الذي يتيح لنا تنفيذ عمليات اجتياز الرسم البياني باستخدام عامل التشغيل GRAPH_TABLE.
6. تصوُّر سجلّ الشراء لجميع العملاء
افتح دفتر ملاحظات جديد في BigQuery Studio.

بالنسبة إلى أجزاء التمثيل البصري والاقتراحات في هذا الدرس التطبيقي حول الترميز، سنستخدم دفتر ملاحظات Google Colab في BigQuery Studio. يتيح لنا ذلك عرض نتائج الرسم البياني بسهولة.
يتم تنفيذ BigQuery Graph Notebook كـ IPython Magics. من خلال إضافة الأمر السحري %%bigquery مع الدالة TO_JSON، يمكنك عرض النتائج كما هو موضّح في الأقسام التالية.
لنفترض أنّ شركة Cymbal Pets تريد الحصول على عرض مرئي بزاوية 360 درجة لجميع العملاء والمشتريات التي أجروها خلال فترة زمنية محدّدة.
نفِّذ ما يلي في خلية جديدة:
%%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
من المفترض أن يظهر لك تمثيل مرئي لنتيجة الرسم البياني.

7. تصوُّر سجلّ شراء "أنجليكا"
لنفترض أنّ شركة Cymbal Pets تريد التعرّف بالتفصيل على إحدى العملاء، وهي "أنجليكا راسل". يريدون تحليل المنتجات التي اشترتها "أنجليكا" خلال آخر 3 أشهر والمتاجر التي زارتها.
%%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. اقتراح المنتجات باستخدام البحث المتّجهي
تريد شركة Cymbal Pets أن تقترح منتجات على "أنجليكا" استنادًا إلى ما اشترته مؤخرًا. يمكننا استخدام البحث المتّجه للعثور على منتجات تتضمّن عمليات تضمين مشابهة لعمليات الشراء السابقة.
نفِّذ نص SQL البرمجي التالي في خلية Colab جديدة. يعمل هذا النص البرمجي على:
- تحدّد هذه السمة المنتجات التي اشترتها "أنجليكا" مؤخرًا.
- يستخدم
VECTOR_SEARCHللعثور على أفضل 4 منتجات مشابهة من الجدولproducts.
ملاحظة: تفترض هذه الخطوة أنّك سبق أن نفّذت AI.GENERATE_EMBEDDINGS لإنشاء عمود تضمين في جدول المنتجات.
%%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;
ستظهر لك قائمة بالمنتجات المقترَحة التي تتشابه دلاليًا مع ما اشترته أنجيليكا.

9- اقتراح باستخدام علاقات "تم شراؤها معًا"
هناك أسلوب آخر قوي للتوصية وهو "التصفية التعاونية"، أي اقتراح منتجات يشتريها المستخدمون الآخرون بشكل متكرر. وقد صمّمنا ذلك على شكل حافة BoughtTogether في الرسم البياني.
لاقتراح المنتجات التي يتم شراؤها معًا، نفّذت شركة Cymbal Pets طلب بحث تحليليًا في الرسم البياني بلا إنترنت للعثور على أفضل المنتجات التي يمكن اقتراحها لكل منتج اشترته أنجليكا.
%%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

نفِّذ طلب البحث هذا لاقتراح منتجات مرتبطة مباشرةً بعمليات شراء Angelica من خلال حافة 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
);
يتنقّل طلب البحث هذا من "العميل" -> "الطلب" -> "المنتج" -> (BoughtTogether) -> "المنتج المقترَح"، ويعرض لك اقتراحات استنادًا إلى سلوك الشراء الجماعي.

10. تَنظيم
لتجنُّب الرسوم المستمرة على حسابك على Google Cloud، احذف الموارد التي تم إنشاؤها أثناء هذا الدرس العملي.
حذف مجموعة البيانات وجميع الجداول:
DROP SCHEMA IF EXISTS cymbal_pets_demo CASCADE;
إذا أنشأت مشروعًا جديدًا لهذا الدرس التطبيقي حول الترميز، يمكنك أيضًا حذف المشروع:
gcloud projects delete $PROJECT_ID
11. تهانينا
تهانينا! لقد أنشأت بنجاح "نظرة شاملة للعميل" ومحرّك اقتراحات باستخدام BigQuery Graph.
ما تعلّمته
- كيفية إنشاء رسم بياني للعلاقات في BigQuery
- كيفية تحميل البيانات في عُقد الرسم البياني وحوافه
- كيفية طلب البحث عن أنماط الرسومات البيانية باستخدام
GRAPH_TABLEوMATCH - كيفية الجمع بين طلبات البحث المستندة إلى الرسوم البيانية والبحث المتّجه للحصول على اقتراحات مختلطة