BigQuery Graph ile tedarik zinciri izlenebilirliği

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.

Restoranlarda Gıda Korkusu

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.

  1. Google Cloud Console'a gidin.
  2. Sağ üstteki araç çubuğunda Cloud Shell'i Etkinleştir simgesini tıklayın.
  3. İ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, item ile eşlenir.
  • stored_at: Haritalar itemlocation ile location arası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:

  1. BigQuery Console'u yeni bir sekmede açın.
  2. 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.

BigQuery Düzenleyicisi

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.

BigQuery Veri Şeması

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

Colab&#39;de BigQuery Magic

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

BigQuery Veri Yükleme

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_at ve 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. 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ış:

Restoran Malzemeleri Grafiği

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ış: Navigating Source of Chicken

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ış: Fırtınanın Etkisi

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ış: Kötü Domateslerin Aşağı Akış Etkisi

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:

  1. Birincil/yabancı anahtarlarla grafiğe odaklı ilişkisel ilişkileri bildirin.
  2. Birleşik Mülk Grafiği oluşturun.
  3. 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.