Ketertelusuran Rantai Suplai dengan BigQuery Graph

1. Pengantar

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

Anda akan membuat model jaringan supply chain restoran yang berfokus pada keamanan dan kontrol kualitas makanan. Jika terjadi masalah keamanan makanan—seperti bahan yang terkontaminasi dari supplier—waktu adalah hal yang sangat penting. Mengidentifikasi "potensi dampak kerusakan" dan melakukan penarikan produk secara cepat dapat menghemat biaya dan melindungi pelanggan.

Ketakutan Terhadap Makanan Restoran

Model relasional tradisional memerlukan operasi JOIN yang kompleks dan multi-langkah untuk melacak item melalui beberapa tahap (Supplier -> DC -> Commissary -> Store -> Finished Item). Dengan BigQuery Graph, kita dapat membuat model 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 Property Graph di dalam BigQuery.
  • Cara menjalankan kueri traversal untuk melacak dampak hulu dan hilir.

Yang akan Anda butuhkan

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

Estimasi Biaya

Lab ini diperkirakan akan dikenai biaya analisis BigQuery kurang dari $5 USD, 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 dilengkapi dengan semua yang Anda butuhkan untuk menggunakan Google Cloud.

  1. Buka Konsol Google Cloud.
  2. Klik ikon Activate Cloud Shell di toolbar kanan atas.
  3. Klik Continue 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)

Mengaktifkan API

Jalankan perintah ini untuk mengaktifkan BigQuery API yang diperlukan:

gcloud services enable bigquery.googleapis.com \
  bigqueryreservation.googleapis.com 

Membuat Pemesanan &Penugasan BigQuery

Untuk menjalankan kueri GQL, Anda harus memiliki pemesanan yang menggunakan edisi Enterprise atau Enterprise Plus. Buat pemesanan Edisi Enterprise dengan penskalaan otomatis di Cloud Shell:

# 1. Create a BigQuery Enterprise reservation with 0 baseline slots and 100 max autoscaling slots
bq mk --reservation \
  --project_id=${GCP_PROJECT} \
  --location=US \
  --edition=ENTERPRISE \
  --slots=0 \
  --autoscale_max_slots=100 \
  --ignore_idle_slots=true \
  supplychaingraph-reservation

# 2. Assign your Cloud project to the newly created reservation for query execution
bq mk --reservation_assignment \
  --project_id=${GCP_PROJECT} \
  --location=US \
  --reservation_id=supplychaingraph-reservation \
  --job_type=QUERY \
  --assignee_type=PROJECT \
  --assignee_id=${GCP_PROJECT}

3. Membuat Skema dan Tabel

Anda akan membuat set data dan tabel yang mewakili komponen supply chain:

  • item: Definisi item generik (misalnya, Tomat, Ayam).
  • location: Fasilitas (Supplier, pusat distribusi, kafe).
  • itemlocation: Tabel persimpangan yang mewakili 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 BigQuery Console.

Untuk menggunakan BigQuery Console:

  1. Buka BigQuery Console 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 BigQuery Console untuk membuat skema. Anda akan menggunakan variabel node di SQL.

Skema Data BigQuery

Catatan: (1) Untuk menjalankannya di Google Colab, Anda juga dapat menggunakan perintah magic BigQuery: %%bigquery Cuplikan berikut membuat skema restoran dalam project Anda untuk menyimpan 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, Anda harus menginstal beberapa library, bergantung pada persyaratan Anda. 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 ;

Buat 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 Contoh

Agar lab ini sepenuhnya mandiri, Anda akan mengisi tabel dengan data contoh menggunakan pernyataan LOAD DATA SQL murni. Hal ini mewakili jaringan yang dimulai dengan Supplier, melintasi Distribution Center (DC) dan Commissary Kitchen, dan berakhir di Retail Café.

Jalankan kueri SQL berikut untuk memuat data:

Pemuatan Data BigQuery

Catatan: Anda dapat menghapus %%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 Utama dan Kunci Asing SQL standar. Hal ini memandu BigQuery dalam memahami ID Node dan menghubungkan tabel Edge ke tabel Node.

Buat Property Graph

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

Anda menentukan:

  • Node: item, location, itemlocation
  • Edge: 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 traversal top-down untuk melihat seluruh jaringan supply chain. Di notebook atau UI standar yang mendukungnya (seperti %%bigquery --graph), hal ini akan menampilkan peta visual.

Gunakan kueri grafik absolut untuk menyiapkan node dan edge.

Catatan: Seperti yang disebutkan sebelumnya, untuk menjalankannya di Google Colab atau Colab Enterprise Notebooks, Anda juga dapat menggunakan perintah magic BigQuery: %%bigquery Selain itu, untuk memvisualisasikan grafik di Google Colab atau Colab Enterprise Notebooks, sertakan flag –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: Pelanggan mengeluhkan kualitas ayam di sandwich mereka di toko New York. Anda perlu melacak item yang sudah selesai ke belakang untuk melihat tahap perakitannya.

Kueri Traversal

Jalankan kueri menggunakan format kueri Graph Traversal. Hal ini melihat edge consists_of yang menghubungkan rakitan hilir hingga bahan 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 di Tabel Edge consists_of (Ingredient -> Finished), penelusuran yang mengalir ke hulu akan menghasilkan link yang dengan cepat mengisolasi bahan dan lokasi penyimpanan yang bergantung.

Output: Menavigasi Sumber Ayam

8. Kasus Penggunaan 2: Analisis Dampak

Skenario: Badai salju telah menutup Distribution Center di Columbus, OH. Anda perlu mengetahui persiapan hilir atau item yang sudah selesai yang langsung terpengaruh.

Kueri Traversal

Anda mulai dari location tertentu yang mewakili Distribution Center, mengidentifikasi inventaris yang disimpan di sana, dan melihat item yang sudah selesai 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: Penarikan Produk Hilir

Skenario: Supplier memberi tahu Anda tentang batch produk tertentu yang terkontaminasi: Vine-Ripened Tomatoes dari Supplier. Anda perlu menemukan semua item menu akhir yang terpengaruh di kafe.

Kueri Traversal

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 'Tomato' dan yang terkait dengan hubungan hulu, sehingga menjadikannya pemetaan yang efektif untuk menemukan item kafe mana yang harus ditarik.

Output: Dampak Hilir Tomat yang Buruk

10. Pembersihan

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

DROP SCHEMA `restaurant` CASCADE;

11. Kesimpulan

Selamat! Anda telah membuat model supply chain dan menjalankan analisis dampak menggunakan BigQuery Graph.

Rangkuman

Anda telah mempelajari cara:

  1. Mendeklarasikan hubungan relasional yang berpusat pada grafik dengan Kunci Utama/Asing.
  2. Membuat Property Graph Terpadu.
  3. Menavigasi hubungan multi-node secara efisien menggunakan logika traversal Graph Query.

Untuk mendapatkan insight arsitektur grafik lainnya, buka dokumen Google Cloud.