1. परिचय
इस कोडलैब में, आपको सप्लाई चेन और लॉजिस्टिक्स से जुड़ी मुश्किल समस्याओं को हल करने के लिए, BigQuery Graph का इस्तेमाल करने का तरीका बताया जाएगा.
आपको रेस्टोरेंट की सप्लाई चेन नेटवर्क का मॉडल बनाना होगा. इसमें खाने की सुरक्षा और क्वालिटी कंट्रोल पर फ़ोकस किया जाएगा. जब खाने की सुरक्षा से जुड़ी कोई समस्या आती है, जैसे कि किसी सप्लायर से मिला कोई ऐसा कॉम्पोनेंट जो दूषित हो, तो समय बहुत अहम होता है. "ब्लास्ट रेडियस" का पता लगाकर, तुरंत सर्जिकल रिकॉल करने से लागत कम हो सकती है और खरीदारों को सुरक्षित रखा जा सकता है.

पारंपरिक रिलेशनल मॉडल में, कई चरणों (सप्लायर -> डीसी -> कमिसरी -> स्टोर -> तैयार आइटम) के ज़रिए आइटम को ट्रैक करने के लिए, जटिल और कई चरणों वाली JOIN कार्रवाइयां करनी पड़ती हैं. BigQuery Graph की मदद से, हम इन कनेक्शन को सीधे तौर पर मॉडल करते हैं. इससे आईएसओ GQL (ग्राफ़ क्वेरी लैंग्वेज) स्टैंडर्ड का इस्तेमाल करके, क्वेरी को आसानी से और तेज़ी से किया जा सकता है.
आपको क्या सीखने को मिलेगा
- मौजूदा BigQuery टेबल के ऊपर ग्राफ़ मॉडल को कैसे तय करें.
- BigQuery में प्रॉपर्टी ग्राफ़ बनाने का तरीका.
- अपस्ट्रीम और डाउनस्ट्रीम पर पड़ने वाले असर का पता लगाने के लिए, ट्रैवर्सल क्वेरी कैसे चलाएं.
आपको किन चीज़ों की ज़रूरत होगी
- बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट.
- Google Cloud Shell.
लागत का अनुमान
इस लैब में, BigQuery के विश्लेषण के लिए 5 डॉलर से कम का शुल्क लगेगा. यह नए उपयोगकर्ताओं के लिए, फ़्री टीयर के तहत तय किए गए शुल्क से काफ़ी कम है.
2. सेटअप और ज़रूरी शर्तें
Cloud Shell खोलें
आपको ज़्यादातर काम Cloud Shell में करना होगा. यह एक ऐसा एनवायरमेंट है जिसमें Google Cloud का इस्तेमाल करने के लिए ज़रूरी सभी सुविधाएं उपलब्ध हैं.
- Google Cloud Console पर जाएं.
- सबसे ऊपर दाईं ओर मौजूद टूलबार में, Cloud Shell चालू करें आइकॉन पर क्लिक करें.
- अगर कहा जाए, तो जारी रखें पर क्लिक करें.
एनवायरमेंट वैरिएबल सेट अप करना
Cloud Shell में, अपना प्रोजेक्ट आईडी सेट करें, ताकि आने वाले समय में कमांड को आसानी से इस्तेमाल किया जा सके.
export PROJECT_ID=$(gcloud config get-value project)
BigQuery API चालू करना
पक्का करें कि BigQuery API चालू हो. आम तौर पर, यह सुविधा डिफ़ॉल्ट रूप से चालू होती है. हालांकि, सुरक्षा के लिए इसे चालू करना बेहतर होता है.
gcloud services enable bigquery.googleapis.com
3. स्कीमा और टेबल बनाना
आपको एक डेटासेट और टेबल बनानी होंगी. इनमें आपकी सप्लाई चेन के कॉम्पोनेंट शामिल होंगे:
item: आइटम की सामान्य परिभाषा (जैसे, टमाटर, चिकन).location: सुविधाएं (सप्लायर, डिस्ट्रिब्यूशन सेंटर, कैफ़े).itemlocation: यह इंटरसेक्शन टेबल, इन्वेंट्री की जगहों के बारे में बताती है.bom: बिल ऑफ़ मटीरियल (वज़न के संबंध तय करता है, जैसे कि आइटम A, आइटम B में जाता है).makes: Mapsitemlocationto theitem.stored_at: Mapsitemlocationसेlocationतक.
डेटासेट बनाना
इस लैब में एसक्यूएल कमांड चलाने के लिए, Cloud Shell या BigQuery कंसोल का इस्तेमाल किया जा सकता है.
BigQuery कंसोल का इस्तेमाल करने के लिए:
- BigQuery Console को नए टैब में खोलें.
- इस लैब से हर एसक्यूएल स्निपेट को एडिटर में चिपकाएं. इसके बाद, इसे लागू करने के लिए चलाएं बटन पर क्लिक करें.

स्कीमा बनाने के लिए, Cloud Shell में यहां दिया गया कमांड चलाएं या BigQuery Console का इस्तेमाल करें. आपको अपने एसक्यूएल में नोड वैरिएबल का इस्तेमाल करना होगा.

ध्यान दें: (1) Google Colab में इसे लागू करने के लिए, BigQuery के मैजिक कमांड का भी इस्तेमाल किया जा सकता है: %%bigquery नीचे दिए गए स्निपेट से, आपके प्रोजेक्ट में रेस्टोरेंट का स्कीमा बनता है, ताकि आपके ग्राफ़ डेटा को सेव किया जा सके. (2) अगर Google Colab से चलाया जा रहा है, तो आपको %%bigquery –project <PROJECT_ID> का इस्तेमाल करना होगा. पक्का करें कि PROJECT_ID फ़ील्ड को उस प्रोजेक्ट से मैप किया गया हो जिसका आपको इस्तेमाल करना है: PROJECT_ID = "argolis-project-340214" # @param {"type":"string"} (3) अगर Colab का इस्तेमाल किया जा रहा है, तो आपको अपनी ज़रूरतों के हिसाब से कुछ लाइब्रेरी इंस्टॉल करनी होंगी. अगर आपको ग्राफ़ विज़ुअलाइज़ेशन का इस्तेमाल करना है, तो पक्का करें कि आपने यह लाइब्रेरी pip install की हो: spanner-graph-notebook==1.1.5

%%bigquery --project=$PROJECT_ID
CREATE SCHEMA IF NOT EXISTS restaurant ;
टेबल बनाना
टेबल बनाने के लिए, यहां दिया गया एसक्यूएल कोड चलाएं.
%%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. सैंपल डेटा लोड हो रहा है
इस लैब को पूरी तरह से आत्मनिर्भर बनाने के लिए, आपको प्योर एसक्यूएल LOAD DATA स्टेटमेंट का इस्तेमाल करके, टेबल में सैंपल डेटा डालना होगा. इसमें एक नेटवर्क दिखाया गया है, जो सप्लायर से शुरू होता है. इसके बाद, यह डिस्ट्रीब्यूशन सेंटर (डीसी) और कमिसरी किचन से होकर, रीटेल कैफ़े तक पहुंचता है.
डेटा लोड करने के लिए, यहां दी गई एसक्यूएल क्वेरी चलाएं:

ध्यान दें: अगर सीधे तौर पर BigQuery Studio में क्वेरी चलाई जा रही है, तो %%bigquery को हटाया जा सकता है
%%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. कंस्ट्रेंट जोड़ना और ग्राफ़ तय करना
ग्राफ़ बनाने से पहले, स्टैंडर्ड एसक्यूएल प्राइमरी की और फ़ॉरेन की की पाबंदियों का इस्तेमाल करके, सिमैंटिक रिलेशनशिप के बारे में बताया जाता है. इनसे BigQuery को नोड आइडेंटिफ़ायर समझने और एज टेबल को नोड टेबल से कनेक्ट करने में मदद मिलती है.
प्रॉपर्टी ग्राफ़ बनाना
अब इन टेबल को एक साथ जोड़कर, एक ही तरह के ग्राफ़ स्ट्रक्चर में रखा जाता है. इसे restaurant.bombod कहा जाता है.
आपको यह तय करना है:
- नोड:
item,location,itemlocation - किनारे:
makes,stored_at, औरconsists_of(बीओएम)
%%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. सप्लाई चेन को विज़ुअलाइज़ करना
पूरी सप्लाई चेन नेटवर्क देखने के लिए, टॉप-डाउन ट्रैवर्सल क्वेरी चलाई जा सकती है. यह सुविधा देने वाले स्टैंडर्ड नोटबुक या यूज़र इंटरफ़ेस (जैसे, %%bigquery --graph) में, यह विज़ुअल मैप दिखाता है.
नोड और एज सेटअप करने के लिए, ऐब्सलूट ग्राफ़ क्वेरी का इस्तेमाल करें.
ध्यान दें: जैसा कि पहले बताया गया है, Google Colab या Colab Enterprise Notebooks में इसे लागू करने के लिए, BigQuery मैजिक कमांड का भी इस्तेमाल किया जा सकता है: %%bigquery. साथ ही, Google Colab या Colab Enterprise Notebooks में ग्राफ़ को विज़ुअलाइज़ करने के लिए, –graph फ़्लैग को इस तरह शामिल करें: %%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
आउटपुट:

7. इस्तेमाल का पहला उदाहरण: अपस्ट्रीम की शिकायत को ट्रैक करना
स्थिति: न्यूयॉर्क के स्टोर में एक ग्राहक ने अपने सैंडविच में मौजूद चिकन की क्वालिटी के बारे में शिकायत की. असेंबल किए गए आइटम के शुरुआती चरणों को देखने के लिए, आपको आइटम को पीछे की ओर ट्रेस करना होगा.
ट्रैवर्सल क्वेरी
Graph Traversal क्वेरी फ़ॉर्मैट का इस्तेमाल करके क्वेरी चलाएं. इससे consists_of के उन किनारों को देखा जाता है जो अपस्ट्रीम के कॉम्पोनेंट से लेकर डाउनस्ट्रीम की असेंबलियों तक के कॉम्पोनेंट से जुड़े होते हैं.
%%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 Table (Ingredient -> Finished) में ऐरो की दिशा की वजह से, अपस्ट्रीम में की गई खोज से ऐसे लिंक तुरंत मिलते हैं जो निर्भरता वाले कॉन्टेंट और स्टोरेज की जगहों को अलग करते हैं.
आउटपुट: 
8. इस्तेमाल का दूसरा उदाहरण: असर का विश्लेषण
स्थिति: बर्फ़ीले तूफ़ान की वजह से, कोलंबस, ओहायो में डिस्ट्रिब्यूशन सेंटर बंद हो गया है. आपको यह जानना है कि इससे, तैयार किए जा रहे या तैयार हो चुके कौनसे सामान पर तुरंत असर पड़ा है.
ट्रैवर्सल क्वेरी
आपको डिस्ट्रिब्यूशन सेंटर को दिखाने वाले location से शुरुआत करनी होगी. इसके बाद, वहां मौजूद इन्वेंट्री की पहचान करनी होगी. साथ ही, यह देखना होगा कि कौनसे तैयार प्रॉडक्ट के लिए इनकी ज़रूरत है.
# @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
आउटपुट: 
9. इस्तेमाल का तीसरा उदाहरण: डाउनस्ट्रीम रीकॉल
स्थिति: किसी सप्लायर ने आपको बताया कि उसके पके हुए टमाटर के किसी बैच में मिलावट हुई है. आपको कैफ़े में मौजूद, मेन्यू के उन सभी आइटम का पता लगाना होगा जिन पर असर पड़ा है.
ट्रैवर्सल क्वेरी
दूषित कच्चे की जगह का पता लगाया जाता है. इसके बाद, डाउनस्ट्रीम में पाथ ट्रैवर्सल किया जाता है, ताकि उन आइटम का पता लगाया जा सके जिन पर इसका असर पड़ा है.
%%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
इस क्वेरी से, ‘Tomato' से पैटर्न मैच करने वाले सभी आइटम का पता चलता है. साथ ही, यह अपस्ट्रीम रिलेशनशिप से जुड़ा है. इससे यह पता लगाने में मदद मिलती है कि किन कैफ़े आइटम को वापस मंगाना है.
आउटपुट: 
10. क्लीन अप करें
वॉकथ्रू के चरणों को पूरा करने के बाद, संसाधनों को मिटा दें. इससे आपके वर्कस्पेस में कोई भी शुल्क नहीं लगेगा.
DROP SCHEMA `restaurant` CASCADE;
11. नतीजा
बधाई हो! आपने BigQuery Graph का इस्तेमाल करके, सप्लाई चेन को मॉडल किया है और उसके असर का विश्लेषण किया है.
आखिर में खास जानकारी
आपने इन चीज़ों के बारे में जाना:
- प्राइमरी/फ़ॉरेन की की मदद से, ग्राफ़ के हिसाब से रिलेशनल रिलेशनशिप तय करें.
- यूनीफ़ाइड प्रॉपर्टी ग्राफ़ बनाएं.
- ग्राफ़ क्वेरी ट्रैवर्सल लॉजिक का इस्तेमाल करके, एक से ज़्यादा नोड के बीच के संबंधों को आसानी से नेविगेट करें.
ग्राफ़ के आर्किटेक्चर के बारे में ज़्यादा जानकारी पाने के लिए, Google Cloud के दस्तावेज़ पढ़ें.