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

यहां आपको कुछ टाइप करना होगा
इस लैब में, इन दो जगहों का इस्तेमाल किया जाता है:
कहां | वहां क्या किया जाता है | |
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 चालू करें पर क्लिक करें — यह हेडर में टर्मिनल के आकार का आइकॉन होता है. पेज के सबसे नीचे एक टर्मिनल खुलता है.

👉🌐 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 आपका प्रोजेक्ट आईडी है. आपके प्रोजेक्ट आईडी में अलग-अलग अंक होंगे. इसमें ये चार काम होते हैं:
बिलिंग | अगर आपके पास नया | |
project |
| |
selects | यह कुकी, आईडी को | |
waits | जब तक नए प्रोजेक्ट को विज्ञापन दिखाने की अनुमति नहीं मिल जाती, तब तक दो मिनट तक पोल दिखाए जाते हैं | |
🌐 अब यही प्रोजेक्ट कंसोल में मौजूद है. इसका आईडी, डैशबोर्ड पर मौजूद प्रोजेक्ट की जानकारी कार्ड में दिखता है:

5 · डेटासेट बनाएं (~3 मिनट)
👉💻 Cloud Shell — एक और स्क्रिप्ट टेबल बनाती है:
cd ~/bq-graph-measures-lab
./setup.sh
स्क्रिप्ट के चलने पर, हर चरण प्रिंट होता है. यह इन कामों को इस क्रम में करता है:
project |
| |
एपीआई |
| |
डेटासेट | यह अमेरिका के एक से ज़्यादा इलाकों वाले डेटासेट में | |
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 |
| नाम, मार्केटिंग बजट |
कलाकार | 3 |
| नाम, कौनसे लेबल |
गाने | 5 |
| टाइटल, कलाकार का नाम, स्ट्रीम |
प्लेलिस्ट | 4 |
| नाम, फ़ॉलोअर |
PlaylistEntries | 10 |
| कौनसा गाना किस प्लेलिस्ट में है |
✅ चेकपॉइंट: 🎉 ready Cloud Shell में, एक्सप्लोरर में music के नीचे पांच टेबल, और एक खाली क्वेरी एडिटर टैब खुला है.
3. ग्राफ़ बनाना — विकल्प A: विज़ुअल मॉडलर
प्रॉपर्टी ग्राफ़ से पता चलता है कि टेबल कैसे कनेक्ट होती हैं. इसे विज़ुअल ग्राफ़ मॉडलर में एक साथ क्लिक किया जा सकता है (यह चरण, सभी क्लिक) या इसे एसक्यूएल के तौर पर लिखा जा सकता है (अगला चरण, एक बार में चिपकाएं). दोनों से एक ही ऑब्जेक्ट बनता है. इसलिए, दोनों में से किसी एक का इस्तेमाल करें.
1. ग्राफ़ का शेल बनाना
👉🌐 Console — BigQuery Studio में, नया बनाएं लाइन में, एआई और जानकारी मेन्यू खोलें. इसके बाद, ग्राफ़ पर क्लिक करें.
👉🌐 Console — ग्राफ़ का नाम के तौर पर MusicGraph और डेटासेट में ग्राफ़ की जगह के तौर पर music डालें. डेटासेट (अमेरिका) से क्षेत्र की जानकारी अपने-आप भर जाती है.
👉🌐 Console — डेटा सोर्स में जाकर, पांच टेबल चुनें — कलाकार, लेबल, प्लेलिस्ट में शामिल किए गए गाने, प्लेलिस्ट, गाने — और बनाएं पर क्लिक करें.

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

2. चारों किनारों को बनाएं
किनारा एक फ़ॉरेन की है, जिसे बनाया गया है. हर एक, उस टेबल से शुरू होता है जिसमें कुंजी होती है और उस टेबल पर खत्म होता है जिस पर वह पॉइंट करता है.
👉🌐 Console — New edge पर क्लिक करें. टेबल चुनें डायलॉग बॉक्स में, PlaylistEntries को चुनें और जोड़ें पर क्लिक करें. किनारा जोड़ें पैनल में:
- नाम को
EntryToSongपर सेट करें. - प्राइमरी पासकोड जोड़ें पर क्लिक करें और
entry_idको स्वीकार करें. - सोर्स में जाकर, सोर्स नोड को PlaylistEntries पर सेट करें. इसके बाद, नोड में रेफ़र किए गए कॉलम जोड़ें और एज पर रेफ़र किए गए कॉलम जोड़ें का इस्तेमाल करके, दोनों के लिए
entry_idचुनें. - टारगेट में जाकर, टारगेट नोड को गाने पर सेट करें. इसके बाद, नोड में रेफ़र किए गए कॉलम और एज पर रेफ़र किए गए कॉलम, दोनों के लिए
song_idचुनें. - हो गया पर क्लिक करें.

👉🌐 Console — इसे तीन बार और दोहराएं:
एज का नाम | टेबल | सोर्स नोड → टारगेट नोड | दोनों तरफ़ से चुनने के लिए कॉलम |
| PlaylistEntries | PlaylistEntries → Playlists | सोर्स |
| गाने | गाने → कलाकार | सोर्स |
| कलाकार | कलाकार → लेबल | सोर्स |
हर किनारे को बिना किसी अतिरिक्त प्रॉपर्टी के छोड़ दें.
👀 अब जानकारी वाले पैनल में किनारे (4) लिखा है. साथ ही, कैनवस में चेन दिख रही है: लेबल ← कलाकार ← गाने ← प्लेलिस्ट की एंट्री → प्लेलिस्ट.

3. मेज़र जोड़ना
👉🌐 Console — Songs नोड पर क्लिक करें. इसके बाद, 'जानकारी' पैनल में सबसे ऊपर मौजूद, बदलाव करें (पेंसिल) आइकॉन पर क्लिक करें. लेबल की प्रॉपर्टी में जाकर, प्रॉपर्टी जोड़ें पर क्लिक करें. इसके बाद, फ़ील्ड जोड़ें पर क्लिक करें.
👉🌐 कंसोल — total_streams को फ़ील्ड का नाम के तौर पर डालें. इसके बाद, एक्सप्रेशन बॉक्स में यह टाइप करें:
MEASURE(SUM(streams))
👉🌐 Console — जोड़ें पर क्लिक करें. इसके बाद, हो गया पर क्लिक करें.

4. इसके लिखे गए कोड को पढ़ें. इसके बाद, उसे पब्लिश करें
👉🌐 Console — दाईं ओर मौजूद पैनल में, कोड टैब खोलें. मॉडलर ने आपके लिए CREATE PROPERTY GRAPH स्टेटमेंट लिखा है. गाने वाले नोड पर जाएं: इसकी प्रॉपर्टी लिस्ट अब इस पर खत्म होती है
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
)
👀 नतीजों के पैनल में, प्रॉपर्टी ग्राफ़ बनाने की जानकारी दिखती है.

इसे एक बार पढ़ें
ग्राफ़ में पांच नोड टेबल और चार एज टेबल हैं. हर नोड टेबल में, उसके KEY का नाम होता है और उसके PROPERTIES की सूची होती है. MEASURE से शुरू होने वाली लाइनें, नया हिस्सा हैं: इनमें से हर लाइन, किसी प्रॉपर्टी के चारों ओर काम करने वाले एग्रीगेट में से किसी एक को रैप करती है और उसे एक एलियास देती है. यह एलियास देना ज़रूरी है.
हर एज टेबल एक फ़ॉरेन की होती है. इसे इस तरह से लिखा जाता है: SOURCE KEY उस टेबल पर जो कुंजी को होल्ड करती है, DESTINATION KEY उस टेबल पर जो इसे पॉइंट करती है. NO PROPERTIES का मतलब है कि एज में कोई भी जानकारी नहीं है.
ध्यान दें कि PlaylistEntries तीन बार दिखता है: एक बार नोड टेबल के तौर पर और दो बार EntryToSong और EntryToPlaylist के किनारों के पीछे मौजूद फ़िज़िकल टेबल के तौर पर. ऐसा जान-बूझकर किया गया है. हम बाद में इसकी वजह बताएंगे.
देखें कि आपने क्या बनाया है
👉🌐 Console — एक्सप्लोरर पैन में, music को बड़ा करें. इसके बाद, Graphs को बड़ा करें और 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 के चार गानों को 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 | रोड ट्रिप |

एक लाइन चार लाइनों में बदल गई. स्ट्रीम की संख्या में कोई बदलाव नहीं हुआ — इसे कॉपी किया गया था. 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 का आकलन करता है, तो यह हर गाने की कुंजी के हिसाब से एक बार एग्रीगेट करता है. इसके बाद, यह सिर्फ़ उस वैल्यू को रोल अप करता है जिसके हिसाब से आपने ग्रुप किया है.
क्या बदलाव हुए
आपने लिखा था | मेज़र के साथ |
| ग्राफ़ में |
|
|
तीन |
|
एक सीटीई, जो जॉइन करने से पहले एग्रीगेट करता है | कुछ नहीं. |
✅ चेकपॉइंट: पांच लाइनें — एक पहले, चार बाद में — और इनसे 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

👉📋 क्वेरी एडिटर — 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
)

अब इन सभी को वापस पढ़ो. हर मेज़रमेंट, 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 |

दोनों 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 स्ट्रिंग, जिसमें MEASURE के साथ एलान किए गए हर कॉलम पर is_measure मौजूद है.
11. GRAPH_EXPAND फ़ंक्शन को ग्राफ़ के शेप से क्या चाहिए
इस चरण में कुछ भी नहीं चलाना है — सिर्फ़ पढ़ना है. GRAPH_EXPAND, LEFT JOIN की चेन का इस्तेमाल करके अपनी वाइड टेबल बनाता है. यह एक टेबल से शुरू होती है और किनारों को बाहर की ओर फ़ॉलो करती है. इसके बाद, तीन नियम बनाए गए हैं. MusicGraph इन सभी नियमों का पालन करता है.

सिर्फ़ एक रूट नोड टेबल. रूट, नोड टेबल होती है. इसकी कुंजी किसी दूसरी टेबल में नहीं दिखती. यानी, कोई भी किनारा इसकी ओर इशारा नहीं करता. 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 | नियॉन समर |

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 होता है.

चार गानों के लिए आठ लाइनें, क्योंकि हर प्लेसमेंट के लिए एक रूट मौजूद होता है, न कि हर गाने के लिए.
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 पर सही का निशान लगाएं, और पुष्टि करें पर क्लिक करें.
👀 सोर्स जोड़ें बटन धूसर हो जाता है. कोई एजेंट ज़्यादा से ज़्यादा एक ग्राफ़ को होल्ड कर सकता है. साथ ही, ग्राफ़ को टेबल के साथ नहीं मिलाया जा सकता.

👉🌐 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

इसने 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को एक रूट, कई-से-एक किनारे, और जंक्शन को नोड के तौर पर प्रमोट करना है.
डिसिज़न टेबल
समस्या का ब्यौरा | वजह | ठीक करें |
कुल संख्या बहुत ज़्यादा है |
| कोई मेज़रमेंट तय करना और उसे |
"expected MEASURE, found INT64" |
|
|
"MEASURE टाइप के एक्सप्रेशन को वापस लाने की अनुमति नहीं है" |
| इसे रैप करें: |
"not exposed by element type" | GQL में रेफ़रंस के तौर पर इस्तेमाल की गई मेट्रिक | सिर्फ़ |
| जंक्शन को एक किनारे के तौर पर मॉडल किया गया है | जंक्शन टेबल को नोड के तौर पर प्रमोट करना |
ग्राफ़ बदलने के बाद पुराना नंबर | कैश मेमोरी में सेव किया गया नतीजा | कैश मेमोरी में सेव किए गए नतीजों का इस्तेमाल करें को चुनें |
हमने जान-बूझकर इन विषयों को शामिल नहीं किया
प्रॉपर्टी के बारे में जानकारी और मिलते-जुलते शब्द · डेटा एजेंट के लिए, वेरिफ़ाई की गई क्वेरी और ग्लॉसरी · एक से ज़्यादा MATCH के लिए GQL · एक से ज़्यादा ग्राफ़ में मेज़र. हर एक अपने-आप में एक लैब है.
ज़्यादा जानें
- मेज़र का इस्तेमाल करना
- प्रॉपर्टी ग्राफ़ बनाना और क्वेरी करना
- कन्वर्सेशनल ऐनलिटिक्स के बारे में खास जानकारी
- लैब रेपो — इस कोडलैब में मौजूद हर क्वेरी को चरण के हिसाब से नंबर दिया गया है