การตรวจสอบย้อนกลับของซัพพลายเชนด้วยกราฟ BigQuery

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

  1. ไปที่ คอนโซล Google Cloud
  2. คลิกไอคอนเปิดใช้งาน Cloud Shell ในแถบเครื่องมือด้านขวาบน
  3. คลิกต่อไปหากมีข้อความแจ้ง

ตั้งค่าตัวแปรสภาพแวดล้อม

ใน 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 กับ item
  • stored_at: แผนที่ itemlocation ถึง location

สร้างชุดข้อมูล

คุณเรียกใช้คำสั่ง SQL ในแล็บนี้ได้โดยใช้ Cloud Shell หรือคอนโซล BigQuery

วิธีใช้คอนโซล BigQuery

  1. เปิดคอนโซล BigQuery ในแท็บใหม่
  2. วางข้อมูลโค้ด SQL แต่ละรายการจากแล็บนี้ลงในเครื่องมือแก้ไข จากนั้นคลิกปุ่มเรียกใช้เพื่อดำเนินการ

ผู้แก้ไข BigQuery

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

สคีมาข้อมูล BigQuery

หมายเหตุ: (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 Magic ใน Colab

%%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 ได้หากเรียกใช้ใน 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

สรุป

คุณได้เรียนรู้วิธีต่อไปนี้

  1. ประกาศความสัมพันธ์เชิงสัมพันธ์ที่เน้นกราฟด้วยคีย์หลัก/คีย์นอก
  2. สร้างกราฟพร็อพเพอร์ตี้แบบรวม
  3. ไปยังความสัมพันธ์แบบหลายโหนดได้อย่างมีประสิทธิภาพโดยใช้ตรรกะการข้ามกราฟการค้นหา

ดูข้อมูลเชิงลึกเกี่ยวกับสถาปัตยกรรมกราฟเพิ่มเติมได้ที่เอกสารประกอบของ Google Cloud