1. ภาพรวม
ข้อบกพร่องของ SQL ส่วนใหญ่ที่ผ่านการตรวจสอบโค้ดมาได้มักเป็นข้อบกพร่องในการรวบรวม ตัวเลขในตารางที่อยู่ถูกต้อง แต่การรวมจะคัดลอกตัวเลขนั้น และผลรวมจะผิดโดยไม่มีใครทราบ
BigQuery Graph ช่วยให้คุณอธิบายวิธีเชื่อมต่อตารางได้เพียงครั้งเดียวในรูปแบบกราฟพร็อพเพอร์ตี้ จากนั้นจึงค้นหาการเชื่อมต่อ การวัดกราฟจะเพิ่มอีกสิ่งหนึ่งลงในคำอธิบายนั้น นั่นคือการรวม คุณประกาศ MEASURE(SUM(streams)) ในโหนดที่เป็นเจ้าของหมายเลข และทุกคำค้นหาที่อ่านกราฟจะได้รับผลรวมที่ถูกต้องในระดับที่เหมาะสม โดยไม่ต้องใช้เทคนิค GROUP BY หรือ CTE ที่ต้องจดจำ
ในโค้ดแล็บนี้ คุณจะสร้างแคตตาล็อกเพลง 5 ตาราง ใส่เมตริกลงในแคตตาล็อก และดูคำถามเดียวกันที่ให้คำตอบที่แตกต่างกัน 2 คำตอบ ได้แก่ 12,600 ล้านด้วย SUM และ 5,100 ล้านด้วย AGG ช่องว่างคือรูปร่างของแคตตาล็อก ซึ่งเพลงที่อยู่ในเพลย์ลิสต์ 4 รายการจะกลายเป็น 4 แถวเมื่อกราฟแบนราบ และ SUM จะเพิ่มทั้ง 4 แถว จากนั้นคุณก็เรียนรู้กฎที่ทำให้ประโยคที่ 2 ถูกต้อง

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

👉🌐 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 สิ่งที่เกิดขึ้นในนั้น
การเรียกเก็บเงิน | ใช้บัญชี | |
project | สร้าง | |
เลือก | เขียนรหัสไปยัง | |
รอ | จนกว่าโปรเจ็กต์ใหม่จะได้รับอนุญาตให้แสดงโฆษณา ซึ่งอาจใช้เวลาสูงสุด 2 นาที | |
🌐 ตอนนี้โปรเจ็กต์เดียวกันนี้อยู่ในคอนโซลแล้ว โดยรหัสจะอยู่ในการ์ดข้อมูลโปรเจ็กต์ในแดชบอร์ด

5 · สร้างชุดข้อมูล (~3 นาที)
👉💻 Cloud Shell - สคริปต์อีกรายการจะสร้างตาราง
cd ~/bq-graph-measures-lab
./setup.sh
สคริปต์จะพิมพ์แต่ละขั้นตอนขณะทำงาน โดยจะดำเนินการตามลำดับดังนี้
project | อ่านโปรเจ็กต์จาก | |
API | เปิดใช้ | |
ชุดข้อมูล | สร้างชุดข้อมูล | |
ตรวจสอบ | นับแถวในทุกตารางและหยุดหากการนับไม่ถูกต้อง | |
👀 คาดการณ์
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 ตาราง

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

เก็บแท็บนี้ไว้ บล็อก 👉📋 ทุกบล็อกในแล็บนี้จะอยู่ที่นี่ เลือกทุกอย่างในเอดิเตอร์ วางบล็อกใหม่ทับ แล้วคลิกเรียกใช้ ผลลัพธ์จะปรากฏในแผงด้านล่าง
ทำความรู้จักกับตาราง
มี 2 สิ่งเกี่ยวกับตารางเหล่านี้ที่สำคัญในภายหลัง ทุกตารางจะประกาศคีย์หลักเป็น NOT ENFORCED: BigQuery ไม่ได้ตรวจสอบคีย์หลัก แต่กราฟพร็อพเพอร์ตี้ที่คุณกำลังจะสร้างต้องมีคีย์ที่ชัดเจนเพื่อทราบว่าอะไรที่ระบุแถว และตารางสุดท้าย PlaylistEntries คือตารางเชื่อม ซึ่งเพลงที่อยู่ในเพลย์ลิสต์ 4 รายการจะมี 4 แถวในตารางนี้ ตารางนั้นเป็นที่ที่เรื่องราวทั้งหมดเกิดขึ้น
ตารางจะเชื่อมโยงกันดังนี้ ค่ายเพลงเซ็นสัญญากับศิลปิน ศิลปินปล่อยเพลง และเพลงจะอยู่ในเพลย์ลิสต์ผ่าน PlaylistEntries Cymbal Records เป็นเจ้าของ Ava Sterling และ Mina Okafor รวมถึงเพลง 4 เพลงของศิลปินทั้ง 2 Northwind Audio เป็นเจ้าของ Kai Nakamura และเพลง Midnight Drive
โต๊ะ | แถว | แป้น | สิ่งที่เก็บไว้ |
ป้ายกำกับ | 2 |
| ชื่อ งบประมาณด้านการตลาด |
ศิลปิน | 3 |
| ชื่อ ป้ายกำกับ |
เพลง | 5 |
| ชื่อเพลง ศิลปิน สตรีม |
เพลย์ลิสต์ | 4 |
| name, followers |
PlaylistEntries | 10 |
| เพลงใดอยู่ในเพลย์ลิสต์ใด |
✅ จุดตรวจสอบ: 🎉 ready ใน Cloud Shell, ตาราง 5 ตารางใน music ใน Explorer และแท็บเครื่องมือแก้ไขคำค้นหาที่ว่างเปล่าเปิดอยู่
3. สร้างกราฟ - ตัวเลือก ก: เครื่องมือสร้างโมเดลภาพ
กราฟพร็อพเพอร์ตี้คือคำอธิบายว่าตารางเชื่อมต่อกันอย่างไร คุณคลิกได้ในโปรแกรมสร้างโมเดลกราฟแบบภาพ (ขั้นตอนนี้ คลิกทั้งหมด) หรือเขียนเป็น SQL (ขั้นตอนถัดไป วาง 1 ครั้ง) ทั้ง 2 วิธีจะสร้างออบเจ็กต์เดียวกัน ให้เลือกใช้วิธีใดวิธีหนึ่ง ไม่ใช่ทั้ง 2 วิธี
1. สร้างเชลล์กราฟ
👉🌐 Console - ใน BigQuery Studio ให้เปิดเมนู AI และความรู้ ในแถวสร้างใหม่ แล้วคลิกกราฟ
👉🌐 Console — ป้อน MusicGraph เป็นชื่อกราฟ และ music เป็นปลายทางกราฟในชุดข้อมูล ภูมิภาคจะมาจากชุดข้อมูล (สหรัฐอเมริกา)
👉🌐 Console — ในส่วนแหล่งข้อมูล ให้เลือกตารางทั้ง 5 ตาราง ได้แก่ ศิลปิน ค่าย เพลย์ลิสต์ เพลย์ลิสต์ และเพลง แล้วคลิกสร้าง

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

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

👉🌐 Console — ทำซ้ำอีก 3 ครั้ง
ชื่อ Edge | โต๊ะ | โหนดต้นทาง → โหนดปลายทาง | คอลัมน์ที่จะเลือกทั้ง 2 ด้าน |
| PlaylistEntries | PlaylistEntries → Playlists | แหล่งที่มา |
| เพลง | เพลง → ศิลปิน | แหล่งที่มา |
| ศิลปิน | ศิลปิน → ค่ายเพลง | แหล่งที่มา |
ปล่อยให้ขอบทุกขอบไม่มีพร็อพเพอร์ตี้เพิ่มเติม
👀 ตอนนี้แผงรายละเอียดจะแสดงขอบ (4) และ Canvas จะแสดงเชนดังนี้ ค่ายเพลง ← ศิลปิน ← เพลง ← รายการในเพลย์ลิสต์ → เพลย์ลิสต์

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

4. อ่านโค้ดที่โมเดลเขียนขึ้น แล้วเผยแพร่
👉🌐 Console - เปิดแท็บโค้ดในแผงด้านขวา โมเดลเลอร์ได้เขียนข้อความ CREATE PROPERTY GRAPH ให้คุณแล้ว เลื่อนไปที่โหนดเพลง รายการพร็อพเพอร์ตี้จะลงท้ายด้วย
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
)
👀 แผงผลลัพธ์ระบุว่าสร้างกราฟพร็อพเพอร์ตี้แล้ว

อ่านครั้งเดียว
กราฟมีตารางโหนด 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 ขอบ คลิกโหนดเพื่อดูพร็อพเพอร์ตี้ของโหนดนั้น โดยระบบจะแสดงเมตริกพร้อมค่ารวม เปิดแท็บโค้ดเพื่อดูคำสั่งที่อยู่เบื้องหลังรูปภาพ

✅ จุดตรวจสอบ: 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 |

ตรวจสอบด้วยตนเอง เพลง 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 |

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 ครั้งต่อคีย์เพลง แล้วจึงสรุปไปยังสิ่งที่คุณจัดกลุ่ม
สิ่งที่เปลี่ยนแปลง
คุณเคยเขียนว่า | มีมาตรวัด |
|
|
|
|
3 |
|
CTE ที่รวบรวมข้อมูลก่อนเข้าร่วม | ไม่มี |
✅ จุดตรวจสอบ: 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

👉📋 เครื่องมือแก้ไขการค้นหา - คอลัมน์การวัดที่ไม่มี 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
)

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

ตัวเลขทั้งหมดคำนวณจากเพลง 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 |

บรรทัด 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 ในทุกคอลัมน์ที่คุณประกาศด้วย MEASURE
11. สิ่งที่ GRAPH_EXPAND ต้องการจากรูปร่างของกราฟ
ไม่ต้องเรียกใช้สิ่งใดในขั้นตอนนี้ เพียงแค่อ่าน GRAPH_EXPAND สร้างตารางแบบกว้างด้วยห่วงโซ่ของ LEFT JOIN โดยเริ่มจากตารางหนึ่งและตามขอบออกไปด้านนอก กฎ 3 ข้อที่ตามมานั้น MusicGraph ปฏิบัติตามได้ทั้งหมด

ตารางโหนดรูท 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 | นีออนซัมเมอร์ |

อ่าน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 แถวสำหรับเพลง 4 เพลง เนื่องจากมีเส้นทางต่อตําแหน่ง ไม่ใช่ต่อเพลง
3. เปิดแท็บกราฟ
👉🌐 Console — เหนือผลลัพธ์ ให้คลิกกราฟ
แท็บนี้จะปรากฏเมื่อผลการค้นหามีองค์ประกอบกราฟเท่านั้น การค้นหาก่อนหน้านี้แสดงผลตัวเลข จึงไม่มีแท็บกราฟ แต่การค้นหานี้แสดงผลเส้นทาง จึงมีแท็บกราฟ

คุณจะเห็นมุมของกราฟของ 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 รายการ และไม่สามารถรวมกราฟกับตารางได้

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

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

โดยใช้ 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 รายการ ขอบแบบหลายต่อหนึ่ง และแยกส่วนที่เลื่อนระดับเป็นโหนด
ตารางการตัดสินใจ
ลักษณะปัญหา | สาเหตุ | แก้ไข |
ยอดรวมที่มากเกินไป |
| ประกาศการวัด อ่านด้วย |
"คาดหวัง MEASURE แต่พบ INT64" |
| ใช้ |
"ไม่อนุญาตให้แสดงนิพจน์ประเภท MEASURE" | คอลัมน์มาตรวัดที่ไม่มี | ห่อของขวัญ: |
"ไม่ได้แสดงตามประเภทองค์ประกอบ" | การวัดที่อ้างอิงใน GQL | วัดการเข้าชมไลฟ์สดที่อยู่เบื้องหลัง |
| แยกจำลองเป็นขอบ | เลื่อนระดับตารางเชื่อมโยงเป็นโหนด |
หมายเลขเดิมหลังจากเปลี่ยนกราฟ | ผลการค้นหาที่แคชไว้ | ล้างใช้ผลลัพธ์ที่แคชไว้ |
สิ่งที่เราไม่ได้พูดถึง (โดยตั้งใจ)
คำอธิบายและคำพ้องความหมายในพร็อพเพอร์ตี้ · คำค้นหาที่ยืนยันแล้วและอภิธานศัพท์สำหรับ Data Agent · GQL ที่มีมากกว่า 1 MATCH · การวัดในกราฟมากกว่า 1 รายการ แต่ละรายการเป็นห้องทดลองของตัวเอง
ดูข้อมูลเพิ่มเติม
- ทำงานกับเมตริก
- สร้างและค้นหากราฟพร็อพเพอร์ตี้
- ภาพรวมของ Conversational Analytics
- ที่เก็บข้อมูลของแล็บ - คำค้นหาทุกรายการใน Codelab นี้ โดยมีหมายเลขตามขั้นตอน