BigQuery Graph Measures का इस्तेमाल शुरू करना

1. खास जानकारी

कोड की समीक्षा के बाद भी मौजूद रहने वाले ज़्यादातर SQL बग, एग्रीगेशन बग होते हैं. टेबल में मौजूद कोई संख्या सही है, जॉइन करने पर वह कॉपी हो जाती है, और कुल संख्या गलत हो जाती है.

BigQuery Graph की मदद से, अपनी टेबल को प्रॉपर्टी ग्राफ़ के तौर पर एक बार कनेक्ट किया जा सकता है. इसके बाद, कनेक्शन के बारे में क्वेरी की जा सकती है. ग्राफ़ मेज़र, उस ब्यौरे में एक और चीज़ जोड़ते हैं: एग्रीगेशन. MEASURE(SUM(streams)) को उस नोड पर सेट किया जाता है जिसके पास नंबर होता है. साथ ही, ग्राफ़ को पढ़ने वाली हर क्वेरी को सही समय पर सही कुल संख्या मिलती है. इसमें न तो GROUP BY का कोई ट्रिक इस्तेमाल किया जाता है और न ही कोई ऐसा CTE होता है जिसे किसी को याद रखना पड़े.

इस कोडलैब में, पांच टेबल वाला एक म्यूज़िक कैटलॉग बनाया जाता है. इसमें एक मेज़र जोड़ा जाता है. साथ ही, एक ही सवाल के दो अलग-अलग जवाब मिलते हैं: SUM के साथ 12.6 अरब और AGG के साथ 5.1 अरब. यह गैप, कैटलॉग का आकार होता है. ग्राफ़ को फ़्लैट करने पर, चार प्लेलिस्ट में मौजूद एक गाना चार लाइनों में बदल जाता है. साथ ही, SUM उन सभी को जोड़ देता है. इसके बाद, आपको उन नियमों के बारे में पता चलता है जिनकी वजह से दूसरा जवाब सही है.

एक गाने की लाइन को चार प्लेसमेंट लाइनों में कॉपी किया गया है: SUM, कॉपी की गई लाइनों को जोड़ता है. वहीं, AGG, song_id के हिसाब से लाइनों को छोटा करता है

यहां आपको कुछ टाइप करना होगा

इस लैब में, इन दो जगहों का इस्तेमाल किया जाता है:

कहां

वहां क्या किया जाता है

1

Cloud Shell टर्मिनल

सेटअप चरण में सिर्फ़ कुछ कमांड

2

BigQuery कंसोल

अन्य सभी कार्रवाइयां: क्वेरी एडिटर में क्वेरी चिपकाना, ग्राफ़ मॉडलर पर क्लिक करना, एजेंट से चैट करना

हर निर्देश को टैग किया जाता है, ताकि आपको हमेशा पता रहे कि इसका क्या मतलब है:

  • 👉💻 Cloud Shell — इसे Cloud Shell टर्मिनल में टाइप करें.
  • 👉📋 क्वेरी एडिटर — इसे BigQuery क्वेरी एडिटर में चिपकाएं और चलाएं पर क्लिक करें.
  • 👉🌐 Console — BigQuery कंसोल में क्लिक करके देखें. जब तक चरण में ऐसा करने के लिए न कहा जाए, तब तक कुछ भी टाइप न करें.
  • 👀 — नतीजे देखें.

आपको क्या सीखने को मिलेगा

  • विज़ुअल ग्राफ़ मॉडलर या एसक्यूएल में, नोड टेबल पर मेज़र का एलान करने का तरीका
  • GRAPH_EXPAND किसी ग्राफ़ को एक बड़ी टेबल में कैसे बदलता है
  • AGG ही एक ऐसा फ़ंक्शन क्यों है जो मेज़र को पढ़ सकता है. साथ ही, अन्य फ़ंक्शन मेज़र को पढ़ने की कोशिश करने पर क्या जवाब देते हैं
  • किसी मेज़र के लिए छह एग्रीगेट और उनके बीच गणितीय कार्रवाई करने का तरीका
  • एक मेज़रमेंट, बिना किसी बदलाव के अलग-अलग ग्रुप किए गए सवाल का जवाब कैसे देता है
  • ज़रूरी नहीं: GQL और Graph टैब, किसी ऐसे सवाल का जवाब कैसे देते हैं जिसका जवाब कुल मिलाकर नहीं दिया जा सकता. साथ ही, BigQuery डेटा एजेंट, आपकी मेज़रमेंट का इस्तेमाल कैसे करता है, जबकि उसे इसके बारे में बताया नहीं गया है

आपको किन चीज़ों की ज़रूरत होगी

  • बिलिंग की सुविधा वाला Google खाता और ब्राउज़र. आपको पहले से Google Cloud प्रोजेक्ट की ज़रूरत नहीं है. सेटअप के दौरान, आपके लिए एक प्रोजेक्ट बना दिया जाता है.
  • सिर्फ़ चैट वाले वैकल्पिक चरण के लिए: Gemini Data Analytics API चालू होना चाहिए. साथ ही, आपके पास Gemini Data Analytics Data Agent Creator की भूमिका होनी चाहिए.

आपके कंप्यूटर पर कुछ भी इंस्टॉल नहीं किया जाएगा. यह सब Cloud Shell और BigQuery कंसोल में होता है.

प्रॉडक्ट का स्टेटस और लागत

BigQuery Graph अब सामान्य तौर पर उपलब्ध है. ग्राफ़ मेज़र, विज़ुअल ग्राफ़ मॉडलर, ग्राफ़ विज़ुअलाइज़ेशन, और डेटा एजेंट के नॉलेज सोर्स के तौर पर ग्राफ़ का इस्तेमाल करने की सुविधा प्रीव्यू में है. इन पर Pre-GA Offerings की शर्तें लागू होती हैं.

GRAPH_EXPAND और AGG, मांग के हिसाब से तय की गई कीमत के तहत काम करते हैं. दस्तावेज़ के मुताबिक, GQL क्वेरी (पाथ का वैकल्पिक चरण) के लिए, Enterprise या Enterprise Plus वर्शन का इस्तेमाल करने वाला आरक्षण ज़रूरी है. इसलिए, यह चरण वैकल्पिक है.

डेटासेट कुछ किलोबाइट का है. मांग के हिसाब से तय की गई कीमत के तहत, हर क्वेरी के लिए कम से कम 10 एमबी का शुल्क लिया जाता है. इसलिए, इस पूरे कोडलैब की कीमत एक सेंट से भी कम है.

2. सेटअप

यह सिर्फ़ ऐसा चरण है जिसमें Cloud Shell का इस्तेमाल किया जाता है. यह एक प्रोजेक्ट बनाता है, उस पर बिलिंग की सुविधा चालू करता है, और रॉ टेबल बनाता है. इसके बाद, BigQuery कंसोल में जाकर, ग्राफ़, मेज़र, और हर क्वेरी को चलाया जा सकता है.

इस लैब में आपको एक चीज़ नहीं मिलेगी: बिलिंग की सुविधा वाला Google Cloud प्रोजेक्ट. पहले चरण में, आपको एक ऐसा खाता मिलता है जिससे पेमेंट किया जा सकता है. चौथे चरण में, उस खाते को प्रोजेक्ट में बदल दिया जाता है. इन्हें इसी क्रम में करें. चौथे चरण के बाद के हर चरण में, चौथे चरण में बनाए गए प्रोजेक्ट को पढ़ा जाता है.

1 · बिलिंग की सुविधा वाला खाता पाएं (~1 मिनट)

👉🌐 सबसे पहले यह काम करें. उस Google खाते से साइन इन करें जिसमें बिलिंग की सुविधा चालू हो. इस तरह का कोई भी खाता काम करता है. अगर आपके पास ऐसा खाता नहीं है, तो बिना किसी शुल्क के आज़माएं. इससे आपको एक बिलिंग खाता मिलेगा. चौथे चरण के लिए यही ज़रूरी है.

2 · Cloud Shell खोलें (~1 मिनट)

👉🌐 Console — Google Cloud Console में सबसे ऊपर मौजूद, Cloud Shell चालू करें पर क्लिक करें — यह हेडर में टर्मिनल के आकार का आइकॉन होता है. पेज के सबसे नीचे एक टर्मिनल खुलता है.

Google Cloud Console के हेडर से Cloud Shell चालू करें

👉🌐 Console — अगर आपको आज किसी भी समय अनुमति देने के लिए कहा जाता है, तो जारी रखने के लिए अनुमति दें पर क्लिक करें.

👉💻 Cloud Shell — देखें कि Cloud Shell में किस खाते से साइन इन किया गया है:

gcloud auth list

👀 देखें कि आपके खाते को * के तौर पर मार्क किया गया हो. साथ ही, यह वही खाता होना चाहिए जिससे आपने पहले चरण में साइन इन किया था. अगर ऐसा नहीं है, तो gcloud auth login चलाएं और सही विकल्प चुनें.

3 · लैब पाएं (~1 मिनट)

👉💻 Cloud Shell — repo को क्लोन करें:

cd ~
rm -rf ~/bq-graph-measures-lab
git clone https://github.com/cuppibla/bq-graph-measures-lab.git
cd ~/bq-graph-measures-lab

4 · अपना प्रोजेक्ट बनाएँ (~2 मिनट)

👉💻 Cloud Shell — यह स्क्रिप्ट, आपके बिलिंग खाते का पता लगाती है, उस पर एक प्रोजेक्ट बनाती है, और Cloud Shell को उस प्रोजेक्ट पर ले जाती है:

cd ~/bq-graph-measures-lab
./setup_project.sh

👀 उम्मीद है कि आपको चुने गए बिलिंग खाते के लिए ✓, बनाए गए प्रोजेक्ट के लिए ✓, और इस तरह का जवाब मिलेगा:

Project ready: bq-graph-4271
  Next:  ./setup.sh

bq-graph-4271 आपका प्रोजेक्ट आईडी है. आपके प्रोजेक्ट आईडी में अलग-अलग अंक होंगे. इसमें ये चार काम होते हैं:

बिलिंग

अगर आपके पास नया [YYYY-MM-DD] GDP Credit: खाता है, तो उसे इस्तेमाल करता है. अगर आपके पास नया खाता नहीं है, तो किसी भी खुले हुए बिलिंग खाते का इस्तेमाल करता है

project

bq-graph-XXXX खाता बनाता है और उस बिलिंग खाते को उससे लिंक करता है

selects

यह कुकी, आईडी को ~/project_id.txt में लिखती है और gcloud config set project को चलाती है. इसलिए, इसके बाद आपसे आईडी टाइप करने के लिए नहीं कहा जाता

waits

जब तक नए प्रोजेक्ट को विज्ञापन दिखाने की अनुमति नहीं मिल जाती, तब तक दो मिनट तक पोल दिखाए जाते हैं

🌐 अब यही प्रोजेक्ट कंसोल में मौजूद है. इसका आईडी, डैशबोर्ड पर मौजूद प्रोजेक्ट की जानकारी कार्ड में दिखता है:

कंसोल के डैशबोर्ड पर मौजूद आपका प्रोजेक्ट आईडी

5 · डेटासेट बनाएं (~3 मिनट)

👉💻 Cloud Shell — एक और स्क्रिप्ट टेबल बनाती है:

cd ~/bq-graph-measures-lab
./setup.sh

स्क्रिप्ट के चलने पर, हर चरण प्रिंट होता है. यह इन कामों को इस क्रम में करता है:

project

gcloud config से प्रोजेक्ट को पढ़ता है और प्रोजेक्ट के बिना आगे बढ़ने से मना करता है

एपीआई

bigquery.googleapis.com को चालू करता है

डेटासेट

यह अमेरिका के एक से ज़्यादा इलाकों वाले डेटासेट में music डेटासेट और पांच टेबल बनाता है. हर टेबल में PRIMARY KEY ... NOT ENFORCED होता है

check

यह हर टेबल में मौजूद लाइनों की संख्या गिनता है और अगर कोई संख्या गलत होती है, तो यह प्रोसेस बंद हो जाती है

👀 अनुमानित:

BigQuery Graph Measures · setup
  ✓ project: bq-graph-4271
  ✓ BigQuery API enabled

Creating dataset music (US) and five tables...
  ✓ music.Labels              2 rows
  ✓ music.Artists             3 rows
  ✓ music.Songs               5 rows
  ✓ music.Playlists           4 rows
  ✓ music.PlaylistEntries    10 rows

🎉 ready — open BigQuery Studio: https://console.cloud.google.com/bigquery?project=bq-graph-4271

आपने Cloud Shell का इस्तेमाल कर लिया है. इसे बंद किया जा सकता है.

6 · BigQuery और क्वेरी एडिटर खोलना

👉🌐 Console — आउटपुट के आखिर में मौजूद लिंक पर क्लिक करें या नेविगेशन मेन्यू से BigQuery खोलें. बाईं ओर मौजूद एक्सप्लोरर पैनल में, अपने प्रोजेक्ट को बड़ा करें: पांच टेबल वाला music डेटासेट.

एक्सप्लोरर पैन, संगीत बड़ा किया गया: कलाकार, लेबल, प्लेलिस्ट एंट्री, प्लेलिस्ट, गाने

👉🌐 Console — BigQuery Studio में सबसे ऊपर, नया बनाएं लाइन में, एसक्यूएल क्वेरी पर क्लिक करें. इससे एक खाली एडिटर टैब खुलता है.

एसक्यूएल क्वेरी की मदद से नई लाइन बनाएं और उसके नीचे मौजूद खाली एडिटर टैब

इस टैब को सेव रखें. इस लैब में मौजूद हर 👉📋 ब्लॉक यहां जाता है: एडिटर में मौजूद कॉन्टेंट को चुनें. इसके बाद, नया ब्लॉक चिपकाएं और चलाएं पर क्लिक करें. नतीजा, नीचे मौजूद पैनल में दिखता है.

टेबल के बारे में जानकारी

इन टेबल के बारे में दो बातें बाद में काम आएंगी. हर टेबल अपनी प्राइमरी कुंजी को NOT ENFORCED के तौर पर दिखाती है: BigQuery इसकी जांच नहीं करता. हालांकि, आपको जिस प्रॉपर्टी ग्राफ़ को बनाना है उसके लिए, यह जानना ज़रूरी है कि किसी लाइन की पहचान कैसे की जाती है. आखिरी टेबल, PlaylistEntries, एक जंक्शन टेबल है: इसमें चार प्लेलिस्ट में मौजूद गाने के लिए चार लाइनें हैं. इस टेबल में ही पूरी जानकारी मौजूद होती है.

टेबल इस तरह से एक-दूसरे से जुड़ी होती हैं: लेबल कलाकारों के साथ साइन करता है, कलाकार गाने रिलीज़ करता है, और PlaylistEntries के ज़रिए किसी गाने को प्लेलिस्ट में शामिल किया जाता है. Cymbal Records के पास Ava Sterling और Mina Okafor के साथ-साथ उनके चार गानों का मालिकाना हक है. Northwind Audio, काई नाकामुरा का चैनल है. इसमें एक गाना है, जिसका नाम Midnight Drive है.

टेबल

पंक्तियां

बटन

इसमें क्या-क्या शामिल है

लेबल

2

label_id

नाम, मार्केटिंग बजट

कलाकार

3

artist_id

नाम, कौनसे लेबल

गाने

5

song_id

टाइटल, कलाकार का नाम, स्ट्रीम

प्लेलिस्ट

4

playlist_id

नाम, फ़ॉलोअर

PlaylistEntries

10

entry_id

कौनसा गाना किस प्लेलिस्ट में है

✅ चेकपॉइंट: 🎉 ready Cloud Shell में, एक्सप्लोरर में music के नीचे पांच टेबल, और एक खाली क्वेरी एडिटर टैब खुला है.

3. ग्राफ़ बनाना — विकल्प A: विज़ुअल मॉडलर

प्रॉपर्टी ग्राफ़ से पता चलता है कि टेबल कैसे कनेक्ट होती हैं. इसे विज़ुअल ग्राफ़ मॉडलर में एक साथ क्लिक किया जा सकता है (यह चरण, सभी क्लिक) या इसे एसक्यूएल के तौर पर लिखा जा सकता है (अगला चरण, एक बार में चिपकाएं). दोनों से एक ही ऑब्जेक्ट बनता है. इसलिए, दोनों में से किसी एक का इस्तेमाल करें.

1. ग्राफ़ का शेल बनाना

👉🌐 Console — BigQuery Studio में, नया बनाएं लाइन में, एआई और जानकारी मेन्यू खोलें. इसके बाद, ग्राफ़ पर क्लिक करें.

👉🌐 Console — ग्राफ़ का नाम के तौर पर MusicGraph और डेटासेट में ग्राफ़ की जगह के तौर पर music डालें. डेटासेट (अमेरिका) से क्षेत्र की जानकारी अपने-आप भर जाती है.

👉🌐 Console — डेटा सोर्स में जाकर, पांच टेबल चुनें — कलाकार, लेबल, प्लेलिस्ट में शामिल किए गए गाने, प्लेलिस्ट, गाने — और बनाएं पर क्लिक करें.

मॉडलर ने पेज बनाया: ग्राफ़ का नाम MusicGraph, डेटासेट music, पांच टेबल पर सही का निशान लगाया गया

👀 कैनवस, पांच रंगीन नोड के साथ खुलता है. इनके बीच कोई लाइन नहीं होती. दाईं ओर मौजूद जानकारी पैनल में, नोड (5) और एज (0) की सूची दी गई है. हर नोड में, टेबल की प्राइमरी कुंजी और उसके सभी कॉलम पहले से ही प्रॉपर्टी के तौर पर मौजूद होते हैं. इन्हें देखने के लिए, किसी भी नोड पर क्लिक करें.

पांच नोड वाला कैनवस. इसमें नोड (5) / एज (0) दिखाने वाला जानकारी पैनल मौजूद है

2. चारों किनारों को बनाएं

किनारा एक फ़ॉरेन की है, जिसे बनाया गया है. हर एक, उस टेबल से शुरू होता है जिसमें कुंजी होती है और उस टेबल पर खत्म होता है जिस पर वह पॉइंट करता है.

👉🌐 Console — New edge पर क्लिक करें. टेबल चुनें डायलॉग बॉक्स में, PlaylistEntries को चुनें और जोड़ें पर क्लिक करें. किनारा जोड़ें पैनल में:

  1. नाम को EntryToSong पर सेट करें.
  2. प्राइमरी पासकोड जोड़ें पर क्लिक करें और entry_id को स्वीकार करें.
  3. सोर्स में जाकर, सोर्स नोड को PlaylistEntries पर सेट करें. इसके बाद, नोड में रेफ़र किए गए कॉलम जोड़ें और एज पर रेफ़र किए गए कॉलम जोड़ें का इस्तेमाल करके, दोनों के लिए entry_id चुनें.
  4. टारगेट में जाकर, टारगेट नोड को गाने पर सेट करें. इसके बाद, नोड में रेफ़र किए गए कॉलम और एज पर रेफ़र किए गए कॉलम, दोनों के लिए song_id चुनें.
  5. हो गया पर क्लिक करें.

EntryToSong के लिए, 'ऐड एज पैनल' भरा गया

👉🌐 Console — इसे तीन बार और दोहराएं:

एज का नाम

टेबल

सोर्स नोड → टारगेट नोड

दोनों तरफ़ से चुनने के लिए कॉलम

EntryToPlaylist

PlaylistEntries

PlaylistEntries → Playlists

सोर्स entry_id, टारगेट playlist_id

SongToArtist

गाने

गाने → कलाकार

सोर्स song_id, टारगेट artist_id

ArtistToLabel

कलाकार

कलाकार → लेबल

सोर्स artist_id, टारगेट label_id

हर किनारे को बिना किसी अतिरिक्त प्रॉपर्टी के छोड़ दें.

👀 अब जानकारी वाले पैनल में किनारे (4) लिखा है. साथ ही, कैनवस में चेन दिख रही है: लेबल ← कलाकार ← गाने ← प्लेलिस्ट की एंट्री → प्लेलिस्ट.

पांच नोड और चार किनारों वाला कैनवस. इसमें किनारों (4) की जानकारी दिख रही है

3. मेज़र जोड़ना

👉🌐 Console — Songs नोड पर क्लिक करें. इसके बाद, 'जानकारी' पैनल में सबसे ऊपर मौजूद, बदलाव करें (पेंसिल) आइकॉन पर क्लिक करें. लेबल की प्रॉपर्टी में जाकर, प्रॉपर्टी जोड़ें पर क्लिक करें. इसके बाद, फ़ील्ड जोड़ें पर क्लिक करें.

👉🌐 कंसोल — total_streams को फ़ील्ड का नाम के तौर पर डालें. इसके बाद, एक्सप्रेशन बॉक्स में यह टाइप करें:

MEASURE(SUM(streams))

👉🌐 Console — जोड़ें पर क्लिक करें. इसके बाद, हो गया पर क्लिक करें.

नई प्रॉपर्टी कार्ड: फ़ील्ड का नाम total_streams, एक्सप्रेशन MEASURE(SUM(streams))

4. इसके लिखे गए कोड को पढ़ें. इसके बाद, उसे पब्लिश करें

👉🌐 Console — दाईं ओर मौजूद पैनल में, कोड टैब खोलें. मॉडलर ने आपके लिए CREATE PROPERTY GRAPH स्टेटमेंट लिखा है. गाने वाले नोड पर जाएं: इसकी प्रॉपर्टी लिस्ट अब इस पर खत्म होती है

MEASURE(SUM(streams)) AS `total_streams`

यह सुविधा, एक लाइन में पूरी जानकारी देती है. इस चरण के बाद, यह बताया गया है कि उस लाइन का क्या काम है.

कोड टैब में, 'गाने' नोड पर स्क्रोल किया गया है. इसमें MEASURE(SUM(streams)) AS total_streams दिख रहा है

👉🌐 Console — पब्लिश करें पर क्लिक करें.

✅ चेकपॉइंट: एक्सप्लोरर में, music में अब ग्राफ़ फ़ोल्डर है. इसमें MusicGraph मौजूद है. इस पर क्लिक करें: पांच नोड, चार किनारे, और कोड टैब में MEASURE(SUM(streams)) लाइन. अगले चरण को छोड़ें और SUM और AGG फ़ंक्शन का एक साथ इस्तेमाल करना पर जाएं.

4. ग्राफ़ बनाना — दूसरा विकल्प: एसक्यूएल

अगर आपने मॉडलर में ग्राफ़ बनाया है, तो इस चरण को छोड़ दें.

👉📋 क्वेरी एडिटर — चिपकाएं और फिर चलाएं पर क्लिक करें:

CREATE OR REPLACE PROPERTY GRAPH music.MusicGraph
  NODE TABLES (
    music.Labels KEY (label_id)
      PROPERTIES (label_id, label_name, marketing_budget,
        MEASURE(SUM(marketing_budget)) AS total_budget),
    music.Artists KEY (artist_id)
      PROPERTIES (artist_id, artist_name, label_id,
        MEASURE(COUNT(artist_id)) AS artist_count),
    music.Songs KEY (song_id)
      PROPERTIES (song_id, title, artist_id, streams,
        MEASURE(SUM(streams))   AS total_streams,
        MEASURE(COUNT(song_id)) AS song_count),
    music.Playlists KEY (playlist_id)
      PROPERTIES (playlist_id, playlist_name, followers,
        MEASURE(SUM(followers)) AS total_followers),
    music.PlaylistEntries KEY (entry_id)
      PROPERTIES (entry_id, playlist_id, song_id,
        MEASURE(COUNT(entry_id)) AS placement_count)
  )
  EDGE TABLES (
    music.PlaylistEntries AS EntryToSong
      SOURCE KEY (entry_id) REFERENCES PlaylistEntries(entry_id)
      DESTINATION KEY (song_id) REFERENCES Songs(song_id) NO PROPERTIES,
    music.PlaylistEntries AS EntryToPlaylist
      SOURCE KEY (entry_id) REFERENCES PlaylistEntries(entry_id)
      DESTINATION KEY (playlist_id) REFERENCES Playlists(playlist_id) NO PROPERTIES,
    music.Songs AS SongToArtist
      SOURCE KEY (song_id) REFERENCES Songs(song_id)
      DESTINATION KEY (artist_id) REFERENCES Artists(artist_id) NO PROPERTIES,
    music.Artists AS ArtistToLabel
      SOURCE KEY (artist_id) REFERENCES Artists(artist_id)
      DESTINATION KEY (label_id) REFERENCES Labels(label_id) NO PROPERTIES
  )

👀 नतीजों के पैनल में, प्रॉपर्टी ग्राफ़ बनाने की जानकारी दिखती है.

एडिटर में CREATE PROPERTY GRAPH स्टेटमेंट और उसके नीचे सफलता का मैसेज

इसे एक बार पढ़ें

ग्राफ़ में पांच नोड टेबल और चार एज टेबल हैं. हर नोड टेबल में, उसके KEY का नाम होता है और उसके PROPERTIES की सूची होती है. MEASURE से शुरू होने वाली लाइनें, नया हिस्सा हैं: इनमें से हर लाइन, किसी प्रॉपर्टी के चारों ओर काम करने वाले एग्रीगेट में से किसी एक को रैप करती है और उसे एक एलियास देती है. यह एलियास देना ज़रूरी है.

हर एज टेबल एक फ़ॉरेन की होती है. इसे इस तरह से लिखा जाता है: SOURCE KEY उस टेबल पर जो कुंजी को होल्ड करती है, DESTINATION KEY उस टेबल पर जो इसे पॉइंट करती है. NO PROPERTIES का मतलब है कि एज में कोई भी जानकारी नहीं है.

ध्यान दें कि PlaylistEntries तीन बार दिखता है: एक बार नोड टेबल के तौर पर और दो बार EntryToSong और EntryToPlaylist के किनारों के पीछे मौजूद फ़िज़िकल टेबल के तौर पर. ऐसा जान-बूझकर किया गया है. हम बाद में इसकी वजह बताएंगे.

देखें कि आपने क्या बनाया है

👉🌐 Console — एक्सप्लोरर पैन में, music को बड़ा करें. इसके बाद, Graphs को बड़ा करें और MusicGraph पर क्लिक करें. कैनवस पर ग्राफ़ पेज खुलता है. इसमें पांच नोड और चार किनारे हैं. किसी नोड की प्रॉपर्टी देखने के लिए, उस पर क्लिक करें. मेज़र को उनके एग्रीगेट के साथ सूची में शामिल किया जाता है. इमेज के पीछे मौजूद स्टेटमेंट देखने के लिए, कोड टैब खोलें.

MusicGraph पेज: बाईं ओर कैनवस और दाईं ओर कोड टैब

✅ चेकपॉइंट: music में Graphs फ़ोल्डर है, जिसमें MusicGraph मौजूद है. साथ ही, कोड टैब में MEASURE(SUM(streams)) AS total_streams दिखता है.

5. SUM और AGG, अगल-बगल में

यह पूरी कोडलैब एक क्वेरी में है. दोनों कॉलम में, एक ही टेबल से एक ही सवाल का जवाब देने की कोशिश की गई है. सवाल यह है कि हर लेबल के हिसाब से कुल स्ट्रीम कितनी हैं.

यह टेबल, GRAPH_EXPAND जनरेट करता है. यह ग्राफ़ को फ़्लैट करता है: यह एक टेबल से शुरू होता है और हर किनारे को LEFT JOIN के तौर पर बाहर की ओर तब तक फ़ॉलो करता है, जब तक कि कनेक्ट की गई हर टेबल एक ही चौड़े नतीजे में साथ-साथ न दिख जाए. हर प्लेसमेंट के लिए एक लाइन, न कि हर गाने के लिए एक लाइन. साथ ही, हर कॉलम का नाम TableLabel_property होना चाहिए. क्वेरी करने से पहले इसे देखें.

👉📋 क्वेरी एडिटर — चिपकाएं और फिर चलाएं पर क्लिक करें:

SELECT Labels_label_name, Songs_title, Songs_streams, Playlists_playlist_name
FROM GRAPH_EXPAND("music.MusicGraph")
ORDER BY Songs_title, Playlists_playlist_name

👀 उम्मीद है कि 10 लाइनें होंगी — PlaylistEntries में हर प्लेसमेंट के लिए एक लाइन. सेटअप ने भी इतनी ही लाइनें लोड की हैं. Neon Summer को चार प्लेलिस्ट में शामिल किया गया है. इसलिए, यह चार स्लॉट लेता है. हर प्लेलिस्ट में इसे Songs_streams बार सुना गया है. इन लाइनों में कोई गड़बड़ी नहीं है. प्लेलिस्ट की संख्या वाकई में चार है. हालांकि, अब किसी गाने से जुड़ा कॉलम, प्लेसमेंट से जुड़ी पंक्तियों में दोहराया जा रहा है. अगली क्वेरी में इसी समस्या को मेज़र किया जाता है.

अब तुलना करें.

👉📋 क्वेरी एडिटर — चिपकाएं और फिर चलाएं पर क्लिक करें:

SELECT
  Labels_label_name,
  SUM(Songs_streams)       AS with_sum,
  AGG(Songs_total_streams) AS with_agg
FROM GRAPH_EXPAND("music.MusicGraph")
GROUP BY 1 ORDER BY 1

👀 नतीजा:

Labels_label_name

with_sum

with_agg

Cymbal Records

12,60,00,00,000

5,100,000,000

Northwind Audio

9,000,000,000

4,500,000,000

नतीजे का ग्रिड: Cymbal Records के लिए, with_sum 12,600,000,000 और with_agg 5,100,000,000

मैन्युअल तरीके से इसकी जांच करें. Cymbal के चार गानों को 200 करोड़, 150 करोड़, 120 करोड़, और 40 करोड़ बार स्ट्रीम किया गया है. यह संख्या 510 करोड़ है. AGG सही है. SUM का साइज़ ढाई गुना ज़्यादा है. साथ ही, Northwind के एक गाने का साइज़ दोगुना हो गया है.

सिंटैक्स के तीन नए हिस्से

  • GRAPH_EXPAND("music.MusicGraph") एक टेबल-वैल्यूड फ़ंक्शन है. यह ग्राफ़ को एक बड़ी टेबल में बदलता है. इसके लिए, हर किनारे को LEFT JOIN के तौर पर इस्तेमाल करता है. हर कॉलम का नाम TableLabel_property है. इसलिए, Songs_streams, Songs टेबल का रॉ कॉलम है और Songs_total_streams, आपकी तय की गई मेज़र है.
  • SUM(Songs_streams) उस बड़ी टेबल पर सामान्य एसक्यूएल है. साथ ही, यह फ़्लैटनिंग से बने हर डुप्लीकेट को इनहेरिट करता है.
  • AGG(Songs_total_streams), मेज़र का आकलन उसी तरह करता है जिस तरह से उसे तय किया गया था: SUM(streams) हर song_id के लिए एक बार. इससे कोई फ़र्क़ नहीं पड़ता कि वाइड टेबल में किसी गाने की कितनी पंक्तियां हैं.

✅ चेकपॉइंट: दो लेबल, दो कॉलम, और with_agg की संख्या, हाथ की गिनती से मेल खाती है.

6. SUM फ़ंक्शन, गिनती ज़्यादा क्यों करता है

कोई गाना चुनें और देखें कि इन सुविधाओं का इस्तेमाल करने से गाने पर क्या असर पड़ता है.

👉📋 क्वेरी एडिटर — चिपकाएं और फिर चलाएं पर क्लिक करें:

SELECT 'BEFORE - the Songs table' AS step, title, streams, CAST(NULL AS STRING) AS playlist
FROM music.Songs WHERE title = 'Neon Summer'
UNION ALL
SELECT 'AFTER - joined to playlists', s.title, s.streams, pl.playlist_name
FROM music.Songs s
LEFT JOIN music.PlaylistEntries e ON e.song_id = s.song_id
LEFT JOIN music.Playlists pl ON pl.playlist_id = e.playlist_id
WHERE s.title = 'Neon Summer'
ORDER BY step DESC, playlist

👀 नतीजा:

चरण

title

स्ट्रीम

प्लेलिस्ट

BEFORE - the Songs table

नियॉन समर

2,000,000,000

शून्य

AFTER - joined to playlists

नियॉन समर

2,000,000,000

जिम पंप

AFTER - joined to playlists

नियॉन समर

2,000,000,000

अभी सबसे ज़्यादा लोकप्रिय

AFTER - joined to playlists

नियॉन समर

2,000,000,000

राइज़िंग पॉप

AFTER - joined to playlists

नियॉन समर

2,000,000,000

रोड ट्रिप

नतीजे का ग्रिड: एक BEFORE पंक्ति और चार AFTER पंक्तियां, सभी 2,000,000,000

एक लाइन चार लाइनों में बदल गई. स्ट्रीम की संख्या में कोई बदलाव नहीं हुआ — इसे कॉपी किया गया था. Cymbal Records के लिए, कॉपी किए गए गानों से मिले कुल स्ट्रीम की संख्या का हिसाब लगाएं: चार प्लेलिस्ट में Neon Summer को 200 करोड़ बार सुना गया, इसलिए इसे 8.0 पॉइंट मिले. दो प्लेलिस्ट में Paper Crown को 150 करोड़ बार सुना गया, इसलिए इसे 3.0 पॉइंट मिले. एक प्लेलिस्ट में Double Shot को 120 करोड़ बार सुना गया, इसलिए इसे 1.2 पॉइंट मिले. एक प्लेलिस्ट में Slow Arrow को 40 करोड़ बार सुना गया, इसलिए इसे 0.4 पॉइंट मिले. यह 12.6 अरब है, जो SUM के तौर पर दिखाया गया है. Northwind's Midnight Drive को दो प्लेलिस्ट में शामिल किया गया है.इसलिए, इसे 4.5 अरब बार सुना गया.

इसे फ़ैन-आउट कहा जाता है. यह जॉइन करने में हुई कोई गड़बड़ी नहीं है. प्लेलिस्ट की लाइनें असली हैं. इस गड़बड़ी में, किसी गाने की संख्या को उन सभी लाइनों में जोड़ दिया गया है जो प्लेसमेंट से जुड़ी हैं.

इस मेज़रमेंट से समस्या ठीक हो जाती है, क्योंकि इसे KEY (song_id) के साथ Songs नोड पर घोषित किया गया था. अनाज ही मुख्य चीज़ है. जब AGG फ़ंक्शन total_streams का आकलन करता है, तो यह हर गाने की कुंजी के हिसाब से एक बार एग्रीगेट करता है. इसके बाद, यह सिर्फ़ उस वैल्यू को रोल अप करता है जिसके हिसाब से आपने ग्रुप किया है.

क्या बदलाव हुए

आपने लिखा था

मेज़र के साथ

SUM(streams) हर उस क्वेरी में शामिल करें जिसके लिए इसकी ज़रूरत है

ग्राफ़ में MEASURE(SUM(streams)) एक बार

SUM(...) पर क्लिक करें

AGG(...) को इसे पढ़ने की अनुमति दें — और सिर्फ़ AGG

तीन JOIN

GRAPH_EXPAND(), एक फ़्लैट टेबल

एक सीटीई, जो जॉइन करने से पहले एग्रीगेट करता है

कुछ नहीं. KEY से ग्रेन तय होता है

✅ चेकपॉइंट: पांच लाइनें — एक पहले, चार बाद में — और इनसे 12.6 अरब आइटम फिर से बनाए जा सकते हैं.

7. नियम: सिर्फ़ एजीजी, मेज़र को पढ़ता है

मेज़र का अपना टाइप, MEASURE होता है. इसे सिर्फ़ एक फ़ंक्शन स्वीकार करता है. नीचे दी गई चार क्वेरी जान-बूझकर फ़ेल की गई हैं. हर क्वेरी को चलाएं और लाल रंग की गड़बड़ी पढ़ें. ये चार ऐसे तरीके हैं जिन्हें हर कोई सबसे पहले आज़माता है. इनके बारे में जानने से, बाद में समय बचता है.

👉📋 क्वेरी एडिटर — AGG किसी सामान्य कॉलम पर:

SELECT AGG(Songs_streams) FROM GRAPH_EXPAND("music.MusicGraph")

👀 No matching signature for aggregate function AGG ... Argument 1: expected MEASURE, found INT64

एडिटर के नीचे मौजूद लाल रंग की गड़बड़ी

👉📋 क्वेरी एडिटर — AGG के बिना मेज़र कॉलम:

SELECT Songs_total_streams FROM GRAPH_EXPAND("music.MusicGraph") LIMIT 1

👀 Returning expressions of type MEASURE is not allowed

एडिटर के नीचे मौजूद लाल रंग की गड़बड़ी

👉📋 क्वेरी एडिटर — यह GQL में दिया गया एक मेज़र है. इसमें कभी भी मेज़र नहीं दिखते (यह एक GQL क्वेरी है — खास जानकारी में बदलाव से जुड़ी सूचना देखें):

GRAPH music.MusicGraph
MATCH (s:Songs)
RETURN s.total_streams
LIMIT 1

👀 total_streams is not exposed by element type GRAPH_NODE(...)

एडिटर के नीचे मौजूद लाल रंग की गड़बड़ी

👉📋 क्वेरी एडिटर — SUM मेज़रमेंट कॉलम पर, जो सबसे ज़्यादा काम का है:

SELECT Labels_label_name, SUM(Songs_total_streams)
FROM GRAPH_EXPAND("music.MusicGraph")
GROUP BY 1

👀 MEASURE-typed arguments are only permitted in the AGG function

एडिटर के नीचे मौजूद लाल रंग की गड़बड़ी

इसलिए, टाइप सिस्टम आपके लिए इस नियम को लागू करता है. मेज़रमेंट सिर्फ़ GRAPH_EXPAND के ज़रिए दिखता है और इसे सिर्फ़ AGG के ज़रिए पढ़ा जा सकता है. पहले से ज़्यादा गिने गए 12.6 अरब, सिर्फ़ रॉ कॉलम को जोड़ने से मिल सकते हैं. मेज़र का गलत इस्तेमाल करने से कभी नहीं.

✅ चेकपॉइंट: चार लाल रंग की गड़बड़ियां हैं. साथ ही, यह बताया गया है कि हर गड़बड़ी किस नियम का उल्लंघन कर रही है.

8. हर एग्रीगेट, मेज़र का साथ देता है

MEASURE() में इन छह एग्रीगेट में से कोई एक शामिल होता है: SUM, AVG, MIN, MAX, COUNT, और COUNT(DISTINCT). गाने वाले नोड पर, सभी छह को शामिल करके ग्राफ़ फिर से बनाएं. किनारे NO PROPERTIES रहते हैं. जब कोई किनारा, नोड के साथ अपनी फ़िज़िकल टेबल शेयर करता है, तो यह सबसे सही तरीका होता है.

👉📋 क्वेरी एडिटर — चिपकाएं और फिर चलाएं पर क्लिक करें:

CREATE OR REPLACE PROPERTY GRAPH music.MusicGraph
  NODE TABLES (
    music.Labels KEY (label_id)
      PROPERTIES (label_id, label_name, marketing_budget,
        MEASURE(SUM(marketing_budget)) AS total_budget),
    music.Artists KEY (artist_id)
      PROPERTIES (artist_id, artist_name, label_id,
        MEASURE(COUNT(artist_id)) AS artist_count),
    music.Songs KEY (song_id)
      PROPERTIES (song_id, title, artist_id, streams,
        MEASURE(SUM(streams))              AS total_streams,
        MEASURE(AVG(streams))              AS avg_streams,
        MEASURE(MIN(streams))              AS min_streams,
        MEASURE(MAX(streams))              AS max_streams,
        MEASURE(COUNT(song_id))            AS song_count,
        MEASURE(COUNT(DISTINCT artist_id)) AS distinct_artists),
    music.Playlists KEY (playlist_id)
      PROPERTIES (playlist_id, playlist_name, followers,
        MEASURE(SUM(followers)) AS total_followers),
    music.PlaylistEntries KEY (entry_id)
      PROPERTIES (entry_id, playlist_id, song_id,
        MEASURE(COUNT(entry_id)) AS placement_count)
  )
  EDGE TABLES (
    music.PlaylistEntries AS EntryToSong
      SOURCE KEY (entry_id) REFERENCES PlaylistEntries(entry_id)
      DESTINATION KEY (song_id) REFERENCES Songs(song_id) NO PROPERTIES,
    music.PlaylistEntries AS EntryToPlaylist
      SOURCE KEY (entry_id) REFERENCES PlaylistEntries(entry_id)
      DESTINATION KEY (playlist_id) REFERENCES Playlists(playlist_id) NO PROPERTIES,
    music.Songs AS SongToArtist
      SOURCE KEY (song_id) REFERENCES Songs(song_id)
      DESTINATION KEY (artist_id) REFERENCES Artists(artist_id) NO PROPERTIES,
    music.Artists AS ArtistToLabel
      SOURCE KEY (artist_id) REFERENCES Artists(artist_id)
      DESTINATION KEY (label_id) REFERENCES Labels(label_id) NO PROPERTIES
  )

CREATE PROPERTY GRAPH कमांड को छह बार चलाने और उसके पूरा होने का मैसेज दिखाने वाली इमेज

अब इन सभी को वापस पढ़ो. हर मेज़रमेंट, AGG से होकर गुज़रता है. आखिरी कॉलम में दिखाया गया है कि AGG के नतीजे, सामान्य वैल्यू होती हैं. इनका इस्तेमाल गणितीय कैलकुलेशन के लिए किया जा सकता है. ग्राफ़ में अभी बदलाव हुआ है. इसलिए, पहले कैश किए गए नतीजों का इस्तेमाल करें को हटाएं (ज़्यादा → क्वेरी सेटिंग).

👉📋 क्वेरी एडिटर — चिपकाएं और फिर चलाएं पर क्लिक करें:

SELECT
  Labels_label_name,
  AGG(Songs_total_streams)    AS total_streams,
  AGG(Songs_avg_streams)      AS avg_streams,
  AGG(Songs_min_streams)      AS min_streams,
  AGG(Songs_max_streams)      AS max_streams,
  AGG(Songs_song_count)       AS songs,
  AGG(Songs_distinct_artists) AS artists,
  AGG(Songs_total_streams) / AGG(Songs_song_count) AS streams_per_song
FROM GRAPH_EXPAND("music.MusicGraph")
GROUP BY 1
ORDER BY 1

👀 नतीजा:

Labels_label_name

total_streams

avg_streams

min_streams

max_streams

गाने

कलाकार

streams_per_song

Cymbal Records

5,100,000,000

1,275,000,000

40,00,00,000

2,000,000,000

4

2

1,275,000,000

Northwind Audio

4,500,000,000

4,500,000,000

4,500,000,000

4,500,000,000

1

1

4,500,000,000

सात कॉलम वाला नतीजों का ग्रिड, दोनों लेबल

हर संख्या को चार गानों के हिसाब से कैलकुलेट किया गया है. ये गाने, Cymbal के लिए हैं. वहीं, Northwind के लिए एक गाना है. इन गानों को प्लेसमेंट की दस लाइनों के हिसाब से कैलकुलेट नहीं किया गया है. खास तौर पर, AVG को दूसरी तरह से कैलकुलेट करना गलत होगा: प्लेसमेंट की लाइनों में रॉ कॉलम का औसत निकालने पर, Cymbal के लिए 1.575 अरब मिलता है. ऐसा इसलिए, क्योंकि Neon Summer के 2 अरब को चार बार गिना जाता है.

इसलिए, "SUM की जगह AGG का इस्तेमाल करें" का मतलब दो फ़ैसले लेना है. मेज़रमेंट का एलान करते समय, आपके पास यह चुनने का विकल्प होता है कि यह छह एग्रीगेट में से कौनसी एग्रीगेट है. मेज़रमेंट को रीड करते समय, फ़ंक्शन हमेशा AGG होता है.

✅ चेकपॉइंट: हर लेबल के लिए एक लाइन, हर लाइन में सात नंबर, और streams_per_song, avg_streams के बराबर होना चाहिए.

9. मेज़र नहीं, बल्कि ग्रुपिंग बदलें

एक ही मेज़र से अलग-अलग सवालों के जवाब मिलते हैं. लेबल के बजाय प्लेलिस्ट के हिसाब से ग्रुप बनाएं.

👉📋 क्वेरी एडिटर — चिपकाएं और फिर चलाएं पर क्लिक करें:

SELECT
  Playlists_playlist_name,
  AGG(Songs_total_streams) AS streams,
  AGG(Songs_song_count)    AS songs
FROM GRAPH_EXPAND("music.MusicGraph")
GROUP BY 1
ORDER BY 2 DESC

👀 नतीजा:

Playlists_playlist_name

स्ट्रीम

गाने

रोड ट्रिप

6,900,000,000

3

जिम पंप

6,500,000,000

2

अभी सबसे ज़्यादा लोकप्रिय

4,700,000,000

3

राइज़िंग पॉप

3,50,00,00,000

2

नतीजों की ग्रिड में, रोड ट्रिप को सबसे ऊपर दिखाया गया है. इसके लिए, 6,900,000,000 नतीजे मिले हैं

दोनों AGG लाइनें, SUM और AGG, अगल-बगल से बाइट के हिसाब से एक जैसी हैं. सिर्फ़ GROUP BY को दूसरी जगह ले जाया गया है. Road Trip प्लेलिस्ट में Neon Summer, Midnight Drive, और Slow Arrow गाने शामिल हैं. इस प्लेलिस्ट में हर गाने को एक बार गिना जाता है. "इस प्लेलिस्ट तक पहुंचने वाली स्ट्रीम" का मतलब भी यही होना चाहिए.

जिस व्यक्ति ने मेज़र बनाया है उसने एक बार ग्रेन तय किया है. इसके बाद, कोई भी व्यक्ति जो क्वेरी करेगा उसमें यह सेटिंग अपने-आप लागू हो जाएगी.

✅ चेकपॉइंट: Road Trip सबसे ऊपर है. इसे 6.9 अरब बार देखा गया है.

10. देखें कि GRAPH_EXPAND से आपको क्या मिलता है

इसके आकार के बारे में जानने के लिए, आपको GRAPH_EXPAND चलाने की ज़रूरत नहीं है. BQ.SHOW_GRAPH_EXPAND_SCHEMA सिस्टम प्रोसीज़र, कॉलम की सूची को वैरिएबल में लिखती है.

👉📋 क्वेरी एडिटर — तीनों लाइनें चिपकाएं. इसके बाद, चलाएं पर क्लिक करें:

DECLARE schema STRING DEFAULT '';
CALL BQ.SHOW_GRAPH_EXPAND_SCHEMA('music.MusicGraph', schema);
SELECT schema;

👀 नतीजा एक JSON स्ट्रिंग है. हर फ़ील्ड का एक नाम, टाइप, और मोड होता है. साथ ही, हर मेज़र कॉलम में "is_measure": true होता है. आपने अभी जो ग्राफ़ बनाया है उसके लिए, आपको ये सुविधाएं मिलती हैं. इनके अलावा, और भी सुविधाएं मिलती हैं:

नाम

टाइप

is_measure

Songs_title

स्ट्रिंग

Songs_streams

पूर्णांक

Songs_total_streams

पूर्णांक

सही

Songs_avg_streams

FLOAT

सही

Songs_distinct_artists

पूर्णांक

सही

PlaylistEntries_placement_count

पूर्णांक

सही

एक JSON सेल, जिसे इस तरह से बड़ा किया गया है कि is_measure true दिखे

किसी प्रॉपर्टी के लिए सेट की गई जानकारी या समानार्थी शब्द भी यहां दिखते हैं. चैट के वैकल्पिक चरण में यह दिखाया जाता है कि उन मैसेज को किसने पढ़ा.

✅ चेकपॉइंट: एक JSON स्ट्रिंग, जिसमें MEASURE के साथ एलान किए गए हर कॉलम पर is_measure मौजूद है.

11. GRAPH_EXPAND फ़ंक्शन को ग्राफ़ के शेप से क्या चाहिए

इस चरण में कुछ भी नहीं चलाना है — सिर्फ़ पढ़ना है. GRAPH_EXPAND, LEFT JOIN की चेन का इस्तेमाल करके अपनी वाइड टेबल बनाता है. यह एक टेबल से शुरू होती है और किनारों को बाहर की ओर फ़ॉलो करती है. इसके बाद, तीन नियम बनाए गए हैं. MusicGraph इन सभी नियमों का पालन करता है.

GRAPH_EXPAND के लिए, इन चीज़ों की ज़रूरत होती है: PlaylistEntries को सिंगल रूट के तौर पर इस्तेमाल किया जाना चाहिए, चार मेनी-टू-वन एज बाहर की ओर होने चाहिए, और मेनी-टू-मेनी Songs–Playlists पेयर को नोड के तौर पर प्रमोट किया जाना चाहिए

सिर्फ़ एक रूट नोड टेबल. रूट, नोड टेबल होती है. इसकी कुंजी किसी दूसरी टेबल में नहीं दिखती. यानी, कोई भी किनारा इसकी ओर इशारा नहीं करता. MusicGraph में PlaylistEntries: यह दो किनारों का सोर्स है और किसी का भी डेस्टिनेशन नहीं है. चौड़ी टेबल में 10 लाइनें हैं. हर प्लेसमेंट के लिए एक लाइन है.

हर एज, सोर्स से डेस्टिनेशन तक कई-से-एक होती है. हर एंट्री में एक गाना और एक प्लेलिस्ट होती है. हर गाने का एक कलाकार होता है और हर कलाकार का एक लेबल होता है. इसलिए, चौड़ी टेबल कभी भी रूट की अपनी लाइनों से आगे नहीं बढ़ती. ऐसा डेटा नहीं दिखता जिस तक रूट नहीं पहुंच सकता: जैसे, अगर किसी गाने को किसी भी प्लैटफ़ॉर्म पर प्लेस नहीं किया गया है, तो वह बड़ी टेबल में नहीं दिखेगा.

मेनी-टू-मेनी रिलेशनशिप, नोड बन जाती है. गाने और प्लेलिस्ट, कई-से-कई के तौर पर जुड़े होते हैं. अगर आपने जंक्शन टेबल को Songs से Playlists तक के एक ही एज के तौर पर दिखाया है, तो GRAPH_EXPAND इसे अस्पष्ट मानकर अनदेखा कर देगा. साथ ही, इस्तेमाल किए जा सकने वाले एज न होने की वजह से, यह काम नहीं करेगा. PlaylistEntries को नोड टेबल में प्रमोट करने का तरीका दस्तावेज़ में बताया गया है. इसमें कई-से-एक एज होते हैं. आपने ग्राफ़ बनाते समय भी यही तरीका अपनाया था.

12. (ज़रूरी नहीं) GQL के साथ पाथ

अब तक हर सवाल के जवाब के लिए कोई संख्या दी गई है. यह सुविधा उपलब्ध नहीं है. Cymbal की स्ट्रीम, श्रोताओं तक कहाँ पहुँचती हैं? यह सवाल, ग्राफ़ के ज़रिए तय किए गए रास्तों के बारे में है. इसका जवाब कुल संख्या के तौर पर नहीं दिया जा सकता. कुल संख्या बताने तक, रास्ता मिट जाता है.

1. यह पूछें कि स्ट्रीम कहां दिखती हैं

👉📋 क्वेरी एडिटर — चिपकाएं और फिर चलाएं पर क्लिक करें:

GRAPH music.MusicGraph
MATCH (l:Labels)<-[:ArtistToLabel]-(a:Artists)<-[:SongToArtist]-(s:Songs)
      <-[:EntryToSong]-(e:PlaylistEntries)-[:EntryToPlaylist]->(pl:Playlists)
WHERE l.label_name = 'Cymbal Records'
RETURN pl.playlist_name, pl.followers,
       SUM(s.streams) AS streams_reaching_this_playlist,
       STRING_AGG(s.title, ', ') AS songs
GROUP BY pl.playlist_name, pl.followers
ORDER BY streams_reaching_this_playlist DESC

👀 आपको चार प्लेलिस्ट मिलेंगी:

pl.playlist_name

pl.followers

streams_reaching_this_playlist

गाने

अभी सबसे ज़्यादा लोकप्रिय

3,50,00,000

4,700,000,000

डबल शॉट, नियॉन समर, पेपर क्राउन

राइज़िंग पॉप

20,00,000

3,50,00,00,000

नियॉन समर, पेपर क्राउन

रोड ट्रिप

5,000,000

2,40,00,00,000

Neon Summer, Slow Arrow

जिम पंप

30,00,000

2,000,000,000

नियॉन समर

GQL का नतीजा: चार प्लेलिस्ट, जिनमें से हर एक पर स्ट्रीम पहुंच रही है

MATCH लाइन को एक वाक्य के तौर पर पढ़ें: लेबल से शुरू करें, उसके कलाकारों पर वापस जाएं, उनके गानों पर वापस जाएं, उन गानों की प्लेलिस्ट एंट्री पर वापस जाएं, और फिर प्लेलिस्ट पर आगे बढ़ें. तीर, किनारों के बारे में जानकारी देते हैं. <- से एक चरण पीछे जाया जा सकता है.

अब तीसरे कॉलम में दिए गए नंबरों को जोड़ें. 12.6 अरब — यह वह संख्या है जो SUM ने आपको चौथे चरण में दी थी. यह संख्या गलत थी.

यह रहा. उस समय, यह सवाल पूछा जाता था कि सिंबल पर कितना कॉन्टेंट स्ट्रीम किया गया. साथ ही, किसी गाने को एक बार ही गिना जाता था, भले ही वह कितनी भी प्लेलिस्ट में शामिल हो. इस सवाल का जवाब यह है कि ये स्ट्रीम कहां तक पहुंचती हैं. साथ ही, किसी गाने को चार प्लेलिस्ट में शामिल करने से, वह चार तरह की ऑडियंस तक पहुंचता है. डुप्लीकेट किए गए GRAPH_EXPAND में, एक सवाल और दूसरे सवाल का जवाब शामिल है. AGG का मतलब कभी भी यह नहीं था कि डुप्लीकेट जवाब खराब होते हैं. इसका मतलब यह था कि जवाब में दी गई संख्याएं, सवाल में दी गई संख्याओं से मेल खानी चाहिए.

2. पाथ की जानकारी देना

डेटा इकट्ठा करने की सुविधा बंद करें और रास्ते के बारे में पूछें.

👉📋 क्वेरी एडिटर — चिपकाएं और फिर चलाएं पर क्लिक करें:

GRAPH music.MusicGraph
MATCH p = (l:Labels)<-[:ArtistToLabel]-(a:Artists)<-[:SongToArtist]-(s:Songs)
          <-[:EntryToSong]-(e:PlaylistEntries)-[:EntryToPlaylist]->(pl:Playlists)
WHERE l.label_name = 'Cymbal Records'
RETURN TO_JSON(p) AS path

p = पूरे मैच का नाम देता है और TO_JSON उसे रेंडर करता है.

👀 अनुमानित आठ पंक्तियां और एक path कॉलम. हर सेल, नोड और किनारों का JSON कलेक्शन होता है. ये नोड और किनारे, एक रूट के साथ होते हैं. हर नोड में उसका labels और properties होता है.

आठ पंक्तियां, हर पंक्ति में एक JSON पाथ, और नतीजों वाले पैनल में ग्राफ़ टैब

चार गानों के लिए आठ लाइनें, क्योंकि हर प्लेसमेंट के लिए एक रूट मौजूद होता है, न कि हर गाने के लिए.

3. ग्राफ़ टैब खोलें

👉🌐 Console — नतीजों के ऊपर, ग्राफ़ पर क्लिक करें.

यह टैब सिर्फ़ तब दिखता है, जब किसी नतीजे में ग्राफ़ के एलिमेंट शामिल हों. पिछली क्वेरी में नंबर दिखाए गए थे. इसलिए, इसमें ग्राफ़ टैब नहीं था. इस क्वेरी में पाथ दिखाए गए हैं. इसलिए, इसमें ग्राफ़ टैब है.

ग्राफ़ टैब में, फ़ोर्स लेआउट में साइंबल का सबग्राफ़ दिखाया गया है

आपको फ़ोर्स लेआउट के तौर पर बनाए गए ग्राफ़ का Cymbal वाला हिस्सा मिलता है. इसमें नोड और किनारों की संख्या दिखती है. साथ ही, हर लेबल के लिए एक चिप होती है. लेआउट को अलग करने के लिए, किसी नोड को खींचें. उसकी प्रॉपर्टी देखने के लिए, उस पर क्लिक करें.

✅ चेकपॉइंट: पहली क्वेरी के तीसरे कॉलम का कुल योग 12.6 अरब है. दूसरी क्वेरी से आठ पाथ मिलते हैं और Graph टैब उन्हें दिखाता है.

13. (ज़रूरी नहीं) ग्राफ़ के बारे में चैट करना

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

1. एजेंट बनाना

👉🌐 Console — बाईं ओर मौजूद BigQuery के नेविगेशन मेन्यू में, एजेंट पर क्लिक करें. इसके बाद, एजेंट कैटलॉग और फिर एजेंट बनाएं पर क्लिक करें.

👉🌐 Console — एजेंट का नाम में Music graph agent टाइप करें. इसके बाद, एजेंट की जानकारी में यह टाइप करें:

Ask questions about labels, artists, songs and playlists in the music property graph.

👉🌐 Console — जानकारी के सोर्स में जाकर, सोर्स जोड़ें पर क्लिक करें. सोर्स चुनें डायलॉग बॉक्स में, अपने प्रोजेक्ट को बड़ा करें, music को बड़ा करें, ग्राफ़ को बड़ा करें, MusicGraph पर सही का निशान लगाएं, और पुष्टि करें पर क्लिक करें.

👀 सोर्स जोड़ें बटन धूसर हो जाता है. कोई एजेंट ज़्यादा से ज़्यादा एक ग्राफ़ को होल्ड कर सकता है. साथ ही, ग्राफ़ को टेबल के साथ नहीं मिलाया जा सकता.

सोर्स चुनें डायलॉग बॉक्स में MusicGraph पर सही का निशान लगा है और उसे चुना गया है (1)

👉🌐 Console — क्षेत्र को उसी तरह सेट रहने दें जैसा ग्राफ़ की जगह के हिसाब से सेट किया गया था. सेव करें पर क्लिक करें. इसके बाद, पब्लिश करें पर क्लिक करें. पब्लिशिंग चैनल पैनल में, एजेंट पब्लिश करें पर क्लिक करें और पुष्टि करने वाले मैसेज को बंद करें.

2. सवाल पूछें

👉🌐 Console — Create conversation पर क्लिक करें. चैट पेज खुलता है. सबसे नीचे मौजूद कोई सवाल पूछें बॉक्स में यह टाइप करें और Enter दबाएं:

For each label, show total streams and how many playlists their songs are on

👀 एजेंट, टेबल और एक वाक्य में खास जानकारी देता है:

label_name

total_streams

playlist_placements

Cymbal Records

5,100,000,000

8

Northwind Audio

4,500,000,000

2

एजेंट का जवाब: टेबल और उसके बारे में एक वाक्य में दी गई जानकारी

5.1 अरब. किसी ने एजेंट को फ़ैन-आउट के बारे में नहीं बताया और यह फ़ैन-आउट में शामिल नहीं था.

3. उसकी लिखी हुई क्वेरी पढ़ें

👉🌐 Console — नेविगेशन मेन्यू में, जॉब एक्सप्लोरर पर क्लिक करें. इसके बाद, सबसे नए जॉब पर क्लिक करें. इसके लेबल में आपके एजेंट का आईडी, ca-bq-job: true, और data-agent-id शामिल हैं. इसकी क्वेरी यह है:

SELECT
  Labels_label_name AS label_name,
  AGG(Songs_total_streams) AS total_streams,
  AGG(PlaylistEntries_placement_count) AS playlist_placements
FROM GRAPH_EXPAND("music.MusicGraph")
GROUP BY label_name
ORDER BY total_streams DESC

जॉब एक्सप्लोरर: जॉब के लेबल (ca-bq-job, data-agent-id) और उसका एसक्यूएल

इसने GRAPH_EXPAND और AGG का इस्तेमाल अपने-आप किया, क्योंकि मेज़रमेंट उस स्कीमा में मौजूद थे जिसे इसने पढ़ा था. एजेंट की जानकारी में, उनके बारे में कुछ भी नहीं बताया गया है.

✅ चेकपॉइंट: चैट के जवाब में 5.1 अरब और नौकरी के एसक्यूएल में AGG(...).

14. व्यवस्थित करें

👉💻 Cloud Shell — डेटासेट, उसकी टेबल, और प्रॉपर्टी ग्राफ़ को ड्रॉप करें:

cd ~/bq-graph-measures-lab
./cleanup.sh

👀 अनुमानित ✓ dropped YOUR_PROJECT_ID.music (tables and graph).

अगर आपने वैकल्पिक डेटा एजेंट बनाया है, तो उसे कंसोल में जाकर मिटाएं. इसके लिए, एजेंट → एजेंट कैटलॉग पर जाएं. अगर आपने ./setup_project.shइस लैब के लिए कोई प्रोजेक्ट बनाया है, तो सबसे अच्छा तरीका यह है कि पूरे प्रोजेक्ट को बंद कर दें. इसका आईडी ~/project_id.txt में है.

15. बधाई हो

आपने एक लाइन, MEASURE(SUM(streams)) का एलान किया. इससे 12.6 अरब, 5.1 अरब में बदल गया. यह बदलाव आपके लिए और उस ग्राफ़ के ख़िलाफ़ बाद में लिखी गई हर क्वेरी के लिए हुआ. इसमें एजेंट की लिखी गई क्वेरी भी शामिल हैं.

आपने क्या सीखा

  • मेज़र, किसी नोड पर एग्रीगेट किया गया डेटा होता है. यह KEY के बगल में होता है, जो इसके ग्रेन को सेट करता है.
  • GRAPH_EXPAND से ग्राफ़ को TableLabel_property कॉलम वाली एक बड़ी टेबल में बदल दिया जाता है.
  • AGG एक ऐसा फ़ंक्शन है जो मेज़र को पढ़ता है. टाइप सिस्टम इसे चार अलग-अलग तरीकों से लागू करता है.
  • छह एग्रीगेट उपलब्ध हैं. साथ ही, AGG के नतीजे ऐसी सामान्य वैल्यू हैं जिन्हें बांटा जा सकता है.
  • GROUP BY को बदलने पर, मेज़र को बदले बिना सवाल फिर से पूछा जाता है.
  • GRAPH_EXPAND को एक रूट, कई-से-एक किनारे, और जंक्शन को नोड के तौर पर प्रमोट करना है.

डिसिज़न टेबल

समस्या का ब्यौरा

वजह

ठीक करें

कुल संख्या बहुत ज़्यादा है

SUM फ़ैन आउट किए गए कॉलम पर

कोई मेज़रमेंट तय करना और उसे AGG की मदद से पढ़ना

"expected MEASURE, found INT64"

AGG को सादे कॉलम पर दिखाया गया है

SUM का इस्तेमाल करें या मेज़रमेंट की जानकारी दें

"MEASURE टाइप के एक्सप्रेशन को वापस लाने की अनुमति नहीं है"

AGG के बिना मेज़र कॉलम

इसे रैप करें: AGG(...)

"not exposed by element type"

GQL में रेफ़रंस के तौर पर इस्तेमाल की गई मेट्रिक

सिर्फ़ GRAPH_EXPAND से पीछे चल रहे लाइव इवेंट को मेज़र करता है

GRAPH_EXPAND किसी किनारे को अनदेखा करता है या काम नहीं करता

जंक्शन को एक किनारे के तौर पर मॉडल किया गया है

जंक्शन टेबल को नोड के तौर पर प्रमोट करना

ग्राफ़ बदलने के बाद पुराना नंबर

कैश मेमोरी में सेव किया गया नतीजा

कैश मेमोरी में सेव किए गए नतीजों का इस्तेमाल करें को चुनें

हमने जान-बूझकर इन विषयों को शामिल नहीं किया

प्रॉपर्टी के बारे में जानकारी और मिलते-जुलते शब्द · डेटा एजेंट के लिए, वेरिफ़ाई की गई क्वेरी और ग्लॉसरी · एक से ज़्यादा MATCH के लिए GQL · एक से ज़्यादा ग्राफ़ में मेज़र. हर एक अपने-आप में एक लैब है.

ज़्यादा जानें