1. Giriş
Bu codelab'de, karmaşık tedarik zinciri ve lojistik sorunlarını çözmek için BigQuery Graph'ten nasıl yararlanacağınızı öğreneceksiniz.
Gıda güvenliği ve kalite kontrolüne odaklanan bir restoran tedarik zinciri ağı oluşturacaksınız. Tedarikçiden gelen kirlenmiş bir malzeme gibi gıda güvenliği sorunu ortaya çıktığında zaman çok önemlidir. "Patlama yarıçapını" belirlemek ve cerrahi geri çağırmayı hızlı bir şekilde uygulamak maliyetleri düşürebilir ve müşterileri koruyabilir.

Geleneksel ilişkisel modeller, öğeleri birden fazla aşamada (Tedarikçi -> DC -> Komiser -> Mağaza -> Bitmiş Ürün) izlemek için karmaşık ve çok adımlı JOIN işlemler gerektirir. BigQuery Graph ile bu bağlantıları doğrudan modelliyoruz. Böylece, ISO GQL (Graph Query Language) standardını kullanarak sezgisel ve hızlı sorgular oluşturabiliyoruz.
Neler öğreneceksiniz?
- Mevcut BigQuery tablolarının üzerinde nasıl grafik modeli tanımlanacağı
- BigQuery'de nasıl özellik grafiği oluşturulur?
- Yukarı ve aşağı yönlü etkileri izlemek için geçiş sorgularını çalıştırma
İhtiyacınız olanlar
- Faturalandırmanın etkin olduğu bir Google Cloud projesi.
- Google Cloud Shell
Maliyet tahmini
Bu laboratuvarın BigQuery analiz ücretleri açısından 5 ABD dolarından daha az maliyetli olması beklenmektedir. Bu tutar, yeni kullanıcılar için ücretsiz katman tahsislerinin çok altındadır.
2. Kurulum ve Gereksinimler
Cloud Shell'i açın
Çalışmalarınızın büyük kısmını, Google Cloud'u kullanmak için ihtiyacınız olan her şeyi içeren yüklü bir ortam olan Cloud Shell'de yapacaksınız.
- Google Cloud Console'a gidin.
- Sağ üstteki araç çubuğunda Cloud Shell'i Etkinleştir simgesini tıklayın.
- İstenirse Devam'ı tıklayın.
Ortam değişkenlerini ayarlama
Cloud Shell'de, gelecekteki komutları basitleştirmek için proje kimliğinizi ayarlayın.
export PROJECT_ID=$(gcloud config get-value project)
BigQuery API'yi etkinleştir
BigQuery API'nin etkinleştirildiğinden emin olun. Bu özellik genellikle varsayılan olarak etkindir ancak yine de kontrol etmeniz önerilir.
gcloud services enable bigquery.googleapis.com
3. Şema ve Tablo Oluşturma
Tedarik zinciri bileşenlerinizi temsil eden bir veri kümesi ve tablolar oluşturursunuz:
item: Genel öğe tanımı (ör. domates, tavuk).location: Tesisler (tedarikçiler, dağıtım merkezleri, kafeler).itemlocation: Envanter konumlarını temsil eden kesişim tablosu.bom: BoM (ağırlık ilişkilerini tanımlar, ör. A öğesi B öğesine girer).makes:itemlocation,itemile eşlenir.stored_at: Haritalaritemlocationilelocationarasında.
Veri Kümesi Oluştur
Bu laboratuvardaki SQL komutlarını Cloud Shell veya BigQuery Konsolu'nu kullanarak çalıştırabilirsiniz.
BigQuery konsolunu kullanmak için:
- BigQuery Console'u yeni bir sekmede açın.
- Bu laboratuvardaki her SQL snippet'ini düzenleyiciye yapıştırın, ardından çalıştırmak için Çalıştır düğmesini tıklayın.

Cloud Shell'de aşağıdaki komutu çalıştırın veya şemayı oluşturmak için BigQuery Console'u kullanın. SQL'inizde düğüm değişkenlerini kullanacaksınız.

Not: (1) Bu işlemi Google Colab'de yürütmek için BigQuery sihirli komutlarını da kullanabilirsiniz: %%bigquery Aşağıdaki snippet, grafik verilerinizi barındırmak için projenizde restoran şemasını oluşturur. (2) Google Colab'den çalıştırıyorsanız %%bigquery –project <PROJECT_ID> kullanmanız gerekir. PROJECT_ID alanının, kullanmayı planladığınız uygun projeyle eşlendiğinden emin olun: PROJECT_ID = "argolis-project-340214" # @param {"type":"string"} (3) Colab kullanıyorsanız gereksinimlerinize bağlı olarak bazı kitaplıkları yüklemeniz gerekir. Grafik görselleştirme kullanacaksanız kitaplığı pip ile yüklediğinizden emin olun: spanner-graph-notebook==1.1.5

%%bigquery --project=$PROJECT_ID
CREATE SCHEMA IF NOT EXISTS restaurant ;
Tablo oluşturma
Tabloları oluşturmak için aşağıdaki SQL kodunu yürütün.
%%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. Örnek Verileri Yükleme
Bu laboratuvarın tamamen bağımsız olması için tabloları saf SQL LOAD DATA ifadelerini kullanarak örnek verilerle dolduracaksınız. Bu, Tedarikçi ile başlayan, Dağıtım Merkezi (DC) ve Mutfak üzerinden geçen ve Perakende Kafede sonlanan bir ağı temsil eder.
Verileri yüklemek için aşağıdaki SQL sorgularını çalıştırın:

Not: Doğrudan BigQuery Studio'da çalıştırıyorsanız %%bigquery ifadesini atlayabilirsiniz.
%%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. Kısıtlamalar Ekleme ve Grafiği Tanımlama
Grafiği oluşturmadan önce, standart SQL birincil anahtar ve yabancı anahtar kısıtlamalarını kullanarak anlamsal ilişkileri bildirirsiniz. Bunlar, BigQuery'nin düğüm tanımlayıcılarını anlamasına ve Edge tablolarını Node tablolarına bağlamasına yardımcı olur.
Özellik grafiği oluşturma
Şimdi bu tabloları restaurant.bombod adlı tek bir tutarlı grafik yapısında birleştirin.
Şunları tanımlarsınız:
- Düğümler:
item,location,itemlocation - Kenarlar:
makes,stored_atveconsists_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. Tedarik Zincirini Görselleştirme
Tüm tedarik zinciri ağını görmek için yukarıdan aşağıya geçiş sorgusu çalıştırabilirsiniz. Standart bir not defterinde veya bunu destekleyen bir kullanıcı arayüzünde (ör. %%bigquery --graph) görsel bir harita döndürür.
Düğümleri ve kenarları ayarlamak için mutlak grafik sorgularını kullanın.
Not: Daha önce belirtildiği gibi, bunu Google Colab veya Colab Enterprise not defterlerinde yürütmek için BigQuery sihirli komutlarını da kullanabilirsiniz: %%bigquery Ayrıca grafiği Google Colab veya Colab Enterprise not defterlerinde görselleştirmek için şu şekilde –graph işaretini ekleyin: %%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ış:

7. 1. Kullanım Alanı: Yukarı Akış Şikayetini İzleme
Senaryo: Bir müşteri, New York'taki mağazada sandviçindeki tavuğun kalitesinden şikayet ediyor. Bitmiş öğenin hemen önceki montaj aşamalarını görmek için öğeyi geriye doğru takip etmeniz gerekir.
Geçiş Sorgusu
Sorguyu Graph Traversal sorgu biçimini kullanarak çalıştırın. Bu, montajları aşağı akıştan yukarı akıştaki bileşenlere bağlayan consists_of kenarlarına bakar.
%%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 tablosundaki (Ingredient -> Finished) ok yönü nedeniyle, yukarı akışlı bir arama, bağımlı materyalleri ve depolama konumlarını hızlıca ayıran bağlantılar sağlar.
Çıkış: 
8. 2. Kullanım Alanı: Etki Analizi
Senaryo: Columbus, OH'taki dağıtım merkezi kar fırtınası nedeniyle kapatıldı. Hangi sonraki hazırlıkların veya bitmiş öğelerin bu durumdan hemen etkilendiğini bilmeniz gerekiyor.
Geçiş Sorgusu
Dağıtım merkezini temsil eden belirli bir location ile başlayıp orada depolanan envanteri belirleyebilir ve hangi bitmiş öğelerin bu envantere ihtiyaç duyduğunu görebilirsiniz.
# @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
Çıkış: 
9. 3. Kullanım Alanı: Aşağı Akışta Geri Çağırma
Senaryo: Bir tedarikçi, size tedarikçiden gelen belirli bir parti kirlenmiş ürün (Vine-Ripened Tomatoes) hakkında bildirimde bulunuyor. Kafelerde etkilenen tüm son menü öğelerini bulmanız gerekir.
Geçiş Sorgusu
Kirlenmiş ham madde konumunu arar, ardından nihai etkilenen öğeleri bulmak için aşağı akış yönünde bir dosya yolu manipülasyonu gerçekleştirirsiniz.
%%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
Bu sorgu, "Domates" ile desen eşleşmesi yapan ve yukarı akış ilişkisiyle iç içe geçmiş tüm öğeleri bulur. Bu da, hangi kafe öğelerinin geri çağrılması gerektiğini keşfetmek için güçlü bir eşleme oluşturur.
Çıkış: 
10. Temizleme
Çalışma alanınızda kalan ücretleri önlemek için, adım adım açıklama adımlarını tamamladıktan sonra kaynakları silin.
DROP SCHEMA `restaurant` CASCADE;
11. Sonuç
Tebrikler! BigQuery Graph'ı kullanarak bir tedarik zinciri modellemiş ve etki analizi gerçekleştirmiş olmalısınız.
Özet
Öğrendikleriniz:
- Birincil/yabancı anahtarlarla grafiğe odaklı ilişkisel ilişkileri bildirin.
- Birleşik Mülk Grafiği oluşturun.
- Grafik sorgusu geçiş mantığını kullanarak çok düğümlü ilişkilerde verimli bir şekilde gezinin.
Grafik mimarisi hakkında daha fazla bilgi edinmek için Google Cloud belgelerini ziyaret edin.