1. บทนำ
ใน Codelab นี้ คุณจะได้เรียนรู้วิธีใช้ประโยชน์จาก BigQuery Graph เพื่อแก้ปัญหาที่ซับซ้อนในซัพพลายเชนและโลจิสติกส์
คุณจะสร้างแบบจำลองเครือข่ายซัพพลายเชนของร้านอาหารโดยมุ่งเน้นที่ความปลอดภัยของอาหารและการควบคุมคุณภาพ เมื่อเกิดปัญหาด้านความปลอดภัยของอาหาร เช่น ส่วนผสมจากซัพพลายเออร์ปนเปื้อน เวลาเป็นสิ่งสำคัญ การระบุ "ขอบเขตความเสียหาย" และการเรียกคืนอย่างรวดเร็วจะช่วยประหยัดค่าใช้จ่ายและปกป้องลูกค้าได้

โมเดลเชิงสัมพันธ์แบบเดิมต้องใช้การดำเนินการ JOIN ที่ซับซ้อนและมีหลายขั้นตอนเพื่อติดตามรายการผ่านหลายขั้นตอน (ซัพพลายเออร์ -> DC -> Commissary -> Store -> Finished Item) เมื่อใช้กราฟ BigQuery เราจะจำลองการเชื่อมต่อเหล่านี้โดยตรง ซึ่งช่วยให้ค้นหาได้อย่างรวดเร็วและง่ายดายโดยใช้มาตรฐาน ISO GQL (Graph Query Language)
สิ่งที่คุณจะได้เรียนรู้
- วิธีกำหนดโมเดลกราฟบนตาราง BigQuery ที่มีอยู่
- วิธีสร้างกราฟพร็อพเพอร์ตี้ภายใน BigQuery
- วิธีเรียกใช้การค้นหาแบบทราเวอร์ซเพื่อติดตามผลกระทบต้นทางและปลายทาง
สิ่งที่คุณต้องมี
- โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
- Google Cloud Shell
การคาดการณ์ค่าใช้จ่าย
คาดว่า Lab นี้จะมีค่าใช้จ่ายน้อยกว่า $5 USD ในค่าธรรมเนียมการวิเคราะห์ BigQuery ซึ่งอยู่ในโควต้ารุ่นฟรีสำหรับผู้ใช้ใหม่
2. การตั้งค่าและข้อกำหนด
เปิด Cloud Shell
คุณจะทำงานส่วนใหญ่ใน Cloud Shell ซึ่งเป็นสภาพแวดล้อมที่โหลดไว้พร้อมทุกอย่างที่คุณต้องใช้ Google Cloud
- ไปที่ คอนโซล Google Cloud
- คลิกไอคอนเปิดใช้งาน Cloud Shell ในแถบเครื่องมือด้านขวาบน
- คลิกต่อไปหากมีข้อความแจ้ง
ตั้งค่าตัวแปรสภาพแวดล้อม
ใน Cloud Shell ให้ตั้งค่ารหัสโปรเจ็กต์เพื่อลดความซับซ้อนของคำสั่งในอนาคต
export PROJECT_ID=$(gcloud config get-value project)
เปิดใช้ API ของ BigQuery
ตรวจสอบว่าได้เปิดใช้ BigQuery API แล้ว โดยปกติแล้วจะเปิดใช้โดยค่าเริ่มต้น แต่เพื่อความปลอดภัย คุณควรตรวจสอบอีกครั้ง
gcloud services enable bigquery.googleapis.com
3. การสร้างสคีมาและตาราง
คุณจะสร้างชุดข้อมูลและตารางที่แสดงถึงคอมโพเนนต์ของซัพพลายเชน ดังนี้
item: คำจำกัดความของสินค้าทั่วไป (เช่น มะเขือเทศ ไก่)location: สถานที่ (ซัพพลายเออร์ ศูนย์กระจายสินค้า คาเฟ่)itemlocation: ตารางทางแยกที่แสดงตำแหน่งสินค้าคงคลังbom: รายการวัสดุ (กำหนดความสัมพันธ์ด้านน้ำหนัก เช่น รายการ ก. อยู่ในรายการ ข.)makes: แมปitemlocationกับitemstored_at: แผนที่itemlocationถึงlocation
สร้างชุดข้อมูล
คุณเรียกใช้คำสั่ง SQL ในแล็บนี้ได้โดยใช้ Cloud Shell หรือคอนโซล BigQuery
วิธีใช้คอนโซล BigQuery
- เปิดคอนโซล BigQuery ในแท็บใหม่
- วางข้อมูลโค้ด SQL แต่ละรายการจากแล็บนี้ลงในเครื่องมือแก้ไข จากนั้นคลิกปุ่มเรียกใช้เพื่อดำเนินการ

เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell หรือใช้คอนโซล BigQuery เพื่อสร้างสคีมา คุณจะใช้ตัวแปรโหนดใน SQL

หมายเหตุ: (1) หากต้องการเรียกใช้คำสั่งนี้ใน Google Colab คุณสามารถใช้คำสั่ง Magic ของ BigQuery ได้ด้วย: %%bigquery ข้อมูลโค้ดต่อไปนี้จะสร้างสคีมาร้านอาหารภายในโปรเจ็กต์เพื่อจัดเก็บข้อมูลกราฟ (2) คุณจะต้องใช้ %%bigquery –project <PROJECT_ID> หากเรียกใช้จาก Google Colab ตรวจสอบว่าฟิลด์ PROJECT_ID แมปกับโปรเจ็กต์ที่เหมาะสมที่คุณต้องการใช้: PROJECT_ID = "argolis-project-340214" # @param {"type":"string"} (3) หากใช้ Colab คุณจะต้องติดตั้งไลบรารีบางอย่างตามข้อกำหนด หากจะใช้การแสดงภาพกราฟ ให้ตรวจสอบว่าคุณได้ติดตั้งไลบรารีโดยใช้ pip แล้ว: spanner-graph-notebook==1.1.5

%%bigquery --project=$PROJECT_ID
CREATE SCHEMA IF NOT EXISTS restaurant ;
สร้างตาราง
เรียกใช้โค้ด SQL ต่อไปนี้เพื่อสร้างตาราง
%%bigquery --project=$PROJECT_ID
-- 1. Item Table
DROP TABLE IF EXISTS `restaurant.item`;
CREATE TABLE `restaurant.item` (
itemKey STRING,
itemName STRING,
itemCategory STRING,
shelfLifeDays INT64,
PRIMARY KEY (itemKey) NOT ENFORCED
);
-- 2. Location Table
DROP TABLE IF EXISTS `restaurant.location`;
CREATE TABLE `restaurant.location` (
locationKey STRING,
locationType STRING,
locationCity STRING,
locationState STRING,
dunsNumber INT64,
PRIMARY KEY (locationKey) NOT ENFORCED
);
-- 3. ItemLocation Table
DROP TABLE IF EXISTS `restaurant.itemlocation`;
CREATE TABLE `restaurant.itemlocation` (
itemLocationKey STRING,
itemKey STRING,
locationKey STRING,
variants INT64,
PRIMARY KEY (itemLocationKey) NOT ENFORCED,
-- Foreign Key Definitions
FOREIGN KEY (itemKey) REFERENCES `restaurant.item`(itemKey) NOT ENFORCED,
FOREIGN KEY (locationKey) REFERENCES `restaurant.location`(locationKey) NOT ENFORCED
);
-- 4. BOM Table
DROP TABLE IF EXISTS `restaurant.bom`;
CREATE TABLE `restaurant.bom` (
bomKey INT64,
parentItemLocation STRING,
childItemLocation STRING,
childQuantity FLOAT64,
PRIMARY KEY (bomKey) NOT ENFORCED
);
-- 5. Makes Table
DROP TABLE IF EXISTS `restaurant.makes`;
CREATE TABLE `restaurant.makes` (
itemLocationKey STRING,
itemKey STRING,
locationKey STRING,
variants INT64,
PRIMARY KEY (itemLocationKey) NOT ENFORCED
);
DROP TABLE IF EXISTS `restaurant.stored_at`;
CREATE TABLE `restaurant.stored_at` (
itemLocationKey STRING,
itemKey STRING,
locationKey STRING,
variants INT64,
PRIMARY KEY (itemLocationKey) NOT ENFORCED
);
4. กำลังโหลดข้อมูลตัวอย่าง
คุณจะสร้างข้อมูลตัวอย่างลงในตารางโดยใช้คำสั่ง SQL LOAD DATA เพื่อให้แล็บนี้เป็นแบบสแตนด์อโลนอย่างสมบูรณ์ ซึ่งแสดงถึงเครือข่ายที่เริ่มต้นจากซัพพลายเออร์ ผ่านศูนย์กระจายสินค้า (DC) และครัวกลาง ไปจนถึงคาเฟ่ค้าปลีก
เรียกใช้การค้นหา SQL ต่อไปนี้เพื่อโหลดข้อมูล

หมายเหตุ: คุณละเว้น %%bigquery ได้หากเรียกใช้ใน BigQuery Studio โดยตรง
%%bigquery --project=$PROJECT_ID
-- Load Item
LOAD DATA OVERWRITE `restaurant.item`
FROM FILES (format = 'CSV', uris = ['gs://supply_chain_demo/item2.csv'], skip_leading_rows = 1);
-- Load Location
LOAD DATA OVERWRITE `restaurant.location`
FROM FILES (format = 'CSV', uris = ['gs://supply_chain_demo/location.csv'], skip_leading_rows = 1);
-- Load ItemLocation
LOAD DATA OVERWRITE `restaurant.itemlocation`
FROM FILES (format = 'CSV', uris = ['gs://supply_chain_demo/itemlocation.csv'], skip_leading_rows = 1);
-- Load BOM
LOAD DATA OVERWRITE `restaurant.bom`
FROM FILES (format = 'CSV', uris = ['gs://supply_chain_demo/bom2.csv'], skip_leading_rows = 1);
-- Load Makes
LOAD DATA OVERWRITE `restaurant.makes`
FROM FILES (format = 'CSV', uris = ['gs://supply_chain_demo/makes.csv'], skip_leading_rows = 1);
-- Load StoredAt
LOAD DATA OVERWRITE `restaurant.stored_at`
FROM FILES (format = 'CSV', uris = ['gs://supply_chain_demo/itemlocation.csv'], skip_leading_rows = 1);
5. การเพิ่มข้อจำกัดและการกำหนดกราฟ
ก่อนสร้างกราฟ คุณต้องประกาศความสัมพันธ์เชิงความหมายโดยใช้ข้อจํากัดของคีย์หลักและคีย์นอกของ SQL มาตรฐาน ซึ่งจะช่วยให้ BigQuery เข้าใจตัวระบุโหนดและเชื่อมต่อตาราง Edge กับตารางโหนด
สร้างกราฟพร็อพเพอร์ตี้
ตอนนี้คุณรวมตารางเหล่านี้ไว้ในโครงสร้างกราฟที่สอดคล้องกันเดียวที่เรียกว่า restaurant.bombod
คุณกำหนด
- โหนด:
item,location,itemlocation - ขอบ:
makes,stored_atและconsists_of(BOM)
%%bigquery --project=$PROJECT_ID
CREATE OR REPLACE PROPERTY GRAPH `restaurant.bombod`
NODE TABLES (
`restaurant.item` KEY (itemKey) LABEL item PROPERTIES ALL COLUMNS,
`restaurant.location` KEY (locationKey) LABEL location PROPERTIES ALL COLUMNS,
`restaurant.itemlocation` KEY (itemLocationKey) LABEL itemlocation PROPERTIES ALL COLUMNS
)
EDGE TABLES (
`restaurant.makes`
KEY (itemLocationKey)
SOURCE KEY (itemLocationKey) REFERENCES `restaurant.itemlocation`(itemLocationKey)
DESTINATION KEY (itemKey) REFERENCES `restaurant.item`(itemKey)
LABEL makes PROPERTIES ALL COLUMNS,
`restaurant.bom`
KEY (bomKey)
SOURCE KEY (childItemLocation) REFERENCES `restaurant.itemlocation`(itemLocationKey)
DESTINATION KEY (parentItemLocation) REFERENCES `restaurant.itemlocation`(itemLocationKey)
LABEL consists_of PROPERTIES ALL COLUMNS,
`restaurant.stored_at`
KEY (itemLocationKey)
SOURCE KEY (itemLocationKey) REFERENCES `restaurant.itemlocation`(itemLocationKey)
DESTINATION KEY (locationKey) REFERENCES `restaurant.location`(locationKey)
LABEL stored_at PROPERTIES ALL COLUMNS
);
6. การแสดงภาพซัพพลายเชน
คุณเรียกใช้การค้นหาการข้ามจากบนลงล่างเพื่อดูเครือข่ายซัพพลายเชนทั้งหมดได้ ใน Notebook หรือ UI มาตรฐานที่รองรับ (เช่น %%bigquery --graph) คำสั่งนี้จะแสดงแผนที่ภาพ
ใช้การค้นหากราฟแบบสัมบูรณ์เพื่อตั้งค่าโหนดและขอบ
หมายเหตุ: ดังที่กล่าวไว้ก่อนหน้านี้ หากต้องการเรียกใช้คำสั่งนี้ในสมุดบันทึก Google Colab หรือ Colab Enterprise คุณสามารถใช้คำสั่ง Magic ของ BigQuery ได้ด้วย นั่นคือ %%bigquery นอกจากนี้ หากต้องการแสดงภาพกราฟในสมุดบันทึก Google Colab หรือ Colab Enterprise ให้ใส่แฟล็ก -graph ดังนี้ %%bigquery -graph
%%bigquery --project=$PROJECT_ID --graph output
Graph restaurant.bombod
match p=(a:itemlocation)-[c:consists_of]->(b:itemlocation)
match q=(a)-[d:stored_at]->(e:location)
optional match z=(f)-[g:makes]-(b)
return to_json(p) as ppath, to_json(q) as qpath, to_json(z) as zpath
เอาต์พุต:

7. กรณีการใช้งานที่ 1: การติดตามการร้องเรียนต้นทาง
สถานการณ์: ลูกค้าบ่นเกี่ยวกับคุณภาพของไก่ในแซนวิชที่ร้านในนิวยอร์ก คุณต้องย้อนรอยสินค้าที่เสร็จแล้วเพื่อดูขั้นตอนการประกอบในทันที
การค้นหาแบบ Traversal
เรียกใช้การค้นหาโดยใช้รูปแบบการค้นหาการสำรวจกราฟ ซึ่งจะพิจารณาconsists_ofที่เกี่ยวข้องกับการประกอบชิ้นส่วนตั้งแต่ส่วนประกอบขั้นต้นไปจนถึงส่วนประกอบขั้นปลาย
%%bigquery --project=$PROJECT_ID --graph
GRAPH restaurant.bombod
MATCH p=(a:itemlocation)-[c:consists_of]->(b:itemlocation)
OPTIONAL MATCH q=(b)-[d:stored_at]-(e)
return to_json(p) as ppath, to_json(q) as qpath
เนื่องจากทิศทางลูกศรในconsists_ofตาราง Edge (Ingredient -> Finished) การค้นหาที่ไหลขึ้นจึงให้ลิงก์ที่แยกเนื้อหาที่ขึ้นต่อกันและตำแหน่งที่จัดเก็บได้อย่างรวดเร็ว
เอาต์พุต: 
8. กรณีการใช้งานที่ 2: การวิเคราะห์ผลกระทบ
สถานการณ์: พายุหิมะทำให้ศูนย์กระจายสินค้าในโคลัมบัส รัฐโอไฮโอต้องปิดทำการ คุณต้องทราบว่าการเตรียมการขั้นปลายหรือสินค้าสำเร็จรูปใดได้รับผลกระทบทันที
การค้นหาแบบ Traversal
คุณเริ่มต้นที่locationที่เฉพาะเจาะจงซึ่งแสดงถึงศูนย์กระจายสินค้า ระบุสินค้าคงคลังที่จัดเก็บไว้ที่นั่น และดูว่าสินค้าสำเร็จรูปใดที่ต้องใช้
# @title Impact of a storm on a DC
%%bigquery --project=$PROJECT_ID --graph
Graph restaurant.bombod
match path1=(z:itemlocation)-[m:stored_at]->(dc:location) where dc.locationKey like '%DC-Sysco-Columbus-OH%'
match path2=(z:itemlocation)-[c:consists_of]->(b:itemlocation)
match path3=(b:itemlocation)-[n:makes]->(item:item)
optional match path4=(b)-[p:stored_at]->(q:location)
return to_json(path1) as path1, to_json(path2) as path2,to_json(path3) as path3, to_json(path4) as path4
เอาต์พุต: 
9. กรณีการใช้งานที่ 3: การเรียกคืนข้อมูลปลายน้ำ
สถานการณ์: ซัพพลายเออร์แจ้งให้คุณทราบถึงผลิตภัณฑ์ที่ปนเปื้อนในล็อตที่เฉพาะเจาะจง ซึ่งก็คือมะเขือเทศสุกงอมจากซัพพลายเออร์ คุณต้องค้นหารายการเมนูสุดท้ายที่ได้รับผลกระทบทั้งหมดในคาเฟ่
การค้นหาแบบ Traversal
คุณมองหาตำแหน่งวัตถุดิบที่ปนเปื้อน จากนั้นทำการ Path Traversal ที่ไหลลงมาเพื่อค้นหาสินค้าที่ได้รับผลกระทบในที่สุด
%%bigquery --project=$PROJECT_ID --graph
Graph restaurant.bombod
match path1=(a:itemlocation)-[c:consists_of]->(b:itemlocation)-[e:makes]->(f:item) where f.itemKey like '%Tomato%'
return to_json(path1) as result
การค้นหานี้จะค้นหารายการทั้งหมดที่ตรงกับรูปแบบ 'Tomato' และเชื่อมโยงกับความสัมพันธ์ต้นทาง ซึ่งทำให้เป็นการจับคู่ที่มีประสิทธิภาพซึ่งเผยแพร่เพื่อค้นหารายการในคาเฟ่ที่ต้องเรียกคืน
เอาต์พุต: 
10. ล้าง
ลบทรัพยากรเมื่อทำตามขั้นตอนการแนะนำเรียบร้อยแล้วเพื่อหลีกเลี่ยงค่าบริการที่เหลือในพื้นที่ทำงาน
DROP SCHEMA `restaurant` CASCADE;
11. บทสรุป
ยินดีด้วย คุณได้สร้างโมเดลซัพพลายเชนและทำการวิเคราะห์ผลกระทบโดยใช้ BigQuery Graph
สรุป
คุณได้เรียนรู้วิธีต่อไปนี้
- ประกาศความสัมพันธ์เชิงสัมพันธ์ที่เน้นกราฟด้วยคีย์หลัก/คีย์นอก
- สร้างกราฟพร็อพเพอร์ตี้แบบรวม
- ไปยังความสัมพันธ์แบบหลายโหนดได้อย่างมีประสิทธิภาพโดยใช้ตรรกะการข้ามกราฟการค้นหา
ดูข้อมูลเชิงลึกเกี่ยวกับสถาปัตยกรรมกราฟเพิ่มเติมได้ที่เอกสารประกอบของ Google Cloud