เริ่มต้นใช้งานเมตริกกราฟ BigQuery

1. ภาพรวม

ข้อบกพร่องของ SQL ส่วนใหญ่ที่ผ่านการตรวจสอบโค้ดมาได้มักเป็นข้อบกพร่องในการรวบรวม ตัวเลขในตารางที่อยู่ถูกต้อง แต่การรวมจะคัดลอกตัวเลขนั้น และผลรวมจะผิดโดยไม่มีใครทราบ

BigQuery Graph ช่วยให้คุณอธิบายวิธีเชื่อมต่อตารางได้เพียงครั้งเดียวในรูปแบบกราฟพร็อพเพอร์ตี้ จากนั้นจึงค้นหาการเชื่อมต่อ การวัดกราฟจะเพิ่มอีกสิ่งหนึ่งลงในคำอธิบายนั้น นั่นคือการรวม คุณประกาศ MEASURE(SUM(streams)) ในโหนดที่เป็นเจ้าของหมายเลข และทุกคำค้นหาที่อ่านกราฟจะได้รับผลรวมที่ถูกต้องในระดับที่เหมาะสม โดยไม่ต้องใช้เทคนิค GROUP BY หรือ CTE ที่ต้องจดจำ

ในโค้ดแล็บนี้ คุณจะสร้างแคตตาล็อกเพลง 5 ตาราง ใส่เมตริกลงในแคตตาล็อก และดูคำถามเดียวกันที่ให้คำตอบที่แตกต่างกัน 2 คำตอบ ได้แก่ 12,600 ล้านด้วย SUM และ 5,100 ล้านด้วย AGG ช่องว่างคือรูปร่างของแคตตาล็อก ซึ่งเพลงที่อยู่ในเพลย์ลิสต์ 4 รายการจะกลายเป็น 4 แถวเมื่อกราฟแบนราบ และ SUM จะเพิ่มทั้ง 4 แถว จากนั้นคุณก็เรียนรู้กฎที่ทำให้ประโยคที่ 2 ถูกต้อง

คัดลอกแถวเพลง 1 แถวลงในแถวตําแหน่ง 4 แถว: SUM จะเพิ่มสําเนา AGG จะยุบตาม song_id

ส่วนที่คุณจะพิมพ์

Lab นี้ใช้สถานที่ 2 แห่งตามลำดับต่อไปนี้

ที่ไหน

สิ่งที่คุณทำที่นั่น

1

เทอร์มินัล Cloud Shell

คำสั่งเพียงไม่กี่คำสั่งในขั้นตอนการตั้งค่าเท่านั้น

2

คอนโซล BigQuery

อื่นๆ ทั้งหมด: วางคำค้นหาลงในเครื่องมือแก้ไขคำค้นหา คลิกผ่านเครื่องมือสร้างโมเดลกราฟ แชทกับตัวแทน

คำสั่งทุกคำสั่งจะได้รับการติดแท็กเพื่อให้คุณทราบเสมอว่าคำสั่งนั้นหมายถึงอะไร

  • 👉💻 Cloud Shell — พิมพ์คำสั่งนี้ในเทอร์มินัล Cloud Shell
  • 👉📋 เครื่องมือแก้ไขการค้นหา - วางลงในเครื่องมือแก้ไขการค้นหา BigQuery แล้วคลิกเรียกใช้
  • 👉🌐 Console — คลิกไปรอบๆ ในคอนโซล BigQuery ไม่ต้องพิมพ์อะไร เว้นแต่ขั้นตอนจะระบุไว้
  • 👀 — ดูผลลัพธ์

สิ่งที่คุณจะได้เรียนรู้

  • วิธีประกาศการวัดผลในตารางโหนดในตัวสร้างกราฟแบบภาพหรือใน SQL
  • วิธีที่ GRAPH_EXPAND ทำให้กราฟกลายเป็นตารางกว้าง 1 ตาราง
  • เหตุผลที่ AGG เป็นฟังก์ชันเดียวที่อ่านเมตริกได้ และสิ่งที่ระบบตอบกลับเมื่อพยายามใช้ฟังก์ชันอื่น
  • การรวม 6 รายการที่การวัดรองรับ และวิธีดำเนินการทางคณิตศาสตร์ในการรวมเหล่านั้น
  • วิธีที่เมตริกหนึ่งตอบคำถามที่จัดกลุ่มแตกต่างกันโดยไม่มีการเปลี่ยนแปลง
  • ไม่บังคับ: วิธีที่ GQL และแท็บกราฟตอบคำถามที่ผลรวมตอบไม่ได้ และวิธีที่ตัวแทนข้อมูล BigQuery ใช้เมตริกโดยไม่ต้องบอก

สิ่งที่คุณต้องมี

  • บัญชี Google ที่มีการเรียกเก็บเงินและเบราว์เซอร์ คุณไม่จำเป็นต้องมีโปรเจ็กต์ Google Cloud ตั้งแต่แรก เนื่องจากการตั้งค่าจะสร้างโปรเจ็กต์ให้คุณ
  • สำหรับขั้นตอนการแชทที่ไม่บังคับเท่านั้น: เปิดใช้ Gemini Data Analytics API และบทบาทผู้สร้างตัวแทนข้อมูล Gemini Data Analytics

คุณไม่จำเป็นต้องติดตั้งอะไรในเครื่อง ทุกอย่างจะทำงานใน Cloud Shell และคอนโซล BigQuery

สถานะและต้นทุนผลิตภัณฑ์

BigQuery Graph พร้อมให้บริการแก่ผู้ใช้ทั่วไปแล้ว เมตริกกราฟ เครื่องมือสร้างโมเดลกราฟแบบภาพ การแสดงภาพกราฟ และการใช้กราฟเป็นแหล่งความรู้ของเอเจนต์ข้อมูลอยู่ในเวอร์ชันตัวอย่าง ซึ่งครอบคลุมโดยข้อกำหนดของข้อเสนอก่อนเวอร์ชันสำหรับผู้ใช้ทั่วไป

GRAPH_EXPAND และ AGG ทำงานภายใต้การกำหนดราคาแบบออนดีมานด์ การค้นหา GQL (ขั้นตอนเส้นทางที่ไม่บังคับ) ต้องมีการจองที่ใช้รุ่น Enterprise หรือ Enterprise Plus ตามเอกสารประกอบ ซึ่งเป็นเหตุผลที่ทำให้ขั้นตอนนี้ไม่บังคับ

ชุดข้อมูลมีขนาดไม่กี่กิโลไบต์ ภายใต้การกำหนดราคาแบบออนดีมานด์ ระบบจะเรียกเก็บเงินสำหรับการค้นหาแต่ละครั้งที่ขั้นต่ำ 10 MB ดังนั้น Codelab ทั้งหมดจึงมีค่าใช้จ่ายเพียงเศษเสี้ยวของเซ็นต์

2. ตั้งค่า

นี่เป็นขั้นตอนเดียวที่ใช้ Cloud Shell โดยจะสร้างโปรเจ็กต์ เปิดการเรียกเก็บเงินในโปรเจ็กต์ และสร้างตารางดิบ คุณสามารถเรียกใช้กราฟ เมตริก และการค้นหาทั้งหมดได้ในภายหลังในคอนโซล BigQuery

แต่สิ่งหนึ่งที่แล็บนี้ไม่สามารถมอบให้คุณได้คือโปรเจ็กต์ Google Cloud ที่มีการเรียกเก็บเงิน ขั้นตอนที่ 1 จะช่วยให้คุณมีบัญชีที่ชำระเงินได้ ส่วนขั้นตอนที่ 4 จะเปลี่ยนบัญชีนั้นให้เป็นโปรเจ็กต์ ทำตามลำดับนั้น โดยทุกขั้นตอนหลังจากขั้นตอนที่ 4 จะอ่านโปรเจ็กต์ที่ขั้นตอนที่ 4 สร้างขึ้น

1 · สร้างบัญชีที่มีการเรียกเก็บเงิน (~1 นาที)

👉🌐 ทำสิ่งนี้ก่อนสิ่งอื่นใด ลงชื่อเข้าใช้ด้วยบัญชี Google ที่เปิดใช้การเรียกเก็บเงิน บัญชีดังกล่าวใช้ได้ หากยังไม่มี ให้เริ่มทดลองใช้ฟรี ซึ่งจะให้บัญชีสำหรับการเรียกเก็บเงินแก่คุณ ซึ่งเป็นสิ่งเดียวที่ขั้นตอนที่ 4 ต้องการ

2 · เปิด Cloud Shell (~1 นาที)

👉🌐 Console — คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud ซึ่งเป็นไอคอนรูปเทอร์มินัลในส่วนหัว เทอร์มินัลจะเปิดขึ้นที่ด้านล่างของหน้า

เปิดใช้งาน Cloud Shell จากส่วนหัวของคอนโซล Google Cloud

👉🌐 Console — หากระบบแจ้งให้คุณให้สิทธิ์ในวันนี้ ให้คลิกให้สิทธิ์เพื่อดำเนินการต่อ

👉💻 Cloud Shell — ตรวจสอบว่า Cloud Shell ลงชื่อเข้าใช้ด้วยบัญชีใด

gcloud auth list

👀 คาดว่าบัญชีของคุณเองจะมีเครื่องหมาย * และต้องเป็นบัญชีเดียวกับที่คุณใช้ลงชื่อเข้าใช้ในขั้นตอนที่ 1 หากไม่ใช่ ให้เรียกใช้ gcloud auth login แล้วเลือกรายการที่ถูกต้อง

3 · รับห้องทดลอง (~1 นาที)

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

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 คือรหัสโปรเจ็กต์ของคุณ ซึ่งจะมีตัวเลขต่างกัน โดยมี 4 สิ่งที่เกิดขึ้นในนั้น

การเรียกเก็บเงิน

ใช้บัญชี [YYYY-MM-DD] GDP Credit: ที่ใหม่ที่สุดหากคุณมีบัญชีดังกล่าว และใช้บัญชีสำหรับการเรียกเก็บเงินอื่นๆ ที่เปิดอยู่หากไม่มี

project

สร้าง bq-graph-XXXX และลิงก์บัญชีสำหรับการเรียกเก็บเงินนั้นกับ

เลือก

เขียนรหัสไปยัง ~/project_id.txt และเรียกใช้ gcloud config set project ดังนั้นหลังจากนี้จึงไม่มีการขอให้คุณพิมพ์รหัส

รอ

จนกว่าโปรเจ็กต์ใหม่จะได้รับอนุญาตให้แสดงโฆษณา ซึ่งอาจใช้เวลาสูงสุด 2 นาที

🌐 ตอนนี้โปรเจ็กต์เดียวกันนี้อยู่ในคอนโซลแล้ว โดยรหัสจะอยู่ในการ์ดข้อมูลโปรเจ็กต์ในแดชบอร์ด

รหัสโปรเจ็กต์ในแดชบอร์ดของคอนโซล

5 · สร้างชุดข้อมูล (~3 นาที)

👉💻 Cloud Shell - สคริปต์อีกรายการจะสร้างตาราง

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

สคริปต์จะพิมพ์แต่ละขั้นตอนขณะทำงาน โดยจะดำเนินการตามลำดับดังนี้

project

อ่านโปรเจ็กต์จาก gcloud config และปฏิเสธที่จะดำเนินการต่อหากไม่มี

API

เปิดใช้ bigquery.googleapis.com

ชุดข้อมูล

สร้างชุดข้อมูล music ในแบบหลายภูมิภาคของสหรัฐอเมริกาและตาราง 5 ตาราง โดยแต่ละตารางมี 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 เสร็จแล้ว คุณปิดได้

6 · เปิด BigQuery และเครื่องมือแก้ไขการค้นหา

👉🌐 Console - คลิกที่ลิงก์ท้ายเอาต์พุต หรือเปิด BigQuery จากเมนูการนำทาง ในบานหน้าต่าง Explorer ทางด้านซ้าย ให้ขยายโปรเจ็กต์: ชุดข้อมูล music ที่มี 5 ตาราง

แผง Explorer, เพลงที่ขยาย: ศิลปิน, ค่ายเพลง, รายการเพลย์ลิสต์, เพลย์ลิสต์, เพลง

👉🌐 Console - ที่ด้านบนของ BigQuery Studio ในแถวสร้างใหม่ ให้คลิกข้อความค้นหา SQL แท็บเครื่องมือแก้ไขที่ว่างเปล่าจะเปิดขึ้น

สร้างแถวใหม่ด้วยการค้นหา SQL และแท็บเอดิเตอร์ว่างเปล่าด้านล่าง

เก็บแท็บนี้ไว้ บล็อก 👉📋 ทุกบล็อกในแล็บนี้จะอยู่ที่นี่ เลือกทุกอย่างในเอดิเตอร์ วางบล็อกใหม่ทับ แล้วคลิกเรียกใช้ ผลลัพธ์จะปรากฏในแผงด้านล่าง

ทำความรู้จักกับตาราง

มี 2 สิ่งเกี่ยวกับตารางเหล่านี้ที่สำคัญในภายหลัง ทุกตารางจะประกาศคีย์หลักเป็น NOT ENFORCED: BigQuery ไม่ได้ตรวจสอบคีย์หลัก แต่กราฟพร็อพเพอร์ตี้ที่คุณกำลังจะสร้างต้องมีคีย์ที่ชัดเจนเพื่อทราบว่าอะไรที่ระบุแถว และตารางสุดท้าย PlaylistEntries คือตารางเชื่อม ซึ่งเพลงที่อยู่ในเพลย์ลิสต์ 4 รายการจะมี 4 แถวในตารางนี้ ตารางนั้นเป็นที่ที่เรื่องราวทั้งหมดเกิดขึ้น

ตารางจะเชื่อมโยงกันดังนี้ ค่ายเพลงเซ็นสัญญากับศิลปิน ศิลปินปล่อยเพลง และเพลงจะอยู่ในเพลย์ลิสต์ผ่าน PlaylistEntries Cymbal Records เป็นเจ้าของ Ava Sterling และ Mina Okafor รวมถึงเพลง 4 เพลงของศิลปินทั้ง 2 Northwind Audio เป็นเจ้าของ Kai Nakamura และเพลง Midnight Drive

โต๊ะ

แถว

แป้น

สิ่งที่เก็บไว้

ป้ายกำกับ

2

label_id

ชื่อ งบประมาณด้านการตลาด

ศิลปิน

3

artist_id

ชื่อ ป้ายกำกับ

เพลง

5

song_id

ชื่อเพลง ศิลปิน สตรีม

เพลย์ลิสต์

4

playlist_id

name, followers

PlaylistEntries

10

entry_id

เพลงใดอยู่ในเพลย์ลิสต์ใด

✅ จุดตรวจสอบ: 🎉 ready ใน Cloud Shell, ตาราง 5 ตารางใน music ใน Explorer และแท็บเครื่องมือแก้ไขคำค้นหาที่ว่างเปล่าเปิดอยู่

3. สร้างกราฟ - ตัวเลือก ก: เครื่องมือสร้างโมเดลภาพ

กราฟพร็อพเพอร์ตี้คือคำอธิบายว่าตารางเชื่อมต่อกันอย่างไร คุณคลิกได้ในโปรแกรมสร้างโมเดลกราฟแบบภาพ (ขั้นตอนนี้ คลิกทั้งหมด) หรือเขียนเป็น SQL (ขั้นตอนถัดไป วาง 1 ครั้ง) ทั้ง 2 วิธีจะสร้างออบเจ็กต์เดียวกัน ให้เลือกใช้วิธีใดวิธีหนึ่ง ไม่ใช่ทั้ง 2 วิธี

1. สร้างเชลล์กราฟ

👉🌐 Console - ใน BigQuery Studio ให้เปิดเมนู AI และความรู้ ในแถวสร้างใหม่ แล้วคลิกกราฟ

👉🌐 Console — ป้อน MusicGraph เป็นชื่อกราฟ และ music เป็นปลายทางกราฟในชุดข้อมูล ภูมิภาคจะมาจากชุดข้อมูล (สหรัฐอเมริกา)

👉🌐 Console — ในส่วนแหล่งข้อมูล ให้เลือกตารางทั้ง 5 ตาราง ได้แก่ ศิลปิน ค่าย เพลย์ลิสต์ เพลย์ลิสต์ และเพลง แล้วคลิกสร้าง

modeler create page: Graph name MusicGraph, dataset music, five tables ticked

👀 Canvas จะเปิดขึ้นพร้อมกับโหนดสี 5 โหนดและไม่มีเส้นเชื่อมระหว่างโหนด แผงรายละเอียดทางด้านขวาจะแสดงรายการโหนด (5) และขอบ (0) แต่ละโหนดมีคีย์หลักของตารางและคอลัมน์ทั้งหมดเป็นพร็อพเพอร์ตี้อยู่แล้ว เพียงคลิกโหนดใดก็ได้เพื่อดู

Canvas ที่มี 5 โหนด แผงรายละเอียดแสดงโหนด (5) / ขอบ (0)

2. วาดขอบทั้ง 4 ด้าน

ขอบคือคีย์นอกที่วาด แต่ละรายการจะไปจากตารางที่มีคีย์ไปยังตารางที่ชี้

👉🌐 Console - คลิก New edge ในกล่องโต้ตอบเลือกตาราง ให้เลือก PlaylistEntries แล้วคลิกเพิ่ม ในแผงเพิ่มขอบ ให้ทำดังนี้

  1. ตั้งค่าชื่อเป็น EntryToSong
  2. คลิกเพิ่มคีย์หลัก แล้วยอมรับ entry_id
  3. ในส่วนแหล่งที่มา ให้ตั้งค่าโหนดแหล่งที่มาเป็น PlaylistEntries จากนั้นใช้เพิ่มคอลัมน์ที่อ้างอิงไปยังโหนดและเพิ่มคอลัมน์ที่อ้างอิงในขอบเพื่อเลือก entry_id สำหรับทั้ง 2 รายการ
  4. ในส่วนเป้าหมาย ให้ตั้งค่าโหนดเป้าหมายเป็นเพลง แล้วเลือก song_id สำหรับทั้งคอลัมน์ที่อ้างอิงในโหนดและคอลัมน์ที่อ้างอิงในขอบ
  5. คลิกเสร็จสิ้น

กรอกแผง "เพิ่มขอบ" สำหรับ EntryToSong

👉🌐 Console — ทำซ้ำอีก 3 ครั้ง

ชื่อ Edge

โต๊ะ

โหนดต้นทาง → โหนดปลายทาง

คอลัมน์ที่จะเลือกทั้ง 2 ด้าน

EntryToPlaylist

PlaylistEntries

PlaylistEntries → Playlists

แหล่งที่มา entry_id, เป้าหมาย playlist_id

SongToArtist

เพลง

เพลง → ศิลปิน

แหล่งที่มา song_id, เป้าหมาย artist_id

ArtistToLabel

ศิลปิน

ศิลปิน → ค่ายเพลง

แหล่งที่มา artist_id, เป้าหมาย label_id

ปล่อยให้ขอบทุกขอบไม่มีพร็อพเพอร์ตี้เพิ่มเติม

👀 ตอนนี้แผงรายละเอียดจะแสดงขอบ (4) และ Canvas จะแสดงเชนดังนี้ ค่ายเพลง ← ศิลปิน ← เพลง ← รายการในเพลย์ลิสต์ → เพลย์ลิสต์

Canvas ที่มี 5 โหนดและ 4 ขอบ รายละเอียดแสดงขอบ (4)

3. เพิ่มการวัด

👉🌐 Console - คลิกโหนดเพลง แล้วคลิกไอคอนแก้ไข (ดินสอ) ที่ด้านบนของแผงรายละเอียด ในส่วนพร็อพเพอร์ตี้ของป้ายกำกับ ให้คลิกเพิ่มพร็อพเพอร์ตี้ แล้วคลิกเพิ่มช่อง

👉🌐 Console — ป้อน total_streams เป็นชื่อฟิลด์ แล้วพิมพ์ข้อความนี้ลงในช่องนิพจน์

MEASURE(SUM(streams))

👉🌐 Console — คลิกเพิ่ม แล้วคลิกเสร็จสิ้น

การ์ดพร็อพเพอร์ตี้ใหม่: ชื่อฟิลด์ total_streams, นิพจน์ MEASURE(SUM(streams))

4. อ่านโค้ดที่โมเดลเขียนขึ้น แล้วเผยแพร่

👉🌐 Console - เปิดแท็บโค้ดในแผงด้านขวา โมเดลเลอร์ได้เขียนข้อความ CREATE PROPERTY GRAPH ให้คุณแล้ว เลื่อนไปที่โหนดเพลง รายการพร็อพเพอร์ตี้จะลงท้ายด้วย

MEASURE(SUM(streams)) AS `total_streams`

นั่นคือฟีเจอร์ทั้งหมดในบรรทัดเดียว ทุกอย่างหลังจากขั้นตอนนี้คือสิ่งที่บรรทัดนั้นทำ

แท็บโค้ด เลื่อนไปที่โหนด Songs, MEASURE(SUM(streams)) AS total_streams ที่มองเห็นได้

👉🌐 Console — คลิกเผยแพร่

✅ จุดตรวจสอบ: ใน Explorer music มีโฟลเดอร์ Graphs ที่มี MusicGraph แล้ว คลิกที่กราฟ: 5 โหนด 4 ขอบ และMEASURE(SUM(streams)) ในแท็บโค้ด ข้ามขั้นตอนถัดไป แล้วไปที่SUM และ AGG แบบเทียบกัน

4. สร้างกราฟ - ตัวเลือก ข: 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 ในเครื่องมือแก้ไขและข้อความแสดงความสำเร็จด้านล่าง

อ่านครั้งเดียว

กราฟมีตารางโหนด 5 ตารางและตารางขอบ 4 ตาราง ตารางโหนดแต่ละรายการจะตั้งชื่อ KEY และแสดงรายการ PROPERTIES บรรทัดที่ขึ้นต้นด้วย MEASURE คือส่วนใหม่ โดยแต่ละบรรทัดจะรวมการรวมที่รองรับรายการใดรายการหนึ่งไว้รอบพร็อพเพอร์ตี้และกำหนดชื่อแทนให้ ซึ่งเป็นสิ่งที่จำเป็น

ตารางขอบแต่ละตารางเป็นคีย์นอก ซึ่งเขียนไว้ว่า SOURCE KEY ในตารางที่มีคีย์ DESTINATION KEY ในตารางที่ชี้ไป NO PROPERTIES หมายความว่า Edge ไม่ได้มีอะไรเป็นของตัวเอง

โปรดสังเกตว่า PlaylistEntries ปรากฏ 3 ครั้ง โดยครั้งแรกเป็นตารางโหนด และอีก 2 ครั้งเป็นตารางจริงที่อยู่เบื้องหลังขอบ EntryToSong และ EntryToPlaylist ซึ่งเป็นสิ่งที่ตั้งใจไว้ และเราจะอธิบายเหตุผลในภายหลัง

ดูสิ่งที่คุณสร้าง

👉🌐 Console - ในบานหน้าต่าง Explorer ให้ขยาย music แล้วคลิก Graphs และคลิก MusicGraph หน้ากราฟจะเปิดขึ้นบน Canvas โดยมี 5 โหนดและ 4 ขอบ คลิกโหนดเพื่อดูพร็อพเพอร์ตี้ของโหนดนั้น โดยระบบจะแสดงเมตริกพร้อมค่ารวม เปิดแท็บโค้ดเพื่อดูคำสั่งที่อยู่เบื้องหลังรูปภาพ

หน้า MusicGraph: Canvas อยู่ทางซ้าย แท็บโค้ดอยู่ทางขวา

✅ จุดตรวจสอบ: music มีโฟลเดอร์ Graphs ที่มี MusicGraph และแท็บโค้ดแสดง MEASURE(SUM(streams)) AS total_streams

5. SUM และ AGG อยู่ข้างกัน

นี่คือ Codelab ทั้งหมดในคำค้นหาเดียว ทั้ง 2 คอลัมน์พยายามตอบคำถามเดียวกัน นั่นคือ ยอดสตรีมทั้งหมดต่อค่ายเพลง จากตารางเดียวกัน

ตารางนั้นคือตารางที่ GRAPH_EXPAND สร้างขึ้น โดยจะทำให้กราฟแบนลง กล่าวคือ เริ่มต้นที่ตารางหนึ่งและติดตามแต่ละขอบออกไปเป็น LEFT JOIN จนกว่าตารางที่เชื่อมต่อทั้งหมดจะอยู่เคียงข้างกันในผลลัพธ์แบบกว้างเดียว 1 แถวต่อตําแหน่ง ไม่ใช่ 1 แถวต่อเพลง และทุกคอลัมน์ต้องมีชื่อว่า 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 ใช้พื้นที่ 4 รายการ โดยใช้ 1 รายการต่อเพลย์ลิสต์ และSongs_streams มีจำนวนการฟัง 2,000,000,000 ครั้งในทุกเพลย์ลิสต์ แถวเหล่านั้นไม่มีอะไรผิดปกติ เพลย์ลิสต์มี 4 รายการจริงๆ แต่ตอนนี้คอลัมน์ที่เป็นของเพลงจะซ้ำกันในแถวที่เป็นของตําแหน่ง และนั่นคือปัญหาทั้งหมดที่คําค้นหาถัดไปจะวัด

มาดูการเปรียบเทียบกัน

👉📋 เครื่องมือแก้ไขคำค้นหา - วาง แล้วคลิกเรียกใช้

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,600,000,000

5,100,000,000

Northwind Audio

9,000,000,000

4,500,000,000

ตารางกริดผลลัพธ์: with_sum 12,600,000,000 และ with_agg 5,100,000,000 สำหรับ Cymbal Records

ตรวจสอบด้วยตนเอง เพลง 4 เพลงของ Cymbal มียอดสตรีม 2 พันล้าน, 1.5 พันล้าน, 1.2 พันล้าน และ 0.4 พันล้านครั้ง ซึ่งก็คือ 5.1 พันล้าน AGGถูกต้อง SUM มีขนาดใหญ่เกินไป 2.5 เท่า และเพลงเดียวของ Northwind มีขนาดใหญ่ขึ้น 2 เท่า

ไวยากรณ์ใหม่ 3 รายการ

  • GRAPH_EXPAND("music.MusicGraph") เป็นฟังก์ชันที่ให้ค่าเป็นตารางซึ่งเปลี่ยนกราฟให้เป็นตารางแบบกว้าง 1 ตารางโดยทำตามแต่ละขอบเป็น LEFT JOIN ทุกคอลัมน์จะมีชื่อว่า TableLabel_property ดังนั้น Songs_streams จึงเป็นคอลัมน์ดิบจากตารางเพลง และ Songs_total_streams คือการวัดที่คุณประกาศ
  • SUM(Songs_streams) คือ SQL ปกติในตารางแบบกว้างนั้น และจะรับช่วงรายการที่ซ้ำกันทั้งหมดที่การแปลงเป็นรูปแบบแบนสร้างขึ้น
  • AGG(Songs_total_streams) จะประเมินเมตริกตามวิธีที่ประกาศไว้ นั่นคือ SUM(streams) 1 ครั้งต่อ song_id ไม่ว่าเพลงจะอยู่ในตารางแบบกว้างกี่แถวก็ตาม

✅ จุดตรวจสอบ: ป้ายกำกับ 2 รายการ คอลัมน์ 2 รายการ และwith_agg ตัวเลขตรงกับจำนวนที่นับด้วยมือ

6. เหตุผลที่ SUM นับเกิน

ลองใช้เพลง 1 เพลงแล้วดูว่าการรวมเพลงจะทำให้เพลงนั้นเป็นอย่างไร

👉📋 เครื่องมือแก้ไขคำค้นหา - วาง แล้วคลิกเรียกใช้

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

สตรีม

เพลย์ลิสต์

ก่อน - ตารางเพลง

นีออนซัมเมอร์

2,000,000,000

Null

หลัง - เข้าร่วมเพลย์ลิสต์

นีออนซัมเมอร์

2,000,000,000

Gym Pump

หลัง - เข้าร่วมเพลย์ลิสต์

นีออนซัมเมอร์

2,000,000,000

มาแรงในขณะนี้

หลัง - เข้าร่วมเพลย์ลิสต์

นีออนซัมเมอร์

2,000,000,000

ป๊อปมาแรง

หลัง - เข้าร่วมเพลย์ลิสต์

นีออนซัมเมอร์

2,000,000,000

Road Trip

ตารางผลลัพธ์: แถว BEFORE 1 แถวและแถว AFTER 4 แถว ทั้งหมดมีค่า 2,000,000,000

1 แถวกลายเป็น 4 แถว จำนวนสตรีมไม่ได้เปลี่ยนแปลง แต่ระบบได้คัดลอกสตรีม รวมยอดการฟังเพลงของ Cymbal Records: Neon Summer 2.0 พันล้านครั้งในเพลย์ลิสต์ 4 รายการเป็น 8.0, Paper Crown 1.5 พันล้านครั้งในเพลย์ลิสต์ 2 รายการเป็น 3.0, Double Shot 1.2 พันล้านครั้งในเพลย์ลิสต์ 1 รายการ และ Slow Arrow 0.4 พันล้านครั้งในเพลย์ลิสต์ 1 รายการ นั่นคือ 12, 600 ล้าน ซึ่งเป็นตัวเลขที่ SUM แสดงผล เพลง Midnight Drive ของ Northwind อยู่ในเพลย์ลิสต์ 2 รายการ ดังนั้นยอดฟัง 4.5 พันล้านครั้งจึงกลายเป็น 9.0 พันล้านครั้ง

นี่คือแฟนเอาต์ (Fan-Out) และไม่ใช่ข้อบกพร่องในการรวม แถวเพลย์ลิสต์มีอยู่จริง ข้อผิดพลาดคือการรวมตัวเลขที่อยู่ในเพลงในแถวที่อยู่ในตําแหน่ง

มาตรการนี้แก้ไขปัญหาเนื่องจากมีการประกาศในโหนด Songs พร้อมกับ KEY (song_id) กุญแจสำคัญคือความละเอียด เมื่อ AGG ประเมิน total_streams ระบบจะรวบรวม 1 ครั้งต่อคีย์เพลง แล้วจึงสรุปไปยังสิ่งที่คุณจัดกลุ่ม

สิ่งที่เปลี่ยนแปลง

คุณเคยเขียนว่า

มีมาตรวัด

SUM(streams) ในทุกคำค้นหาที่จำเป็น

MEASURE(SUM(streams)) ครั้งเดียวในกราฟ

SUM(...) เพื่ออ่าน

AGG(...) เพื่ออ่านข้อความดังกล่าว และมีเพียง AGG

3 JOIN

GRAPH_EXPAND() ตารางค่าเดี่ยว 1 ตาราง

CTE ที่รวบรวมข้อมูลก่อนเข้าร่วม

ไม่มี KEY เป็นตัวกำหนดความละเอียด

✅ จุดตรวจสอบ: 5 แถว - 1 แถวก่อนหน้า 4 แถวหลังจากนั้น - และคุณสามารถสร้างข้อมูล 12, 600 ล้านรายการใหม่จากแถวเหล่านั้นได้

7. กฎ: เฉพาะ AGG เท่านั้นที่อ่านค่าเมตริก

มาตรการมีประเภทของตัวเอง MEASURE และมีฟังก์ชันเดียวที่ยอมรับมาตรการ คำค้นหา 4 รายการด้านล่างตั้งใจให้ล้มเหลว ให้เรียกใช้แต่ละรายการและอ่านข้อผิดพลาดสีแดง นี่คือ 4 วิธีที่ทุกคนมักจะลองทำก่อน และการทราบว่าแต่ละวิธีมีผลลัพธ์อย่างไรจะช่วยประหยัดเวลาในภายหลัง

👉📋 เครื่องมือแก้ไขการค้นหา — 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,600 ล้านที่นับเกินจากก่อนหน้านี้มาจากการรวมคอลัมน์ข้อมูลดิบเท่านั้น ไม่ใช่จากการจัดการเมตริกอย่างไม่ถูกต้อง

✅ จุดตรวจสอบ: ข้อผิดพลาดสีแดง 4 รายการ และคุณสามารถระบุได้ว่าแต่ละรายการบังคับใช้กฎใด

8. การรวมทุกรายการที่เมตริกรองรับ

MEASURE() จะรวมหนึ่งใน 6 การรวม ได้แก่ SUM, AVG, MIN, MAX, COUNT และ COUNT(DISTINCT) สร้างกราฟใหม่โดยมีทั้ง 6 รายการในโหนดเพลง โดยขอบจะยังคงเป็น 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 แบบ 6 ขั้นตอนและข้อความแสดงความสำเร็จ

ตอนนี้อ่านทั้งหมดอีกครั้ง การวัดทุกอย่างจะผ่าน 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

400,000,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

ตารางกริดผลลัพธ์ 7 คอลัมน์ ป้ายกำกับทั้ง 2 รายการ

ตัวเลขทั้งหมดคำนวณจากเพลง 4 เพลงสำหรับ Cymbal และ 1 เพลงสำหรับ Northwind ไม่ใช่จากแถวตำแหน่ง 10 แถว AVG จะผิดพลาดในทางตรงกันข้าม กล่าวคือ การหาค่าเฉลี่ยของคอลัมน์ดิบในแถวตําแหน่งจะให้ค่า 1.575 พันล้านสําหรับ Cymbal เนื่องจากระบบนับ 2 พันล้านของ Neon Summer 4 ครั้ง

ดังนั้น "เปลี่ยน SUM เป็น AGG" จึงเป็นการตัดสินใจ 2 อย่าง เมื่อประกาศเมตริก คุณยังคงเลือกได้ว่าจะใช้การรวมใดใน 6 รายการ เมื่ออ่านเมตริก ฟังก์ชันจะเป็น AGG เสมอ

✅ จุดตรวจสอบ: 1 แถวต่อป้ายกำกับ 7 หมายเลขต่อป้ายกำกับ และ 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

สตรีม

เพลง

Road Trip

6,900,000,000

3

Gym Pump

6,500,000,000

2

มาแรงในขณะนี้

4,700,000,000

3

ป๊อปมาแรง

3,500,000,000

2

ตารางผลลัพธ์, Road Trip 6,900,000,000 ที่ด้านบน

บรรทัด AGG ทั้ง 2 บรรทัดเป็นไบต์ต่อไบต์จาก SUM และ AGG ที่อยู่เคียงข้างกัน เฉพาะ GROUP BY เท่านั้นที่ย้าย Road Trip มี Neon Summer, Midnight Drive และ Slow Arrow และแต่ละเพลงจะนับ 1 ครั้งในเพลย์ลิสต์นั้น ซึ่งตรงกับความหมายของ "สตรีมที่เข้าถึงเพลย์ลิสต์นี้"

ผู้ที่เขียนการวัดผลตัดสินใจเกี่ยวกับระดับรายละเอียดเพียงครั้งเดียว การค้นหาในภายหลังทั้งหมดที่ดำเนินการโดยทุกคนจะรับค่านี้

✅ จุดตรวจ: Road Trip อยู่ด้านบนด้วยยอดดู 6.9 พันล้านครั้ง

10. ดูว่า GRAPH_EXPAND ให้ข้อมูลอะไรแก่คุณ

คุณไม่จำเป็นต้องเรียกใช้ GRAPH_EXPAND เพื่อดูรูปร่างของออบเจ็กต์ กระบวนการของระบบ BQ.SHOW_GRAPH_EXPAND_SCHEMA จะเขียนรายการคอลัมน์ลงในตัวแปร

👉📋 เครื่องมือแก้ไขคำค้นหา - วางทั้ง 3 บรรทัด แล้วคลิกเรียกใช้

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

👀 ผลลัพธ์คือสตริง JSON 1 รายการ แต่ละฟิลด์จะมีชื่อ ประเภท และโหมด และคอลัมน์เมตริกทุกคอลัมน์จะมี "is_measure": true สำหรับกราฟที่คุณเพิ่งสร้าง คุณจะได้รับข้อมูลต่อไปนี้และอื่นๆ

name

ประเภท

is_measure

Songs_title

STRING

Songs_streams

INTEGER

Songs_total_streams

INTEGER

จริง

Songs_avg_streams

FLOAT

จริง

Songs_distinct_artists

INTEGER

จริง

PlaylistEntries_placement_count

INTEGER

จริง

เซลล์ JSON เดียวที่ขยายให้เห็น is_measure เป็นจริง

คำอธิบายหรือคำพ้องความหมายที่คุณตั้งค่าในพร็อพเพอร์ตี้จะแสดงที่นี่ด้วย ขั้นตอนการแชทที่ไม่บังคับจะแสดงให้เห็นว่าใครอ่านข้อความเหล่านั้น

✅ จุดตรวจสอบ: สตริง JSON ที่มี is_measure ในทุกคอลัมน์ที่คุณประกาศด้วย MEASURE

11. สิ่งที่ GRAPH_EXPAND ต้องการจากรูปร่างของกราฟ

ไม่ต้องเรียกใช้สิ่งใดในขั้นตอนนี้ เพียงแค่อ่าน GRAPH_EXPAND สร้างตารางแบบกว้างด้วยห่วงโซ่ของ LEFT JOIN โดยเริ่มจากตารางหนึ่งและตามขอบออกไปด้านนอก กฎ 3 ข้อที่ตามมานั้น MusicGraph ปฏิบัติตามได้ทั้งหมด

รูปร่าง GRAPH_EXPAND ต้องมี PlaylistEntries เป็นรูทเดียว ขอบแบบหลายต่อหนึ่ง 4 ขอบที่ชี้ออก และคู่ Songs–Playlists แบบหลายต่อหลายที่เลื่อนขั้นเป็นโหนด

ตารางโหนดรูท 1 ตารางเท่านั้น รูทคือตารางโหนดที่คีย์ไม่ปรากฏในตารางอื่นใด ซึ่งก็คือตารางที่ไม่มีขอบชี้ไป ใน MusicGraph ที่เป็น PlaylistEntries: แหล่งที่มาของขอบ 2 รายการและปลายทางของไม่มี ตารางแบบกว้างมี 10 แถว โดยมี 1 แถวต่อตําแหน่ง

ทุกขอบเป็นแบบหลายต่อหนึ่ง จากแหล่งที่มาไปยังปลายทาง แต่ละรายการมีเพลง 1 เพลงและเพลย์ลิสต์ 1 รายการ แต่ละเพลงมีศิลปิน 1 คน และแต่ละศิลปินมีค่ายเพลง 1 ค่าย ด้วยเหตุนี้ ตารางแบบกว้างจึงไม่ขยายออกไปเกินกว่าแถวของรูทเอง ข้อมูลที่รูทเข้าถึงไม่ได้จะไม่ปรากฏ เช่น เพลงที่ไม่มีการจัดวางจะหายไปจากตารางแบบกว้าง

ความสัมพันธ์แบบหลายต่อหลายจะกลายเป็นโหนด เพลงและเพลย์ลิสต์เป็นแบบหลายต่อหลาย หากคุณประกาศตารางเชื่อมต่อเป็นขอบเดียวจากเพลงไปยังเพลย์ลิสต์ GRAPH_EXPAND จะไม่สนใจตารางดังกล่าวเนื่องจากมีความกำกวม และจะล้มเหลวเนื่องจากไม่มีขอบที่ใช้ได้เหลืออยู่ การเลื่อนระดับ PlaylistEntries ไปยังตารางโหนดที่มีขอบแบบหลายต่อหนึ่ง 2 ขอบเป็นรูปแบบที่บันทึกไว้ และเป็นสิ่งที่คุณทำเมื่อสร้างกราฟ

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

👀 คาดว่าจะมีเพลย์ลิสต์ 4 รายการดังนี้

pl.playlist_name

pl.followers

streams_reaching_this_playlist

เพลง

มาแรงในขณะนี้

35,000,000

4,700,000,000

Double Shot, Neon Summer, Paper Crown

ป๊อปมาแรง

2,000,000

3,500,000,000

Neon Summer, Paper Crown

Road Trip

5,000,000

2,400,000,000

Neon Summer, Slow Arrow

Gym Pump

3,000,000

2,000,000,000

นีออนซัมเมอร์

ผลลัพธ์ GQL: เพลย์ลิสต์ 4 รายการที่มีสตรีมเข้าถึงแต่ละเพลย์ลิสต์

อ่านMATCHบรรทัดเป็นประโยค: เริ่มที่ค่ายเพลง ย้อนกลับไปหาศิลปินของค่าย ย้อนกลับไปหาเพลงของศิลปิน ย้อนกลับไปหารายการเพลย์ลิสต์ที่มีเพลงเหล่านั้น แล้วไปข้างหน้าเพื่อดูเพลย์ลิสต์ ลูกศรชี้ทิศทางที่ประกาศขอบ <- เดินถอยหลัง

ตอนนี้ให้บวกคอลัมน์ที่ 3 12, 600 ล้าน - ตัวเลขที่ SUM บอกคุณในขั้นตอนที่ 4 ซึ่งเป็นตัวเลขที่ไม่ถูกต้อง

ซึ่งถูกต้องแล้ว ในตอนนั้น คำถามคือ Cymbal สตรีมเพลงไปมากน้อยเพียงใด และระบบจะนับเพลง 1 ครั้งไม่ว่าเพลย์ลิสต์จะมีเพลงนั้นกี่เพลย์ลิสต์ก็ตาม คำถามนี้คือจุดที่สตรีมเหล่านั้นเข้าถึง และเพลงในเพลย์ลิสต์ 4 รายการจะเข้าถึงผู้ชม 4 กลุ่มอย่างแท้จริง การทำซ้ำ 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 จะแสดงชื่อนั้น

👀 คาดว่าจะมี 8 แถวและ 1 คอลัมน์ path แต่ละเซลล์คืออาร์เรย์ JSON ของโหนดและขอบตามเส้นทางหนึ่งๆ โดยแต่ละโหนดจะมี labels และ properties

8 แถว แต่ละแถวเป็นเส้นทาง JSON โดยมีแท็บกราฟในบานหน้าต่างผลลัพธ์

8 แถวสำหรับเพลง 4 เพลง เนื่องจากมีเส้นทางต่อตําแหน่ง ไม่ใช่ต่อเพลง

3. เปิดแท็บกราฟ

👉🌐 Console — เหนือผลลัพธ์ ให้คลิกกราฟ

แท็บนี้จะปรากฏเมื่อผลการค้นหามีองค์ประกอบกราฟเท่านั้น การค้นหาก่อนหน้านี้แสดงผลตัวเลข จึงไม่มีแท็บกราฟ แต่การค้นหานี้แสดงผลเส้นทาง จึงมีแท็บกราฟ

แท็บกราฟที่วาดกราฟย่อยของ Cymbal ในเลย์เอาต์แบบบังคับ

คุณจะเห็นมุมของกราฟของ Cymbal ที่วาดเป็นเลย์เอาต์แบบบังคับ โดยมีจำนวนโหนดและขอบที่มองเห็น และชิปต่อป้ายกำกับ ลากโหนดเพื่อแยกเลย์เอาต์ออกจากกัน คลิกโหนดเพื่ออ่านพร็อพเพอร์ตี้

✅ จุดตรวจสอบ: คอลัมน์ที่ 3 ของการค้นหาแรกมีผลรวมเป็น 12.6 พันล้าน การค้นหาที่ 2 แสดงเส้นทาง 8 เส้นทาง และแท็บกราฟจะวาดเส้นทางเหล่านั้น

13. (ไม่บังคับ) แชทกับกราฟ

ขั้นตอนนี้ไม่มี SQL ตัวแทนข้อมูล BigQuery สามารถใช้กราฟเป็นแหล่งความรู้ได้ และเอกสารระบุว่าตัวแทนใช้การวัดผลสำหรับการรวบรวมข้อมูลหลายระดับ มาดูกันว่าจริงไหม

1. สร้างเอเจนต์

👉🌐 คอนโซล - ในเมนูการนำทาง BigQuery ทางด้านซ้าย ให้คลิกเอเจนต์ จากนั้นคลิกแคตตาล็อกเอเจนต์ แล้วคลิกสร้างเอเจนต์

👉🌐 Console — พิมพ์ Music graph agent ในชื่อเอเจนต์ และพิมพ์ข้อความนี้ในคำอธิบายเอเจนต์

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

👉🌐 Console - ในส่วนแหล่งความรู้ ให้คลิกเพิ่มแหล่งข้อมูล ในกล่องโต้ตอบเลือกแหล่งข้อมูล ให้ขยายโปรเจ็กต์ ขยาย music ขยาย Graphs ทำเครื่องหมาย MusicGraph แล้วคลิกยืนยัน

👀 ปุ่มเพิ่มแหล่งข้อมูลจะเปลี่ยนเป็นสีเทา Agent มีกราฟได้สูงสุด 1 รายการ และไม่สามารถรวมกราฟกับตารางได้

กล่องโต้ตอบ &quot;เลือกแหล่งข้อมูล&quot; ที่มี MusicGraph ทำเครื่องหมายไว้และเลือก (1)

👉🌐 Console — ปล่อยให้Region เป็นไปตามที่ตั้งค่าจากตำแหน่งของกราฟ คลิกบันทึก แล้วคลิกเผยแพร่ ในแผงช่องทางการเผยแพร่ ให้คลิกเผยแพร่เอเจนต์ แล้วปิดการยืนยัน

2. ถามคำถาม

👉🌐 Console — คลิกสร้างการสนทนา หน้าแชทจะเปิดขึ้น พิมพ์ข้อความนี้ลงในช่องถามคำถามที่ด้านล่าง แล้วกด Enter

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

👀 Agent จะแสดงตารางและสรุป 1 ประโยค

label_name

total_streams

playlist_placements

Cymbal Records

5,100,000,000

8

Northwind Audio

4,500,000,000

2

คำตอบของตัวแทน: ตารางพร้อมสรุป 1 ประโยค

5.1 พันล้าน ไม่มีใครบอก Agent เกี่ยวกับแฟนเอาต์ (Fan-Out) และ Agent ก็ไม่ได้จัดอยู่ในกลุ่มนั้น

3. อ่านคำค้นหาที่เขียน

👉🌐 Console — ในเมนูการนำทาง ให้คลิก Jobs Explorer แล้วคลิกงานล่าสุด ป้ายกำกับประกอบด้วย 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

Job Explorer: ป้ายกำกับของงาน (ca-bq-job, data-agent-id) และ SQL ของงาน

โดยใช้ GRAPH_EXPAND และ AGG ด้วยตัวเอง เนื่องจากมาตรการอยู่ในสคีมาที่อ่าน ไม่มีการกล่าวถึงในคำอธิบายของเอเจนต์

✅ จุดตรวจสอบ: 5.1 พันล้านในคำตอบของแชท และ AGG(...) ใน SQL ของงาน

14. ล้างข้อมูล

👉💻 Cloud Shell — วางชุดข้อมูล ตาราง และกราฟพร็อพเพอร์ตี้

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

👀 คาดว่า ✓ dropped YOUR_PROJECT_ID.music (tables and graph)

หากสร้าง Data Agent ที่ไม่บังคับ ให้ลบในคอนโซลที่ส่วน Agents → Agent catalog และหาก./setup_project.shสร้างโปรเจ็กต์สำหรับ Lab นี้โดยเฉพาะ การล้างข้อมูลที่เรียบร้อยที่สุดคือปิดโปรเจ็กต์ทั้งหมด ซึ่งรหัสจะอยู่ใน ~/project_id.txt

15. ขอแสดงความยินดี

คุณประกาศบรรทัดเดียว MEASURE(SUM(streams)) และบรรทัดนั้นเปลี่ยน 12,600 ล้านเป็น 5,100 ล้านสำหรับคุณ และสำหรับคำค้นหาทุกคำที่ใครก็ตามเขียนเทียบกับกราฟนั้นหลังจากนั้น รวมถึงคำค้นหาที่เอเจนต์เขียน

สิ่งที่คุณได้เรียนรู้

  • การวัดคือการรวมที่ประกาศในโหนดข้าง KEY ซึ่งกำหนดระดับรายละเอียด
  • GRAPH_EXPAND จะทำให้กราฟแบนเป็นตารางกว้าง 1 ตารางที่มี TableLabel_property คอลัมน์
  • AGG เป็นฟังก์ชันเดียวที่อ่านการวัด และระบบประเภทจะบังคับใช้ใน 4 วิธีที่แตกต่างกัน
  • มีข้อมูลรวม 6 รายการ และผลลัพธ์ AGG เป็นค่าปกติที่คุณสามารถหารได้
  • การเปลี่ยน GROUP BY จะถามคำถามอีกครั้งโดยไม่ต้องแตะที่มาตรวัด
  • GRAPH_EXPAND ต้องการรูท 1 รายการ ขอบแบบหลายต่อหนึ่ง และแยกส่วนที่เลื่อนระดับเป็นโหนด

ตารางการตัดสินใจ

ลักษณะปัญหา

สาเหตุ

แก้ไข

ยอดรวมที่มากเกินไป

SUM เหนือคอลัมน์ที่กางออก

ประกาศการวัด อ่านด้วย AGG

"คาดหวัง MEASURE แต่พบ INT64"

AGG บนคอลัมน์ธรรมดา

ใช้ SUM หรือประกาศหน่วยวัด

"ไม่อนุญาตให้แสดงนิพจน์ประเภท MEASURE"

คอลัมน์มาตรวัดที่ไม่มี AGG

ห่อของขวัญ: AGG(...)

"ไม่ได้แสดงตามประเภทองค์ประกอบ"

การวัดที่อ้างอิงใน GQL

วัดการเข้าชมไลฟ์สดที่อยู่เบื้องหลัง GRAPH_EXPAND เท่านั้น

GRAPH_EXPAND ไม่สนใจขอบหรือล้มเหลว

แยกจำลองเป็นขอบ

เลื่อนระดับตารางเชื่อมโยงเป็นโหนด

หมายเลขเดิมหลังจากเปลี่ยนกราฟ

ผลการค้นหาที่แคชไว้

ล้างใช้ผลลัพธ์ที่แคชไว้

สิ่งที่เราไม่ได้พูดถึง (โดยตั้งใจ)

คำอธิบายและคำพ้องความหมายในพร็อพเพอร์ตี้ · คำค้นหาที่ยืนยันแล้วและอภิธานศัพท์สำหรับ Data Agent · GQL ที่มีมากกว่า 1 MATCH · การวัดในกราฟมากกว่า 1 รายการ แต่ละรายการเป็นห้องทดลองของตัวเอง

ดูข้อมูลเพิ่มเติม