شروع به کار با «سنجه‌های گراف BigQuery»

۱. نمای کلی

بیشتر اشکالات SQL که از بازبینی کد جان سالم به‌در می‌برند، اشکالات تجمیع هستند. عددی در جدولی که در آن قرار دارد درست است، پیوندی آن را کپی می‌کند، و مجموع به‌طور نامحسوس اشتباه است.

با BigQuery Graph می‌توانید نحوه اتصال جدول‌هایتان را یک‌بار به‌عنوان گراف خصوصیت توصیف کنید و سپس اتصال‌ها را پُرسمان کنید. سنجه‌های گراف یک چیز دیگر به آن شرح اضافه می‌کنند: خود تجمیع. MEASURE(SUM(streams)) را در گرهی که مالک شماره است اعلام می‌کنید، و هر پُرسمانی که گراف را می‌خواند مجموع درست را در دانه درست دریافت می‌کند — بدون ترفند GROUP BY، بدون عبارت جدولی مشترکی که کسی باید به‌خاطر بسپارد.

در این کدآزمایی، کاتالوگ موسیقی پنج جدولی می‌سازید، یک میزان موسیقی در آن قرار می‌دهید، و می‌بینید که همان پرسش دو پاسخ متفاوت برمی‌گرداند: ۱۲٫۶ میلیارد با SUM، ۵٫۱ میلیارد با AGG. این فاصله شکل کاتالوگ است — آهنگی که در چهار فهرست پخش قرار دارد وقتی نمودار مسطح می‌شود به چهار ردیف تبدیل می‌شود و SUM هر چهار ردیف را اضافه می‌کند. سپس قوانینی را یاد می‌گیرید که مورد دوم را درست می‌کند.

یک ردیف «آهنگ‌ها» در چهار ردیف جای آگهی کپی شد: «مجموع» کپی‌ها را اضافه می‌کند، «تراکم» براساس song_id جمع می‌شود

جایی که چیزها را تایپ می‌کنید

این آزمایشگاه دقیقاً از دو مکان به این ترتیب استفاده می‌کند:

کجا

کاری که در آنجا انجام می‌دهید

1

ترمینال Cloud Shell

تعداد کمی فرمان، فقط در مرحله راه‌اندازی

2

کنسول BigQuery

هر چیز دیگری: جای‌گذاری پُرسمان‌ها در ویرایشگر پُرسمان، کلیک کردن در مدل‌ساز گراف، گپ زدن با عامل

هر دستورالعمل برچسب‌گذاری شده است تا همیشه بدانید کدام دستورالعمل است:

  • 👉💻 Cloud Shell — این را در ترمینال Cloud Shell تایپ کنید.
  • 👉📋 ویرایشگر پُرسمان — این را در ویرایشگر پُرسمان BigQuery جای‌گذاری کنید و روی اجرا کلیک کنید.
  • 👉🌐 کنسول — در کنسول BigQuery کلیک کنید. چیزی برای تایپ کردن وجود ندارد، مگراینکه مرحله این را بگوید.
  • 👀 — به نتیجه نگاه کنید.

آنچه خواهید آموخت

  • نحوه تعریف کردن سنجه در جدول گره — در مدل‌ساز گراف دیداری یا در SQL
  • ‫GRAPH_EXPAND چگونه نمودار را به یک جدول پهن تبدیل می‌کند
  • چرا AGG تنها تابعی است که می‌تواند یک سنجه را بخواند، و هر تلاش دیگری چه می‌گوید
  • شش تجمیعی که سنجه پشتیبانی می‌کند و نحوه انجام محاسبات ریاضی روی آن‌ها
  • نحوه پاسخ یک معیار به پرسشی که به‌صورت متفاوت گروه‌بندی شده است بدون هیچ تغییری
  • اختیاری: اینکه GQL و برگه «گراف» چگونه به سؤالی پاسخ می‌دهند که مجموع نمی‌تواند، و اینکه عامل داده BigQuery چگونه بدون اینکه به او گفته شود از سنجه‌های شما استفاده می‌کند

آنچه نیاز خواهید داشت

  • حساب Google با صورت‌حساب دردسترس و مرورگر. در ابتدا به پروژه Google Cloud نیاز ندارید — «راه‌اندازی» یکی برایتان ایجاد می‌کند.
  • فقط برای مرحله اختیاری گپ: «میانای برنامه‌سازی کاربردی Gemini Data Analytics» فعال باشد و نقش سازنده عامل داده Gemini Data Analytics را داشته باشید.

چیزی برای نصب در ماشین شما وجود ندارد. همه چیز در Cloud Shell و کنسول BigQuery اجرا می‌شود.

وضعیت و هزینه محصول

‫BigQuery Graph به‌طور کلی دردسترس است. سنجه‌های گراف، مدل‌ساز گراف دیداری، دیداری‌سازی گراف، و استفاده از گراف به‌عنوان منبع دانش عامل داده در حالت پیش‌نمایش است و تحت پوشش «شرایط پیشنهادهای پیش‌از GA» قرار دارد.

‫GRAPH_EXPAND و AGG تحت قیمت‌گذاری درصورت تقاضا اجرا می‌شوند. پُرسمان‌های GQL (مرحله مسیر اختیاری) طبق مستندات، به رزرو بااستفاده از نسخه Enterprise یا Enterprise Plus نیاز دارد — به همین دلیل این مرحله اختیاری است.

مجموعه داده چند کیلوبایت است. در قیمت‌گذاری براساس تقاضا، هزینه هر پُرسمان براساس حداقل ۱۰ مگابایت محاسبه می‌شود، بنابراین هزینه کل این آزمایش کد کسری از یک سنت است.

۲. راه‌اندازی

این تنها مرحله‌ای است که از Cloud Shell استفاده می‌کند. این کار پروژه‌ای ایجاد می‌کند، صورت‌حساب را روی آن قرار می‌دهد، و جدول‌های خام را می‌سازد. گراف، معیار، و هر پُرسمانی که بعداً در کنسول BigQuery اجرا می‌کنید متعلق به شما است.

این آزمایشگاه یک چیز را نمی‌تواند به شما ارائه دهد: پروژه Google Cloud با صورت‌حساب. مرحله ۱ حسابی را دراختیارتان قرار می‌دهد که می‌تواند هزینه آن را پرداخت کند؛ مرحله ۴ آن حساب را به پروژه تبدیل می‌کند. آن‌ها را به همین ترتیب انجام دهید — هر مرحله بعداز ۴، پروژه‌ای را که مرحله ۴ ایجاد می‌کند می‌خواند.

‫۱ · دریافت حساب با صورت‌حساب (~۱ دقیقه)

👉🌐 این کار را قبل‌از هر چیز دیگری انجام دهید. با «حساب Google» که صورت‌حساب در آن فعال است به سیستم وارد شوید. هر حسابی از این نوع کار می‌کند. اگر حساب شما این ویژگی را ندارد، دوره آزمایشی رایگان را شروع کنید؛ این دوره به شما حساب صورت‌حساب می‌دهد که تمام چیزی است که مرحله ۴ نیاز دارد.

‫۲ · باز کردن Cloud Shell (حدود ۱ دقیقه)

👉🌐 کنسول — در بالای کنسول Google Cloud روی فعال کردن Cloud Shell کلیک کنید — این نماد ترمینال‌شکل در سرایند است. پایانه‌ای در پایین صفحه باز می‌شود.

فعال کردن Cloud Shell از سرصفحه کنسول Google Cloud

👉🌐 کنسول — اگر در هر زمانی از امروز از شما خواسته شد که مجوز دهید، برای ادامه دادن روی مجوز دادن کلیک کنید.

👉💻 Cloud Shell — بررسی کنید که Cloud Shell با کدام حساب وارد سیستم شده است:

gcloud auth list

👀 انتظار داشته باشید حساب خودتان با * علامت‌گذاری شود و باید همان حسابی باشد که با آن به سیستم وارد شدید در مرحله ۱. اگر این حساب نیست، gcloud auth login را اجرا کنید و حساب درست را انتخاب کنید.

‫۳ · دریافت آزمایشگاه (~۱ دقیقه)

👉💻 Cloud Shell — مخزن را همسانه‌سازی کنید:

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

‫۴ · ایجاد پروژه (~۲ دقیقه)

👉💻 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: دارید، جدیدترین حساب را انتخاب می‌کند و درغیراین‌صورت هر حساب صورت‌حساب باز دیگری را انتخاب می‌کند

پروژه

‫bq-graph-XXXX را ایجاد می‌کند و آن حساب صورت‌حساب را به آن پیوند می‌دهد

انتخاب می‌کند

شناسه را در ~/project_id.txt می‌نویسد و gcloud config set project را اجرا می‌کند، بنابراین پس‌از این دیگر از شما خواسته نمی‌شود آن را تایپ کنید

منتظر می‌ماند

نظرسنجی تا زمانی که پروژه کاملاً جدید اجازه ارائه را دریافت کند، حداکثر تا دو دقیقه

🌐 اکنون همان پروژه در کنسول است — شناسه آن در کارت اطلاعات پروژه در «داشبورد» قرار دارد:

شناسه پروژه شما در «داشبورد» کنسول

‫۵ · ایجاد مجموعه داده (~۳ دقیقه)

👉💻 Cloud Shell — یک دستورگان دیگر جدول‌ها را می‌سازد:

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

این دستورگان هر مرحله را هنگام اجرا چاپ می‌کند. آنچه به‌ترتیب انجام می‌دهد:

پروژه

پروژه را از gcloud config می‌خواند و بدون آن از ادامه دادن خودداری می‌کند

میانای برنامه‌سازی کاربردی

‫bigquery.googleapis.com را فعال می‌کند

مجموعه داده

مجموعه داده music را در منطقه چندگانه ایالات متحده و پنج جدول ایجاد می‌کند که هرکدام PRIMARY KEY ... NOT ENFORCED دارند

بررسی

تعداد ردیف‌های هر جدول را می‌شمارد و اگر تعداد ردیف‌ها درست نباشد متوقف می‌شود

👀 انتظار می‌رود:

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 تمام شد. می‌توانید آن را ببندید.

‫۶ · BigQuery و ویرایشگر پُرسمان را باز کنید

👉🌐 کنسول — روی پیوند انتهای برونداد کلیک کنید، یا BigQuery را از منو پیمایش باز کنید. در قاب کاوشگر در سمت راست، پروژه خود را ازهم باز کنید: مجموعه داده music با پنج جدول.

بخش کاوشگر، موسیقی ازهم بازشده: هنرمندان، برچسب‌ها، ورودی‌های فهرست پخش، فهرست‌های پخش، آهنگ‌ها

👉🌐 کنسول — در بالای BigQuery Studio، در ردیف ایجاد جدید، روی پُرسمان SQL کلیک کنید. زبانه ویرایشگر خالی باز می‌شود.

«ایجاد ردیف جدید با پُرسمان SQL» و زبانه ویرایشگر خالی زیر آن

این زبانه را نگه دارید. هر 👉📋 بلوک در این آزمایشگاه به اینجا می‌رود: هر آنچه در ویرایشگر است را انتخاب کنید، بلوک جدید را روی آن جای‌گذاری کنید، روی اجرا کلیک کنید. نتیجه در پانل زیر نشان داده می‌شود.

با جدول‌ها آشنا شوید

دو چیز درباره این جدول‌ها بعداً اهمیت پیدا می‌کند. هر جدولی کلید اصلی خود را به‌عنوان NOT ENFORCED اعلام می‌کند: BigQuery آن را بررسی نمی‌کند، اما گراف دارایی که می‌خواهید بسازید برای اینکه بداند چه چیزی یک ردیف را شناسایی می‌کند به کلید صریحی نیاز دارد. و جدول آخر، PlaylistEntries، یک جدول اتصال است: آهنگی که در چهار فهرست پخش قرار دارد، چهار ردیف در آن دارد. کل داستان در آن جدول اتفاق می‌افتد.

جدول‌ها به‌این‌صورت به‌هم متصل می‌شوند: یک ناشر با هنرمندان قرارداد می‌بندد، یک هنرمند آهنگ منتشر می‌کند، یک آهنگ ازطریق PlaylistEntries در فهرست‌های پخش قرار می‌گیرد. شرکت Cymbal Records مالک Ava Sterling و Mina Okafor و ازطریق آن‌ها مالک چهار آهنگ است. ‫Northwind Audio مالک Kai Nakamura و یک آهنگ، Midnight Drive است.

جدول

ردیف‌ها

کلید

آنچه دربردارد

برچسب‌ها

2

label_id

نام، بودجه بازاریابی

هنرمندان

3

artist_id

نام، کدام برچسب

آهنگ‌ها

5

song_id

عنوان، کدام هنرمند، جاری‌سازی‌ها

فهرست‌های پخش

4

playlist_id

نام، دنبال‌کنندگان

PlaylistEntries

10

entry_id

کدام آهنگ در کدام فهرست پخش قرار دارد

✅ ایست بازرسی: 🎉 ready در Cloud Shell، پنج جدول در music در «کاوشگر»، و زبانه ویرایشگر پُرسمان خالی باز است.

۳. ایجاد گراف — گزینه الف: مدل‌ساز دیداری

گراف ویژگی شرحی از نحوه اتصال جدول‌ها است. می‌توانید آن را در مدل‌ساز گراف دیداری (این مرحله، همه کلیک‌ها) باهم کلیک کنید یا آن را به‌صورت SQL بنویسید (مرحله بعدی، یک جای‌گذاری). هر دو شیء یکسانی تولید می‌کنند — یکی از آن‌ها را انجام دهید، نه هر دو.

۱. ایجاد پوسته گراف

👉🌐 کنسول — در BigQuery Studio، در ردیف ایجاد جدید، منو هوش مصنوعی و دانش را باز کنید و روی گراف کلیک کنید.

👉🌐 کنسول — MusicGraph را به‌عنوان نام گراف و music را به‌عنوان مقصد گراف در مجموعه داده وارد کنید. منطقه از مجموعه داده (ایالات متحده) تکمیل می‌شود.

👉🌐 Console — در بخش منابع داده، پنج جدول — Artists (هنرمندان)، Labels (برچسب‌ها)، PlaylistEntries (ورودی‌های فهرست پخش)، Playlists (فهرست‌های پخش)، Songs (آهنگ‌ها) — را انتخاب کنید و روی ایجاد کلیک کنید.

صفحه ایجاد مدل‌ساز: نام گراف MusicGraph، مجموعه داده موسیقی، پنج جدول علامت‌گذاری‌شده

👀 بوم با پنج گره رنگی و بدون خط بین آن‌ها باز می‌شود. پانل جزئیات در سمت چپ گره‌ها (۵) و یال‌ها (۰) را فهرست می‌کند. هر گره ازقبل کلید اصلی جدول خود و همه ستون‌های آن را به‌عنوان ویژگی حمل می‌کند — برای دیدن آن‌ها روی هر گره‌ای کلیک کنید.

بوم با پنج گره، پانل «جزئیات» که «گره‌ها (۵) / لبه‌ها (۰)» را نشان می‌دهد

۲. چهار لبه را بکشید

لبه یک کلید خارجی است که کشیده شده است. هرکدام از جدولی که کلید را نگه می‌دارد به جدولی که به آن اشاره می‌کند می‌رود.

👉🌐 کنسول — روی لبه جدید کلیک کنید. در چارگوش گفتگوی انتخاب جدول، PlaylistEntries را انتخاب کنید و روی افزودن کلیک کنید. در پانل افزودن لبه:

  1. نام را روی EntryToSong تنظیم کنید.
  2. روی افزودن کلید اصلی کلیک کنید و entry_id را بپذیرید.
  3. در بخش منبع، گره منبع را روی PlaylistEntries تنظیم کنید، سپس از افزودن ستون‌های ارجاع‌شده به گره و افزودن ستون‌های ارجاع‌شده در لبه برای انتخاب entry_id برای هر دو استفاده کنید.
  4. در بخش هدف، گره هدف را روی «آهنگ‌ها» تنظیم کنید، سپس song_id را هم برای ستون‌های ارجاع‌شده در گره و هم برای ستون‌های ارجاع‌شده در لبه انتخاب کنید.
  5. روی تمام کلیک کنید.

پانل «افزودن لبه» برای «ورود به آهنگ» تکمیل شد

👉🌐 کنسول — سه بار دیگر تکرار کنید:

نام لبه

جدول

گره منبع → گره مقصد

ستون برای انتخاب در هر دو طرف

EntryToPlaylist

PlaylistEntries

PlaylistEntries → Playlists

منبع entry_id، مقصد playlist_id

SongToArtist

آهنگ‌ها

آهنگ‌ها → هنرمندان

منبع song_id، مقصد artist_id

ArtistToLabel

هنرمندان

هنرمندان → برچسب‌ها

منبع artist_id، مقصد label_id

همه لبه‌ها را بدون دارایی‌های اضافی بگذارید.

👀 پانل «جزئیات» اکنون می‌گوید لبه‌ها (۴)، و بوم زنجیره را نشان می‌دهد: برچسب‌ها ← هنرمندان ← آهنگ‌ها ← ورودی‌های فهرست پخش → فهرست‌های پخش.

بوم با پنج گره و چهار لبه، «جزئیات» لبه‌ها (۴) را نشان می‌دهد

۳. سنجه را اضافه کنید

👉🌐 کنسول — روی گره آهنگ‌ها و سپس روی نماد ویرایش (مداد) در بالای پانل «جزئیات» کلیک کنید. در بخش دارایی‌های برچسب، روی افزودن دارایی و سپس افزودن فیلد کلیک کنید.

👉🌐 کنسول — total_streams را به‌عنوان نام فیلد وارد کنید و این را در چارگوش عبارت تایپ کنید:

MEASURE(SUM(streams))

👉🌐 کنسول — روی افزودن و سپس تمام کلیک کنید.

کارت «دارایی جدید»: نام فیلد total_streams، عبارت MEASURE(SUM(streams))

۴. کدی را که نوشته است بخوانید، سپس منتشر کنید

👉🌐 کنسول — برگه کد را در پانل سمت چپ باز کنید. مدل‌ساز بیانیه CREATE PROPERTY GRAPH را برای شما نوشته است. به گره «آهنگ‌ها» پیمایش کنید: فهرست خصوصیات آن اکنون با این موارد پایان می‌یابد

MEASURE(SUM(streams)) AS `total_streams`

این کل ویژگی در یک خط است. هر چیزی که بعداز این مرحله می‌آید درباره کاری است که آن خط انجام می‌دهد.

زبانه «کد»، پیمایش‌شده به گره «ترانه‌ها»، MEASURE(SUM(streams)) AS total_streams نمایان

👉🌐 کنسول — روی منتشر کردن کلیک کنید.

✅ ایست بازرسی: در «کاوشگر»، music اکنون پوشه نمودارها دارد که حاوی MusicGraph است. روی آن کلیک کنید: پنج گره، چهار لبه، و خط MEASURE(SUM(streams)) در برگه «کد». از مرحله بعدی رد شوید و به مجموع و تجمیع، کنار هم بروید.

۴. ایجاد گراف — گزینه B: SQL

اگر نمودار را در مدل‌ساز ساخته‌اید، این مرحله را رد کنید.

👉📋 ویرایشگر پُرسمان — جای‌گذاری کنید، سپس روی اجرا کردن کلیک کنید:

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. این کار عمدی است و بعداً توضیح خواهیم داد که چرا.

ببینید چه چیزی ساخته‌اید

👉🌐 کنسول — در قاب «کاوشگر»، music، سپس نمودارها را ازهم باز کنید و روی MusicGraph کلیک کنید. صفحه گراف روی بوم با پنج گره و چهار لبه باز می‌شود. روی گرهی کلیک کنید تا ویژگی‌های آن را ببینید — معیارها با مجموع آن‌ها فهرست شده‌اند. برای دیدن بیانیه پشت تصویر، زبانه کد را باز کنید.

صفحه MusicGraph: بوم در سمت راست، برگه «کد» در سمت چپ

✅ ایست بازرسی: music پوشه نمودارها دارد که حاوی MusicGraph است و برگه «کد» MEASURE(SUM(streams)) AS total_streams را نشان می‌دهد.

۵. 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

👀 انتظار ۱۰ ردیف دارید — یک ردیف برای هر جای آگهی در PlaylistEntries، که دقیقاً همان چیزی است که «راه‌اندازی» بار کرده است. «تابستان نئونی» چهار مورد از آن‌ها را به‌خود اختصاص داده است، یکی برای هر فهرست پخشی که در آن قرار دارد، و 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

۱۲٬۶۰۰٬۰۰۰٬۰۰۰

۵٬۱۰۰٬۰۰۰٬۰۰۰

Northwind Audio

۹٬۰۰۰٬۰۰۰٬۰۰۰

۴٬۵۰۰٬۰۰۰٬۰۰۰

جدول نتایج: با مجموع ۱۲٬۶۰۰٬۰۰۰٬۰۰۰ و با تجمیع ۵٬۱۰۰٬۰۰۰٬۰۰۰ برای Cymbal Records

آن را به‌صورت دستی بررسی کنید. چهار آهنگ Cymbal به‌ترتیب ۲٫۰ میلیارد، ۱٫۵ میلیارد، ۱٫۲ میلیارد، و ۰٫۴ میلیارد جاری‌سازی داشته‌اند. این رقم ۵٫۱ میلیارد است. ‫AGG درست است. ‫SUM دو و نیم برابر بزرگ‌تر است و تک‌آهنگ Northwind دوبرابر شده است.

سه بخش جدید از دستورگان

  • ‫GRAPH_EXPAND("music.MusicGraph") تابع مقدار جدولی است که با دنبال کردن هر یال به‌عنوان LEFT JOIN، گراف را به یک جدول عریض تبدیل می‌کند. همه ستون‌ها TableLabel_property نام‌گذاری شده‌اند، بنابراین Songs_streams ستون خام از جدول «آهنگ‌ها» و Songs_total_streams سنجه‌ای است که اعلام کرده‌اید.
  • ‫SUM(Songs_streams) SQL معمولی روی آن جدول گسترده است — و هر تکراری را که مسطح‌سازی تولید کرده است به‌ارث می‌برد.
  • ‫AGG(Songs_total_streams) معیار را به همان روشی که اعلام شده است ارزیابی می‌کند: SUM(streams) یک‌بار در هر song_id، صرف‌نظر از اینکه یک آهنگ چند ردیف را در جدول گسترده اشغال می‌کند.

✅ ایست بازرسی: دو برچسب، دو ستون، و with_agg عدد با تعداد دست‌ها مطابقت دارد.

‫۶. چرا 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

👀 نتیجه:

مرحله

عنوان

جاری‌سازی

فهرست پخش

«قبل‌از» - جدول «آهنگ‌ها»

تابستان نئونی

۲٬۰۰۰٬۰۰۰٬۰۰۰

تهی

پس‌از - به فهرست‌های پخش پیوست

تابستان نئونی

۲٬۰۰۰٬۰۰۰٬۰۰۰

Gym Pump

پس‌از - به فهرست‌های پخش پیوست

تابستان نئونی

۲٬۰۰۰٬۰۰۰٬۰۰۰

پرطرفدار درحال‌حاضر

پس‌از - به فهرست‌های پخش پیوست

تابستان نئونی

۲٬۰۰۰٬۰۰۰٬۰۰۰

پاپ نوظهور

پس‌از - به فهرست‌های پخش پیوست

تابستان نئونی

۲٬۰۰۰٬۰۰۰٬۰۰۰

سفر جاده‌ای

جدول نتایج: یک ردیف «قبل» و چهار ردیف «بعد»، همه ۲٬۰۰۰٬۰۰۰٬۰۰۰

یک ردیف به چهار ردیف تبدیل شد. تعداد جاری‌سازی‌ها تغییر نکرد — کپی شد. مجموع کاری که نسخه‌های کپی برای Cymbal Records انجام داده‌اند: «تابستان نئونی» ۲ میلیارد در چهار فهرست پخش ۸ میلیارد، «تاج کاغذی» ۱٫۵ میلیارد در دو فهرست پخش ۳ میلیارد، «شات دوتایی» ۱٫۲ در یک فهرست پخش، «تیر آهسته» ۰٫۴ در یک فهرست پخش. این عدد ۱۲٫۶ میلیارد است، عددی که SUM برگرداند. ‫Northwind's Midnight Drive در دو فهرست پخش قرار دارد، بنابراین ۴٫۵ میلیارد به ۹٫۰ تبدیل شد.

این فن‌آوت است و اشکالی در پیوستن وجود ندارد. ردیف‌های فهرست پخش واقعی هستند. اشتباه این است که عددی که متعلق به یک آهنگ است را در ردیف‌هایی که متعلق به جای آگهی هستند جمع می‌کنید.

این معیار آن را اصلاح می‌کند زیرا در گره «ترانه‌ها» به‌همراه KEY (song_id) اعلام شده است. نکته کلیدی، دانه است. وقتی AGG مقدار total_streams را ارزیابی می‌کند، یک‌بار در هر کلید آهنگ تجمیع می‌شود و فقط در آن زمان به هر چیزی که براساس آن گروه‌بندی کرده‌اید جمع می‌شود.

آنچه تغییر کرده

قبلاً می‌نوشتید

با یک معیار

SUM(streams) در هر پُرسمانی که به آن نیاز دارد

‫MEASURE(SUM(streams)) یک‌بار در گراف

‫SUM(...) برای خواندن آن

‫AGG(...) برای خواندن آن — و فقط AGG

‫۳ JOIN

‫GRAPH_EXPAND()، یک جدول ساده

یک CTE که قبل‌از پیوستن تجمیع می‌کند

هیچ‌چیز. ‫KEY دانه را تعیین می‌کند

✅ ایست بازرسی: پنج ردیف — یک ردیف «قبل‌از»، چهار ردیف «بعداز» — و می‌توانید ۱۲٫۶ میلیارد را از آن‌ها بازسازی کنید.

‫۷. قانون: فقط AGG یک معیار را می‌خواند

سنجه‌ها نوع خودشان را دارند، 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 قابل‌خواندن است. ‫۱۲٫۶ میلیارد شمارش اضافی قبلی فقط می‌تواند از جمع کردن ستون داده‌های خام ناشی شود — نه از مدیریت نادرست اندازه‌گیری.

✅ ایست بازرسی: چهار خطای قرمز، و می‌توانید بگویید هرکدام کدام قانون را اجرا می‌کنند.

‫۸. هر تجمیعی که سنجه پشتیبانی می‌کند

‫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

۵٬۱۰۰٬۰۰۰٬۰۰۰

۱٬۲۷۵٬۰۰۰٬۰۰۰

۴۰۰٬۰۰۰٬۰۰۰

۲٬۰۰۰٬۰۰۰٬۰۰۰

4

2

۱٬۲۷۵٬۰۰۰٬۰۰۰

Northwind Audio

۴٬۵۰۰٬۰۰۰٬۰۰۰

۴٬۵۰۰٬۰۰۰٬۰۰۰

۴٬۵۰۰٬۰۰۰٬۰۰۰

۴٬۵۰۰٬۰۰۰٬۰۰۰

1

1

۴٬۵۰۰٬۰۰۰٬۰۰۰

جدول نتایج هفت‌ستونی، هر دو برچسب

هر عدد برای چهار آهنگ Cymbal و یک آهنگ Northwind محاسبه می‌شود — نه برای ده ردیف جای آگهی. به‌طور خاص، AVG در جهت دیگر اشتباه خواهد بود: میانگین‌گیری ستون خام در ردیف‌های جای آگهی، ۱٫۵۷۵ میلیارد برای «سنج» به‌دست می‌دهد، زیرا ۲ میلیارد «تابستان نئونی» چهار بار محاسبه می‌شود.

بنابراین «جایگزین کردن SUM با AGG» درواقع دو تصمیم است. وقتی سنجه را اعلام می‌کنید، همچنان انتخاب می‌کنید که کدام‌یک از شش تجمیع است. وقتی آن را می‌خوانید، تابع همیشه AGG است.

✅ ایست بازرسی: یک ردیف برای هر برچسب، هفت عدد در هر ردیف، و streams_per_song برابر با avg_streams.

‫۹. گروه‌بندی را تغییر دهید، نه اندازه‌گیری را

همان سنجه به سؤال دیگری پاسخ می‌دهد. به‌جای برچسب، براساس فهرست پخش گروه‌بندی کنید.

👉📋 ویرایشگر پُرسمان — جای‌گذاری کنید، سپس روی اجرا کردن کلیک کنید:

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

جاری‌سازی

آهنگ

سفر جاده‌ای

۶٬۹۰۰٬۰۰۰٬۰۰۰

3

Gym Pump

۶٬۵۰۰٬۰۰۰٬۰۰۰

2

پرطرفدار درحال‌حاضر

۴٬۷۰۰٬۰۰۰٬۰۰۰

3

پاپ نوظهور

۳٬۵۰۰٬۰۰۰٬۰۰۰

2

شبکه نتایج، «سفر جاده‌ای» با ۶٬۹۰۰٬۰۰۰٬۰۰۰ در بالا

دو خط AGG دقیقاً همان خطوط SUM و AGG هستند که در کنار هم قرار گرفته‌اند. فقط GROUP BY منتقل شد. «سفر جاده‌ای» شامل «تابستان نئونی»، «رانندگی نیمه‌شب»، و «تیر آهسته» است و هر آهنگ یک بار در آن فهرست پخش محاسبه می‌شود — که دقیقاً همان چیزی است که «جاری‌سازی‌های رسیدن به این فهرست پخش» باید به آن معنا باشد.

فردی که این معیار را نوشته است یک‌بار دانه را تعیین کرده است. هر پُرسمان بعدی، توسط هر کسی، آن را به ارث می‌برد.

✅ ایست بازرسی: «سفر جاده‌ای» با ۶٫۹ میلیارد در صدر قرار دارد.

‫۱۰. ببینید 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

شناور

درست

Songs_distinct_artists

عدد صحیح

درست

PlaylistEntries_placement_count

عدد صحیح

درست

سلول JSON تکی، به‌اندازه کافی ازهم بازشده است تا is_measure true را نشان دهد

هر شرح یا مترادفی که برای دارایی تنظیم می‌کنید نیز در اینجا نشان داده می‌شود. مرحله اختیاری گپ نشان می‌دهد چه کسی آن‌ها را می‌خواند.

✅ ایست بازرسی: رشته JSON با is_measure در هر ستونی که با MEASURE اعلام کرده‌اید.

‫۱۱. آنچه GRAPH_EXPAND از شکل یک گراف نیاز دارد

چیزی برای اجرا در این مرحله وجود ندارد — فقط بخوانید. ‫GRAPH_EXPAND جدول عریض خود را با زنجیره‌ای از LEFT JOIN می‌سازد، از یک جدول شروع می‌کند و لبه‌ها را به‌سمت بیرون دنبال می‌کند. سه قانون از آن پیروی می‌کند و MusicGraph همه آن‌ها را برآورده می‌کند.

شکل GRAPH_EXPAND به این موارد نیاز دارد: PlaylistEntries به‌عنوان ریشه تکی، چهار لبه یک به چند به بیرون، و جفت Songs–Playlists چند به چند به گره ارتقا یافته است

دقیقاً یک جدول گره ریشه. ریشه جدول گرهی است که کلید آن در هیچ جدول دیگری ظاهر نمی‌شود — جدولی که هیچ لبه‌ای به آن اشاره نمی‌کند. در MusicGraph که PlaylistEntries است: منبع دو لبه و مقصد هیچ لبه‌ای نیست. جدول عریض ۱۰ ردیف دارد، یک ردیف برای هر جای آگهی.

هر لبه یک‌به‌چند است، از منبع به مقصد. هر ورودی یک آهنگ و یک فهرست پخش دارد، هر آهنگ یک هنرمند دارد، هر هنرمند یک برچسب دارد. به همین دلیل است که جدول عریض هرگز فراتر از ردیف‌های ریشه گسترش نمی‌یابد. داده‌هایی که ریشه نمی‌تواند به آن‌ها دسترسی پیدا کند نمایش داده نمی‌شود: آهنگی که جایگاه ندارد در جدول گسترده وجود نخواهد داشت.

روابط چند به چند به گره تبدیل می‌شوند. آهنگ‌ها و فهرست‌های پخش بسیاری به بسیاری هستند. اگر جدول پیوند را به‌عنوان یک لبه واحد از «قطعه‌های موسیقی» به «فهرست‌های پخش» اعلام کنید، GRAPH_EXPAND آن را به‌عنوان مبهم نادیده می‌گیرد و چون لبه قابل‌استفاده‌ای باقی نمی‌ماند، ناموفق خواهد بود. ارتقا دادن PlaylistEntries به جدول گره با دو لبه یک‌به‌چند خارج از آن الگوی مستند است و همان کاری است که هنگام ساختن گراف انجام دادید.

‫۱۲. (اختیاری) مسیرها با GQL

تاکنون پاسخ همه سؤالات عدد بوده است. این یکی ندارد. جریان‌های Cymbal به کجا می‌رسند؟ سؤالی درباره مسیرها در نمودار است و مجموع نمی‌تواند به آن پاسخ دهد — تا زمانی که جمع کنید، مسیر ازبین رفته است.

۱. بپرسید جاری‌سازی‌ها کجا قرار می‌گیرند

👉📋 ویرایشگر پُرسمان — جای‌گذاری کنید، سپس روی اجرا کردن کلیک کنید:

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

آهنگ

پرطرفدار درحال‌حاضر

۳۵٬۰۰۰٬۰۰۰

۴٬۷۰۰٬۰۰۰٬۰۰۰

Double Shot (شات دوتایی)، Neon Summer (تابستان نئونی)، Paper Crown (تاج کاغذی)

پاپ نوظهور

۲٬۰۰۰٬۰۰۰

۳٬۵۰۰٬۰۰۰٬۰۰۰

تابستان نئونی، تاج کاغذی

سفر جاده‌ای

۵٬۰۰۰٬۰۰۰

۲٬۴۰۰٬۰۰۰٬۰۰۰

تابستان نئونی، پیکان آهسته

Gym Pump

۳٬۰۰۰٬۰۰۰

۲٬۰۰۰٬۰۰۰٬۰۰۰

تابستان نئونی

نتیجه GQL: چهار فهرست پخش با جاری‌سازی‌هایی که به هرکدام می‌رسند

خط MATCH را به‌عنوان جمله بخوانید: از برچسب شروع کنید، به هنرمندان آن برگردید، به آهنگ‌های آن‌ها برگردید، به ورودی‌های فهرست پخشی که آن آهنگ‌ها در آن قرار دارند برگردید، سپس به فهرست‌های پخش بروید. جهت فلش‌ها نشان‌دهنده نحوه اعلام لبه‌ها است؛ <- یکی را به عقب می‌برد.

اکنون ستون سوم را اضافه کنید. ۱۲٫۶ میلیارد — عددی که SUM در مرحله چهارم به شما داد، همان عدد اشتباه.

اینجا درست است. در آن زمان، سؤال این بود که Cymbal چقدر جاری‌سازی داشته است، و یک آهنگ صرف‌نظر از اینکه در چند فهرست پخش قرار داشته باشد، یک بار حساب می‌شد. این پرسش این است که این جاری‌سازی‌ها به کجا می‌رسند، و یک آهنگ در چهار فهرست پخش واقعاً به چهار مخاطب می‌رسد. تکرار GRAPH_EXPAND خطایی برای یک سؤال و پاسخ به سؤال دیگر است. AGG هرگز درباره بد بودن موارد تکراری نبوده است — بلکه درباره مطابقت دادن محاسبات با سؤال بوده است.

۲. مسیرها را برمی‌گرداند

انبوهش را رها کنید و مسیرها را درخواست کنید.

👉📋 ویرایشگر پُرسمان — جای‌گذاری کنید، سپس روی اجرا کردن کلیک کنید:

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، با برگه «گراف» در قاب نتایج

هشت ردیف برای چهار آهنگ، زیرا مسیر براساس جای آگهی وجود دارد، نه براساس آهنگ.

۳. باز کردن زبانه «نمودار»

👉🌐 کنسول — بالای نتایج، روی نمودار کلیک کنید.

این برگه فقط زمانی ظاهر می‌شود که نتیجه‌ای حاوی عناصر گراف باشد. پُرسمان قبلی اعداد را برگرداند، بنابراین برگه «گراف» نداشت؛ این پُرسمان مسیرها را برمی‌گرداند، بنابراین برگه «گراف» دارد.

زبانه «نمودار» که زیرگراف Cymbal را در چیدمان نیرو رسم می‌کند

گوشه نمودار Cymbal را به‌صورت چیدمان نیرویی دریافت می‌کنید، با تعداد گره‌ها و لبه‌های موجود در نما و یک تراشه برای هر برچسب. گره‌ای را بکشید تا چیدمان ازهم جدا شود؛ روی گره‌ای کلیک کنید تا ویژگی‌های آن را بخوانید.

✅ ایست بازرسی: ستون سوم اولین پُرسمان به ۱۲٫۶ میلیارد می‌رسد، پُرسمان دوم ۸ مسیر را برمی‌گرداند، و برگه «نمودار» آن‌ها را رسم می‌کند.

‫۱۳. (اختیاری) گپ زدن با نمودار

در این مرحله SQL وجود ندارد. عامل‌های داده BigQuery می‌توانند از گراف به‌عنوان منبع دانش خود استفاده کنند و مستندات می‌گوید که آن‌ها از معیارها برای تجمیع چندسطحی استفاده می‌کنند. بیایید ببینیم این درست است یا نه.

۱. ایجاد عامل

👉🌐 کنسول — در منو پیمایش BigQuery در سمت راست، روی عامل‌ها، سپس کاتالوگ عامل، سپس ایجاد عامل کلیک کنید.

👉🌐 کنسول — Music graph agent را در نام نماینده تایپ کنید و این را در شرح نماینده تایپ کنید:

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

👉🌐 Console — در بخش منابع دانش، روی افزودن منبع کلیک کنید. در کادر گفتگوی انتخاب منابع، پروژه خود را ازهم باز کنید، music را ازهم باز کنید، نمودارها را ازهم باز کنید، MusicGraph را علامت بزنید، و روی تأیید کلیک کنید.

👀 دکمه افزودن منبع خاکستری می‌شود. کارگزار می‌تواند حداکثر یک گراف داشته باشد و نمی‌تواند گراف‌ها را با جدول‌ها ترکیب کند.

کادر گفتگوی «انتخاب منابع» با علامت زدن MusicGraph و «انتخاب‌شده (۱)»

👉🌐 کنسول — منطقه را همان‌گونه که از مکان نمودار تنظیم شده است بگذارید. روی ذخیره کردن و سپس منتشر کردن کلیک کنید. در پانل انتشار کانال‌ها، روی انتشار عامل کلیک کنید و تأیید را ببندید.

۲. سؤال را بپرسید

👉🌐 کنسول — روی ایجاد مکالمه کلیک کنید. صفحه گپی باز می‌شود. این را در چارگوش پرسیدن سؤال در پایین تایپ کنید و کلید Enter را فشار دهید:

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

👀 نماینده جدولی و خلاصه‌ای یک‌جمله‌ای برمی‌گرداند:

label_name

total_streams

playlist_placements

Cymbal Records

۵٬۱۰۰٬۰۰۰٬۰۰۰

8

Northwind Audio

۴٬۵۰۰٬۰۰۰٬۰۰۰

2

پاسخ نماینده: جدول به‌همراه خلاصه یک جمله‌ای آن

۵٫۱ میلیارد. هیچ‌کس به کارگزار درباره توزیع گسترده نگفته بود و در آن قرار نگرفت.

۳. خواندن پُرسمانی که نوشته است

👉🌐 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) و SQL آن

این مورد به‌تنهایی از GRAPH_EXPAND و AGG استفاده کرد، زیرا این سنجه‌ها در طرحواره‌ای که خوانده بود وجود داشت. هیچ‌چیز در شرح کارگزار به آن‌ها اشاره نمی‌کند.

✅ ایست بازرسی: ۵٫۱ میلیارد در پاسخ گپ، و AGG(...) در SQL کار.

‫۱۴. مرتب‌سازی

👉💻 Cloud Shell — مجموعه داده، جدول‌های آن، و گراف دارایی را رها کنید:

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

👀 منتظر ✓ dropped YOUR_PROJECT_ID.music (tables and graph) باشید.

اگر عامل داده اختیاری را ایجاد کرده‌اید، آن را در کنسول در بخش عامل‌ها → کاتالوگ عامل حذف کنید. و اگر ./setup_project.sh پروژه‌ای فقط برای این آزمایشگاه ایجاد کرده است، مرتب‌ترین پاک‌سازی این است که کل پروژه را تعطیل کنید — شناسه در ~/project_id.txt است.

‫۱۵. تبریک می‌گوییم

یک خط، MEASURE(SUM(streams))، را اعلام کردید و آن خط ۱۲٫۶ میلیارد را به ۵٫۱ میلیارد تغییر داد — برای شما و برای هر پُرسمانی که هر کسی پس‌از آن دربرابر آن گراف می‌نویسد، ازجمله پُرسمان‌هایی که یک نماینده می‌نویسد.

آنچه آموختید

  • سنجه‌ای یک تجمیع است که در گره‌ای، در کنار KEY که دانه آن را تنظیم می‌کند، اعلام می‌شود.
  • ‫GRAPH_EXPAND نمودار را به یک جدول پهن با TableLabel_property ستون مسطح می‌کند.
  • ‫AGG تنها تابعی است که مقدار را می‌خواند و سیستم نوع آن را به چهار روش مختلف اعمال می‌کند.
  • ‫۶ تجمیع دردسترس است و AGG نتیجه مقدار معمولی است که می‌توانید تقسیم کنید.
  • تغییر GROUP BY بدون دست زدن به معیار، سؤال را دوباره می‌پرسد.
  • ‫GRAPH_EXPAND یک ریشه، لبه‌های یک به چند، و اتصال‌های ارتقایافته به گره‌ها می‌خواهد.

جدول تصمیم

نشانه

علت

رفع اشکال

مجموعی که خیلی بزرگ است

‫SUM روی ستون بادبزنی

اعلام کردن یک میزان، خواندن آن با AGG

«MEASURE موردانتظار بود، INT64 پیدا شد»

‫AGG روی ستون ساده

از SUM استفاده کنید، یا معیار را اعلام کنید

«برگرداندن عبارت‌های نوع MEASURE مجاز نیست»

ستون اندازه‌گیری بدون AGG

پیچیدن آن: AGG(...)

«توسط نوع عنصر آشکار نشده است»

سنجه ارجاع‌شده در GQL

فقط GRAPH_EXPAND از اقدامات زنده عقب است

‫GRAPH_EXPAND لبه‌ای را نادیده می‌گیرد یا ناموفق است

اتصال به‌عنوان لبه مدل‌سازی شده است

ارتقا دادن جدول پیوند به گره

عدد قدیمی پس‌از تغییر گراف

نتیجه ذخیره‌شده

پاک کردن استفاده از نتایج ذخیره‌شده در حافظه نهان

آنچه (به‌عمد) پوشش ندادیم

توضیحات و مترادف‌های دارایی‌ها · پُرسمان‌های تأییدشده و واژه‌نامه‌های مأموران داده · GQL فراتر از یک MATCH · سنجه‌ها در بیش‌از یک نمودار. هرکدام آزمایشگاه خودشان هستند.

بیشتر بدانید