Ketertelusuran Rantai Suplai dengan BigQuery Graph

1. Pengantar

Dalam codelab ini, Anda akan mempelajari cara memanfaatkan BigQuery Graph untuk memecahkan masalah kompleks terkait supply chain dan logistik.

Anda akan memodelkan jaringan rantai pasokan restoran yang berfokus pada keamanan pangan dan kontrol kualitas. Jika masalah keamanan pangan muncul—seperti bahan yang terkontaminasi dari pemasok—waktu sangatlah penting. Mengidentifikasi "radius ledakan" dan melakukan penarikan produk secara cepat dapat menghemat biaya dan melindungi pelanggan.

Ketakutan Terhadap Makanan Restoran

Model relasional tradisional memerlukan operasi JOIN multi-langkah yang kompleks untuk melacak item melalui beberapa tahap (Pemasok -> DC -> Dapur -> Toko -> Item Selesai). Dengan BigQuery Graph, kami memodelkan koneksi ini secara langsung, sehingga memungkinkan kueri yang intuitif dan cepat menggunakan standar ISO GQL (Graph Query Language).

Yang akan Anda pelajari

  • Cara menentukan model grafik di atas tabel BigQuery yang ada.
  • Cara membuat Grafik Properti di dalam BigQuery.
  • Cara menjalankan kueri penelusuran untuk melacak dampak hulu dan hilir.

Yang Anda butuhkan

  • Project Google Cloud yang mengaktifkan penagihan.
  • Google Cloud Shell.

Estimasi Biaya

Lab ini diperkirakan akan dikenai biaya kurang dari $5 USD dalam biaya analisis BigQuery, yang masih dalam alokasi Paket Gratis untuk pengguna baru.

2. Penyiapan dan Persyaratan

Buka Cloud Shell

Anda akan melakukan sebagian besar pekerjaan di Cloud Shell, lingkungan yang sudah dimuat dan dilengkapi dengan semua yang Anda butuhkan untuk menggunakan Google Cloud.

  1. Buka Google Cloud Console.
  2. Klik ikon Activate Cloud Shell di toolbar kanan atas.
  3. Klik Lanjutkan jika diminta.

Menyiapkan Variabel Lingkungan

Di Cloud Shell, tetapkan Project ID Anda untuk menyederhanakan perintah di masa mendatang.

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

Aktifkan BigQuery API

Pastikan BigQuery API diaktifkan. Biasanya diaktifkan secara default, tetapi sebaiknya berhati-hati.

gcloud services enable bigquery.googleapis.com

3. Membuat Skema dan Tabel

Anda akan membuat set data dan tabel yang merepresentasikan komponen rantai pasokan Anda:

  • item: Definisi item umum (misalnya, Tomat, Ayam).
  • location: Fasilitas (Pemasok, pusat distribusi, kafe).
  • itemlocation: Tabel persimpangan yang merepresentasikan lokasi inventaris.
  • bom: Bill of Materials (menentukan hubungan berat, misalnya Item A masuk ke Item B).
  • makes: Memetakan itemlocation ke item.
  • stored_at: Memetakan itemlocation ke location.

Buat Set data

Anda dapat menjalankan perintah SQL di lab ini menggunakan Cloud Shell atau Konsol BigQuery.

Untuk menggunakan konsol BigQuery:

  1. Buka Konsol BigQuery di tab baru.
  2. Tempel setiap cuplikan SQL dari lab ini ke editor, lalu klik tombol Run untuk menjalankannya.

Editor BigQuery

Jalankan perintah berikut di Cloud Shell atau gunakan Konsol BigQuery untuk membuat skema. Anda akan menggunakan variabel node di SQL.

Skema Data BigQuery

Catatan: (1) Untuk menjalankan ini di Google Colab, Anda juga dapat menggunakan perintah ajaib BigQuery: %%bigquery Cuplikan berikut membuat skema restoran dalam project Anda untuk menampung data grafik. (2) Anda harus menggunakan %%bigquery –project <PROJECT_ID> jika menjalankan dari Google Colab. Pastikan kolom PROJECT_ID dipetakan ke project yang sesuai yang ingin Anda gunakan: PROJECT_ID = "argolis-project-340214" # @param {"type":"string"} (3) Jika Anda menggunakan colab, bergantung pada persyaratan, Anda harus menginstal beberapa pustaka. Jika Anda akan menggunakan visualisasi grafik, pastikan Anda menginstal library menggunakan pip: spanner-graph-notebook==1.1.5

Magic BigQuery di Colab

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

Membuat Tabel

Jalankan kode SQL berikut untuk membuat tabel.

%%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. Memuat Data Sampel

Agar lab ini sepenuhnya mandiri, Anda akan mengisi tabel dengan data contoh menggunakan pernyataan SQL LOAD DATA murni. Hal ini merepresentasikan jaringan yang dimulai dengan Supplier, melewati Pusat Distribusi (DC) dan Dapur Komersial, dan berakhir di Kafe Retail.

Jalankan kueri SQL berikut untuk memuat data:

Pemuatan Data BigQuery

Catatan: Anda dapat menghilangkan %%bigquery jika menjalankan langsung di 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. Menambahkan Batasan dan Menentukan Grafik

Sebelum membuat grafik, Anda mendeklarasikan hubungan semantik menggunakan batasan Kunci Primer dan Kunci Asing SQL standar. Tabel ini memandu BigQuery dalam memahami ID Node dan menghubungkan tabel Edge ke tabel Node.

Membuat Grafik Properti

Sekarang, gabungkan tabel ini ke dalam satu struktur Grafik yang kohesif bernama restaurant.bombod.

Anda menentukan:

  • Node: item, location, itemlocation
  • Tepi: makes, stored_at, dan 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. Memvisualisasikan Supply Chain

Anda dapat menjalankan kueri penelusuran top-down untuk melihat seluruh jaringan rantai pasokan. Di notebook atau UI standar yang mendukungnya (seperti %%bigquery --graph), perintah ini akan menampilkan peta visual.

Gunakan kueri grafik absolut untuk menyiapkan node dan tepi.

Catatan: Seperti yang disebutkan sebelumnya, untuk mengeksekusi ini di Notebook Google Colab atau Colab Enterprise, Anda juga dapat menggunakan perintah ajaib BigQuery: %%bigquery Selain itu, untuk memvisualisasikan grafik di Notebook Google Colab atau Colab Enterprise, sertakan tanda –graph sebagai: %%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

Output:

Grafik Kebutuhan Restoran

7. Kasus Penggunaan 1: Melacak Keluhan Hulu

Skenario: Seorang pelanggan mengeluhkan kualitas ayam dalam sandwichnya di toko New York. Anda perlu menelusuri item yang sudah selesai ke belakang untuk melihat tahap perakitan langsungnya.

Kueri Lintasan

Jalankan kueri menggunakan format kueri Graph Traversal. Bagian ini melihat tepi consists_of yang terkait dengan perakitan di hilir hingga bahan di hulu.

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

Karena arah panah dalam consists_of Edge Table (Ingredient -> Finished), penelusuran yang mengalir ke hulu akan menghasilkan link yang dengan cepat mengisolasi materi dan lokasi penyimpanan yang bergantung.

Output: Menavigasi Sumber Ayam

8. Kasus Penggunaan 2: Analisis Dampak

Skenario: Badai salju telah menutup Pusat Distribusi di Columbus, OH. Anda perlu mengetahui persiapan atau item akhir di hilir mana yang langsung terpengaruh.

Kueri Lintasan

Anda mulai dari location tertentu yang merepresentasikan Pusat Distribusi, mengidentifikasi inventaris yang disimpan di sana, dan melihat item akhir mana yang memerlukannya.

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


Output: Dampak Badai

9. Kasus Penggunaan 3: Peringatan Hilir

Skenario: Pemasok memberi tahu Anda tentang batch produk tertentu yang terkontaminasi: Tomat yang Matang di Pohon dari Pemasok. Anda perlu menemukan semua item menu akhir yang terpengaruh di kafe.

Kueri Lintasan

Anda mencari lokasi bahan mentah yang terkontaminasi, lalu melakukan traversal jalur yang mengalir ke hilir untuk menemukan item yang paling terpengaruh.

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

Kueri ini menemukan semua item yang cocok dengan pola 'Tomat' dan yang saling terkait dengan hubungan hulu sehingga menjadi pemetaan yang efektif untuk menemukan item kafe mana yang harus ditarik kembali.

Output: Dampak Hilir Tomat yang Rusak

10. Pembersihan

Hapus resource setelah Anda menyelesaikan langkah-langkah penelusuran untuk menghindari biaya sisa di ruang kerja Anda.

DROP SCHEMA `restaurant` CASCADE;

11. Kesimpulan

Selamat! Anda telah memodelkan rantai pasokan dan menjalankan analisis dampak menggunakan Grafik BigQuery.

Rangkuman

Anda telah mempelajari cara:

  1. Nyatakan hubungan relasional yang berpusat pada grafik dengan Kunci Utama/Kunci Asing.
  2. Buat Grafik Properti Terpadu.
  3. Menavigasi hubungan multi-node secara efisien menggunakan logika traversal Kueri Grafik.

Untuk mendapatkan lebih banyak insight arsitektur grafik, buka dokumen Google Cloud.