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

पारंपरिक रिलेशनल मॉडल में, आइटम को कई चरणों (सप्लायर -> डीसी -> कमिसरी -> स्टोर -> तैयार आइटम) में ट्रैक करने के लिए, JOIN के कई चरणों वाली मुश्किल कार्रवाइयां करनी पड़ती हैं. BigQuery Graph की मदद से, हम इन कनेक्शन को सीधे तौर पर मॉडल करते हैं. इससे ISO GQL (Graph Query Language) स्टैंडर्ड का इस्तेमाल करके, क्वेरी को आसानी से और तेज़ी से किया जा सकता है.
आपको क्या सीखने को मिलेगा
- मौजूदा 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 को चालू करने के लिए, यह कमांड चलाएं:
gcloud services enable bigquery.googleapis.com \
bigqueryreservation.googleapis.com
BigQuery के लिए आरक्षण और असाइनमेंट बनाना
GQL क्वेरी चलाने के लिए, आपके पास Enterprise या Enterprise Plus एडिशन का इस्तेमाल करने वाला आरक्षण होना चाहिए. Cloud Shell में, Enterprise Edition के लिए, ऑटोस्केलिंग की सुविधा वाला आरक्षण बनाएं:
# 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. स्कीमा और टेबल बनाना
आपको एक डेटासेट और टेबल बनाने होंगे. इनमें, आपकी सप्लाई चेन के कॉम्पोनेंट शामिल होंगे:
item: आइटम की सामान्य जानकारी (उदाहरण के लिए, टमाटर, चिकन).location: सुविधाएं (सप्लायर, डिस्ट्रिब्यूशन सेंटर, कैफ़े).itemlocation: इन्वेंट्री की जगहों की जानकारी देने वाली इंटरसेक्शन टेबल.bom: बिल ऑफ़ मटीरियल (वज़न के संबंध तय करता है. उदाहरण के लिए, आइटम A, आइटम B में शामिल है).makes:itemlocationकोitemसे मैप करता है.stored_at:itemlocationकोlocationसे मैप करता है.
डेटासेट बनाना
इस लैब में, एसक्यूएल कमांड को Cloud Shell या BigQuery Console का इस्तेमाल करके चलाया जा सकता है.
BigQuery Console का इस्तेमाल करने के लिए:
- 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(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. सप्लाई चेन को विज़ुअलाइज़ करना
पूरी सप्लाई चेन नेटवर्क देखने के लिए, टॉप-डाउन ट्रैवर्सल क्वेरी चलाई जा सकती है. किसी स्टैंडर्ड नोटबुक या यूज़र इंटरफ़ेस (यूआई) में, जो इसे सपोर्ट करता है (जैसे, %%bigquery --graph), इससे विज़ुअल मैप मिलता है.
नोड और एज सेटअप करने के लिए, ऐब्सलूट ग्राफ़ क्वेरी का इस्तेमाल करें.
ध्यान दें: जैसा कि पहले बताया गया है, Google Colab या Colab Enterprise Notebook में इसे चलाने के लिए, BigQuery के मैजिक कमांड का भी इस्तेमाल किया जा सकता है: %%bigquery इसके अलावा, Google Colab या Colab Enterprise Notebook में ग्राफ़ को विज़ुअलाइज़ करने के लिए, –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. इस्तेमाल का पहला उदाहरण: अपस्ट्रीम की शिकायत को ट्रैक करना
परिदृश्य: न्यूयॉर्क के स्टोर में, एक ग्राहक ने अपने सैंडविच में चिकन की क्वालिटी को लेकर शिकायत की है. आपको तैयार आइटम को पीछे की ओर ट्रैक करना होगा, ताकि उसके असेंबली के तुरंत बाद के चरणों को देखा जा सके.
ट्रैवर्सल क्वेरी
ग्राफ़ ट्रैवर्सल क्वेरी फ़ॉर्मैट का इस्तेमाल करके, क्वेरी चलाएं. इससे, 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 एज टेबल (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
इस क्वेरी से, उन सभी आइटम का पता चलता है जो ‘टमाटर’ से पैटर्न मैच करते हैं. साथ ही, यह अपस्ट्रीम रिलेशनशिप से जुड़ा होता है. इससे, यह एक पावरफ़ुल मैपिंग बन जाती है, जिससे यह पता चलता है कि कैफ़े के किन आइटम को रिकॉल करना होगा.
आउटपुट: 
10. स्टोरेज में जगह बनाएं
वॉकेट थ्रू के चरणों को पूरा करने के बाद, संसाधनों को मिटाएं, ताकि आपके वर्कस्पेस में कोई शुल्क न लगे.
DROP SCHEMA `restaurant` CASCADE;
11. नतीजा
बधाई हो! आपने BigQuery Graph का इस्तेमाल करके, सप्लाई चेन का मॉडल बनाया है और असर का विश्लेषण किया है.
आखिर में खास जानकारी
आपने इन चीज़ों के बारे में जानकारी पाई:
- प्राइमरी/फ़ॉरेन की का इस्तेमाल करके, ग्राफ़-सेंट्रिक रिलेशनल रिलेशनशिप तय करना.
- एक यूनिफ़ाइड प्रॉपर्टी ग्राफ़ बनाना.
- ग्राफ़ क्वेरी ट्रैवर्सल लॉजिक का इस्तेमाल करके, मल्टी-नोड रिलेशनशिप को आसानी से नेविगेट करना.
ग्राफ़ आर्किटेक्चर के बारे में ज़्यादा जानकारी पाने के लिए, Google Cloud के दस्तावेज़ पर जाएं.