Khả năng truy xuất nguồn gốc chuỗi cung ứng bằng BigQuery Graph

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 tận dụng BigQuery Graph để giải quyết các vấn đề phức tạp về chuỗi cung ứng và hậu cần.

Bạn sẽ mô hình hoá một mạng lưới chuỗi cung ứng của nhà hàng, tập trung vào an toàn thực phẩm và kiểm soát chất lượng. Khi vấn đề về an toàn thực phẩm xảy ra (chẳng hạn như một thành phần bị ô nhiễm từ nhà cung cấp), thời gian là yếu tố quan trọng. Việc xác định "phạm vi ảnh hưởng" và thực hiện thu hồi có chọn lọc một cách nhanh chóng có thể giúp bạn tiết kiệm chi phí và bảo vệ khách hàng.

Vụ bê bối thực phẩm tại nhà hàng

Các mô hình quan hệ truyền thống đòi hỏi các thao tác JOIN phức tạp, nhiều bước để theo dõi các mặt hàng qua nhiều giai đoạn (Nhà cung cấp -> Trung tâm phân phối -> Nhà bếp trung tâm -> Cửa hàng -> Mặt hàng hoàn chỉnh). Với BigQuery Graph, chúng tôi mô hình hoá trực tiếp các mối kết nối này, cho phép thực hiện các truy vấn trực quan và nhanh chóng bằng tiêu chuẩn ISO GQL (Ngôn ngữ truy vấn đồ thị).

Kiến thức bạn sẽ học được

  • Cách xác định một mô hình biểu đồ dựa trên các bảng BigQuery hiện có.
  • Cách tạo Biểu đồ thuộc tính trong BigQuery.
  • Cách chạy truy vấn truyền tải để theo dõi tác động xuôi dòng và ngược dòng.

Bạn cần có

  • Một dự án trên Google Cloud đã bật tính năng thanh toán.
  • Google Cloud Shell.

Chi phí ước tính

Phí phân tích BigQuery cho bài thực hành này dự kiến sẽ dưới 5 USD, tức là nằm trong hạn mức của Gói miễn phí dành cho người dùng mới.

2. Thiết lập và yêu cầu

Mở Cloud Shell

Bạn sẽ thực hiện phần lớn công việc trong Cloud Shell, một môi trường được tải sẵn mọi thứ bạn cần để sử dụng Google Cloud.

  1. Chuyển đến Google Cloud Console.
  2. Nhấp vào biểu tượng Kích hoạt Cloud Shell trong thanh công cụ ở trên cùng bên phải.
  3. Nhấp vào Tiếp tục nếu thấy lời nhắc.

Thiết lập các biến môi trường

Trong Cloud Shell, hãy đặt mã dự án để đơn giản hoá các lệnh sau này.

export PROJECT_ID=$(gcloud config get-value project)

Bật BigQuery API

Đảm bảo bạn đã bật BigQuery API. Tính năng này thường được bật theo mặc định, nhưng tốt nhất là bạn nên đảm bảo an toàn.

gcloud services enable bigquery.googleapis.com

3. Tạo giản đồ và bảng

Bạn sẽ tạo một tập dữ liệu và các bảng đại diện cho các thành phần trong chuỗi cung ứng của mình:

  • item: Định nghĩa chung về mặt hàng (ví dụ: Cà chua, Gà).
  • location: Cơ sở vật chất (Nhà cung cấp, trung tâm phân phối, quán cà phê).
  • itemlocation: Bảng giao nhau biểu thị vị trí của kho hàng.
  • bom: Bảng kê khai thành phần (xác định mối quan hệ về trọng lượng, ví dụ: Vật phẩm A được đưa vào Vật phẩm B).
  • makes: Maps itemlocation đến item.
  • stored_at: Maps itemlocation đến location.

Tạo tập dữ liệu

Bạn có thể chạy các lệnh SQL trong phòng thí nghiệm này bằng Cloud Shell hoặc Bảng điều khiển BigQuery.

Cách sử dụng bảng điều khiển BigQuery:

  1. Mở Bảng điều khiển BigQuery trong một thẻ mới.
  2. Dán từng đoạn mã SQL trong lớp học này vào trình chỉnh sửa, sau đó nhấp vào nút Chạy để thực thi.

Trình chỉnh sửa BigQuery

Chạy lệnh sau trong Cloud Shell hoặc sử dụng Bảng điều khiển BigQuery để tạo giản đồ. Bạn sẽ sử dụng các biến nút trong SQL.

Giản đồ dữ liệu BigQuery

Lưu ý: (1) Để thực thi lệnh này trong Google Colab, bạn cũng có thể sử dụng các lệnh đặc biệt của BigQuery: %%bigquery Đoạn mã sau đây sẽ tạo giản đồ nhà hàng trong dự án của bạn để lưu trữ dữ liệu biểu đồ. (2) Bạn cần sử dụng %%bigquery –project <PROJECT_ID> nếu đang chạy từ Google Colab. Đảm bảo rằng trường PROJECT_ID được liên kết với dự án phù hợp mà bạn dự định sử dụng: PROJECT_ID = "argolis-project-340214" # @param {"type":"string"} (3) Nếu đang sử dụng colab, thì tuỳ theo yêu cầu, bạn sẽ cần cài đặt một số thư viện. Nếu bạn sẽ sử dụng tính năng trực quan hoá biểu đồ, hãy nhớ cài đặt thư viện bằng pip: spanner-graph-notebook==1.1.5

Lệnh BigQuery Magic trong Colab

%%bigquery --project=$PROJECT_ID
CREATE SCHEMA IF NOT EXISTS restaurant ;

Tạo bảng

Thực thi mã SQL sau đây để tạo các bảng.

%%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. Đang tải dữ liệu mẫu

Để lớp học này hoàn toàn độc lập, bạn sẽ điền dữ liệu mẫu vào các bảng bằng cách sử dụng các câu lệnh LOAD DATA SQL thuần tuý. Đây là một mạng lưới bắt đầu từ một Nhà cung cấp, đi qua một Trung tâm phân phối (DC)Bếp ăn tập thể, rồi kết thúc tại một Quán cà phê bán lẻ.

Chạy các truy vấn SQL sau để tải dữ liệu:

Tải dữ liệu BigQuery

Lưu ý: Bạn có thể bỏ qua %%bigquery nếu đang chạy trực tiếp trong 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. Thêm các ràng buộc và xác định biểu đồ

Trước khi tạo biểu đồ, bạn khai báo các mối quan hệ ngữ nghĩa bằng cách sử dụng các ràng buộc Khoá chính và Khoá ngoại SQL tiêu chuẩn. Các khoá này hướng dẫn BigQuery hiểu được các giá trị nhận dạng Nút và kết nối các bảng Cạnh với các bảng Nút.

Tạo biểu đồ thuộc tính

Giờ đây, bạn sẽ hợp nhất các bảng này thành một cấu trúc Biểu đồ mạch lạc duy nhất có tên là restaurant.bombod.

Bạn xác định:

  • Nút: item, location, itemlocation
  • Các cạnh: makes, stored_atconsists_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. Trực quan hoá chuỗi cung ứng

Bạn có thể chạy một truy vấn duyệt qua từ trên xuống để xem toàn bộ mạng lưới chuỗi cung ứng. Trong một sổ tay tiêu chuẩn hoặc giao diện người dùng hỗ trợ sổ tay đó (chẳng hạn như %%bigquery --graph), thao tác này sẽ trả về một bản đồ trực quan.

Sử dụng các truy vấn đồ thị tuyệt đối để thiết lập các nút và cạnh.

Lưu ý: Như đã đề cập trước đó, để thực thi thao tác này trong Google Colab hoặc Colab Enterprise Notebooks, bạn cũng có thể sử dụng các lệnh đặc biệt của BigQuery: %%bigquery Ngoài ra, để trực quan hoá biểu đồ trong Google Colab hoặc Colab Enterprise Notebooks, hãy thêm cờ –graph như sau: %%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

Kết quả:

Biểu đồ vật dụng cho nhà hàng

7. Trường hợp sử dụng 1: Theo dõi khiếu nại từ nguồn

Tình huống: Khách hàng phàn nàn về chất lượng thịt gà trong bánh mì của họ tại cửa hàng ở New York. Bạn cần truy xuất ngược lại mặt hàng đã hoàn thành để xem các giai đoạn lắp ráp ngay trước đó.

Truy vấn truyền tải

Chạy truy vấn bằng định dạng truy vấn Graph Traversal. Thao tác này xem xét các cạnh consists_of liên quan đến các thành phần lắp ráp ở hạ nguồn cho đến các thành phần ở thượng nguồn.

%%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

Do hướng mũi tên trong consists_of Bảng cạnh (Ingredient -> Finished), nên một cụm từ tìm kiếm xuôi dòng sẽ nhanh chóng tạo ra các đường liên kết để tách biệt các vật liệu phụ thuộc và vị trí lưu trữ.

Đầu ra: Tìm hiểu nguồn gốc của gà

8. Trường hợp sử dụng 2: Phân tích tác động

Tình huống: Một trận bão tuyết đã khiến Trung tâm phân phối ở Columbus, Ohio phải đóng cửa. Bạn cần biết những mặt hàng thành phẩm hoặc mặt hàng cần chuẩn bị ở giai đoạn sau nào bị ảnh hưởng ngay lập tức.

Truy vấn truyền tải

Bạn bắt đầu tại location cụ thể đại diện cho Trung tâm phân phối, xác định kho hàng được lưu trữ ở đó và xem những mặt hàng đã hoàn thành nào cần đến chúng.

# @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


Đầu ra: Ảnh hưởng của bão

9. Trường hợp sử dụng 3: Thu hồi xuôi dòng

Tình huống: Nhà cung cấp thông báo cho bạn về một lô sản phẩm cụ thể bị nhiễm bẩn: Cà chua chín trên cây của Nhà cung cấp. Bạn cần tìm tất cả các mục cuối cùng bị ảnh hưởng trong thực đơn tại các quán cà phê.

Truy vấn truyền tải

Bạn tìm vị trí của nguyên liệu thô bị ô nhiễm, sau đó thực hiện một cuộc tấn công path traversal theo hướng xuôi dòng để tìm các mục chịu ảnh hưởng cuối cùng.

%%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

Truy vấn này xác định vị trí của tất cả các mục khớp với mẫu 'Cà chua' và có mối quan hệ đan xen với mối quan hệ ngược dòng, khiến truy vấn này trở thành một mối quan hệ ánh xạ mạnh mẽ, lan truyền để khám phá những mục nào trong quán cà phê cần được thu hồi.

Đầu ra: Tác động hạ nguồn của Bad Tomatoes

10. Dọn dẹp

Xoá tài nguyên sau khi hoàn tất các bước hướng dẫn để tránh mọi khoản phí còn lại trong không gian làm việc của bạn.

DROP SCHEMA `restaurant` CASCADE;

11. Kết luận

Xin chúc mừng! Bạn đã lập mô hình chuỗi cung ứng và thực hiện phân tích tác động bằng BigQuery Graph.

Tóm tắt

Bạn đã tìm hiểu cách:

  1. Khai báo mối quan hệ quan hệ tập trung vào biểu đồ bằng khoá chính/khoá ngoài.
  2. Tạo một Biểu đồ thuộc tính hợp nhất.
  3. Điều hướng các mối quan hệ nhiều nút một cách hiệu quả bằng cách sử dụng logic duyệt qua Graph Query.

Để tìm hiểu thêm thông tin chi tiết về cấu trúc biểu đồ, hãy truy cập vào tài liệu của Google Cloud.