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.

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.
- Buka Google Cloud Console.
- Klik ikon Activate Cloud Shell di toolbar kanan atas.
- 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: Memetakanitemlocationkeitem.stored_at: Memetakanitemlocationkelocation.
Buat Set data
Anda dapat menjalankan perintah SQL di lab ini menggunakan Cloud Shell atau Konsol BigQuery.
Untuk menggunakan konsol BigQuery:
- Buka Konsol BigQuery di tab baru.
- Tempel setiap cuplikan SQL dari lab ini ke editor, lalu klik tombol Run untuk menjalankannya.

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

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

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

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, danconsists_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:

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: 
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: 
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: 
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:
- Nyatakan hubungan relasional yang berpusat pada grafik dengan Kunci Utama/Kunci Asing.
- Buat Grafik Properti Terpadu.
- Menavigasi hubungan multi-node secara efisien menggunakan logika traversal Kueri Grafik.
Untuk mendapatkan lebih banyak insight arsitektur grafik, buka dokumen Google Cloud.