1. Genel Bakış
Kod incelemesinden geçen SQL hatalarının çoğu toplama hatalarıdır. Bir sayı, bulunduğu tabloda doğruyken birleştirme işlemi bu sayıyı kopyalıyor ve toplam sessizce yanlış oluyor.
BigQuery Graph, tablolarınızın nasıl bağlandığını bir kez özellik grafiği olarak tanımlamanıza ve ardından bağlantıları sorgulamanıza olanak tanır. Grafik ölçümleri, bu açıklamaya bir şey daha ekler: toplama işleminin kendisi. Sayıya sahip olan düğümde MEASURE(SUM(streams)) bildirimi yaparsınız ve grafiği okuyan her sorgu, doğru toplamı doğru ayrıntı düzeyinde alır. GROUP BY hilesi veya birinin hatırlaması gereken CTE yoktur.
Bu codelab'de beş tablodan oluşan bir müzik kataloğu oluşturacak, kataloğa bir ölçü ekleyecek ve aynı sorunun iki farklı yanıt verdiğini göreceksiniz: SUM ile 12,6 milyar, AGG ile 5,1 milyar. Boşluk, kataloğun şeklidir. Dört oynatma listesinde yer alan bir şarkı, grafik düzleştirildiğinde dört satır haline gelir ve SUM bu dört satırı da ekler. Ardından, ikinci cümleyi doğru kılan kuralları öğrenirsiniz.

Yazacağınız yer
Bu laboratuvarda tam olarak iki yer kullanılır ve bu yerler şu sırayla gösterilir:
burada | orada yaptığınız işlemler | |
1 | Cloud Shell terminali | Yalnızca Kurulum adımında birkaç komut |
2 | BigQuery konsolu | Diğer tüm işlemler: sorguları sorgu düzenleyiciye yapıştırma, grafik modelleyicide tıklama, bir temsilciyle sohbet etme |
Her talimat etiketlenir. Böylece her zaman hangi talimatın kastedildiğini bilirsiniz:
- 👉💻 Cloud Shell: Cloud Shell terminaline bunu yazın.
- 👉📋 Sorgu düzenleyici: Bunu BigQuery sorgu düzenleyiciye yapıştırıp Çalıştır'ı tıklayın.
- 👉🌐 Konsol: BigQuery konsolunda tıklayarak gezinin. Adımda belirtilmediği sürece hiçbir şey yazmayın.
- 👀 — Sonuca bakın.
Neler öğreneceksiniz?
- Görsel grafik modelleyicide veya SQL'de bir düğüm tablosunda ölçü beyan etme
GRAPH_EXPANDişlevi, grafiği nasıl tek bir geniş tabloya düzleştirir?- Neden
AGGişlevi, ölçü okuyabilen tek işlevdir ve diğer tüm denemeler ne yanıtını verir? - Bir ölçünün desteklediği altı toplama ve bunlar arasında aritmetik işlemlerin nasıl yapılacağı
- Bir ölçünün, farklı şekilde gruplandırılmış bir soruyu değişiklik yapmadan nasıl yanıtladığı
- İsteğe bağlı: GQL ve Grafik sekmesinin, toplamın yanıtlayamadığı bir soruyu nasıl yanıtladığı ve BigQuery veri aracısının, ölçüleriniz hakkında bilgi verilmeden bunları nasıl kullandığı
İhtiyacınız olanlar
- Faturalandırmanın etkin olduğu bir Google Hesabı ve bir tarayıcı. Başlangıçta Google Cloud projesine ihtiyacınız yoktur. Kurulum, sizin için bir proje oluşturur.
- Yalnızca isteğe bağlı sohbet adımı için: Gemini Data Analytics API'nin etkinleştirilmesi ve Gemini Data Analytics Data Agent Creator rolü.
Bilgisayarınıza herhangi bir şey yüklemeniz gerekmez. Her şey Cloud Shell ve BigQuery konsolunda çalışır.
Ürün durumu ve maliyeti
BigQuery Graph genel kullanıma sunuldu. Grafik ölçümleri, görsel grafik modelleyici, grafik görselleştirme ve grafiği veri aracısı bilgi kaynağı olarak kullanma özellikleri önizleme aşamasındadır ve GKST Öncesi Teklif Şartları'na tabidir.
GRAPH_EXPAND ve AGG, isteğe bağlı fiyatlandırma kapsamında çalışır. GQL sorguları (isteğe bağlı yol adımı), dokümanlara göre Enterprise veya Enterprise Plus sürümünü kullanan bir rezervasyon gerektirir. Bu nedenle bu adım isteğe bağlıdır.
Veri kümesi birkaç kilobayt boyutundadır. İsteğe bağlı fiyatlandırma kapsamında her sorgu için minimum 10 MB üzerinden faturalandırma yapılır. Bu nedenle, tüm codelab'in maliyeti bir sentin çok küçük bir kısmıdır.
2. Kurulum
Cloud Shell'in kullanıldığı tek adım budur. Bu araç bir proje oluşturur, faturalandırmayı etkinleştirir ve ham tabloları oluşturur. Grafik, ölçü ve her sorgu, daha sonra BigQuery konsolunda çalıştırabileceğiniz öğelerdir.
Bu laboratuvarda size verilemeyecek tek şey, faturalandırmanın etkin olduğu bir Google Cloud projesidir. 1. adımda, ödeme yapabilecek bir hesap oluşturursunuz. 4. adımda ise bu hesabı projeye dönüştürürsünüz. Bu adımları sırayla uygulayın. 4. adımdan sonraki her adım, 4. adımda oluşturulan projeyi okur.
1. Faturalandırma özellikli bir hesap edinin (~1 dakika)
👉🌐 Başka bir işlem yapmadan önce bunu yapın. Faturalandırmanın etkin olduğu bir Google Hesabı ile oturum açın. Bu tür hesapların herhangi birini kullanabilirsiniz. Sizinki yoksa ücretsiz deneme başlatın. Bu işlemle, 4. adım için gereken faturalandırma hesabını elde edersiniz.
2. Cloud Shell'i açın (~1 dakika).
👉🌐 Konsol: Google Cloud Console'un üst kısmındaki Cloud Shell'i etkinleştir'i tıklayın. Bu, başlıktaki terminal şeklindeki simgedir. Sayfanın en altında bir terminal açılır.

👉🌐 Console: Bugün herhangi bir noktada yetkilendirme yapmanız istenirse devam etmek için Authorize'ı (Yetkilendir) tıklayın.
👉💻 Cloud Shell: Cloud Shell'in hangi hesapla oturum açtığını kontrol edin:
gcloud auth list
👀 Hesabınızın * ile işaretlenmesini bekleyin. Bu hesap, 1. adımda oturum açtığınız hesapla aynı olmalıdır. Doğru değilse gcloud auth login komutunu çalıştırın ve doğru olanı seçin.
3. Laboratuvarı edinin (~1 dakika)
👉💻 Cloud Shell — depoyu klonlayın:
cd ~
rm -rf ~/bq-graph-measures-lab
git clone https://github.com/cuppibla/bq-graph-measures-lab.git
cd ~/bq-graph-measures-lab
4. Projenizi oluşturun (~2 dakika)
👉💻 Cloud Shell: Bir komut dosyası, faturalandırma hesabınızı bulur, bu hesapta bir proje oluşturur ve Cloud Shell'i bu projeye yönlendirir:
cd ~/bq-graph-measures-lab
./setup_project.sh
👀 Seçtiği faturalandırma hesabı için beklenen ✓, oluşturduğu proje için ✓ ve şu şekilde bir son:
Project ready: bq-graph-4271 Next: ./setup.sh
bq-graph-4271, proje kimliğinizdir. Sizinki farklı rakamlardan oluşur. Bu süreçte dört şey olur:
billing | varsa en yeni | |
project |
| |
seçer | Kimliği | |
waits | yeni proje gerçekten yayınlanmaya başlayana kadar iki dakika boyunca anketler gösterilir. | |
🌐 Aynı proje artık konsolda. Projenin kimliği, kontrol panelindeki Proje bilgileri kartında yer alıyor:

5. Veri kümesini oluşturun (~3 dakika)
👉💻 Cloud Shell: Tabloları oluşturan bir komut dosyası daha vardır:
cd ~/bq-graph-measures-lab
./setup.sh
Komut dosyası, her adımı çalıştırırken yazdırır. Bu kod sırasıyla şu işlemleri yapar:
project | proje | |
API |
| |
dataset | ABD'deki çok bölgeli | |
check | Her tablodaki satırları sayar ve herhangi bir sayı yanlışsa durur. | |
👀 Beklenenler:
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'i kullanmayı bitirdiniz. Bu pencereyi kapatabilirsiniz.
6. BigQuery'yi ve bir sorgu düzenleyiciyi açın.
👉🌐 Konsol: Çıkışın sonundaki bağlantıyı tıklayın veya gezinme menüsünden BigQuery'yi açın. Soldaki Explorer (Gezgin) bölmesinde projenizi genişletin: beş tablonun bulunduğu bir music veri kümesi.

👉🌐 Konsol: BigQuery Studio'nun üst kısmındaki Yeni oluştur satırında SQL sorgusu'nu tıklayın. Boş bir düzenleyici sekmesi açılır.

Bu sekmeyi tutun. Bu laboratuvardaki her 👉📋 blok buraya gider: Düzenleyicideki her şeyi seçin, yeni bloğu üzerine yapıştırın ve Çalıştır'ı tıklayın. Sonuç, alttaki panelde gösterilir.
Tablolarla tanışma
Bu tablolarla ilgili iki nokta daha sonra önem kazanır. Her tablo, birincil anahtarını NOT ENFORCED olarak bildirir: BigQuery bunu kontrol etmez ancak oluşturmak üzere olduğunuz mülk grafiğinin, bir satırı neyin tanımladığını bilmesi için açık bir anahtar gerekir. Son tablo olan PlaylistEntries ise bir bağlantı tablosudur: Dört oynatma listesinde yer alan bir şarkı, bu tabloda dört satır olarak gösterilir. Hikayenin tamamı bu tabloda gerçekleşir.
Tablolar şu şekilde birbirine bağlanır: Bir plak şirketi sanatçılarla sözleşme imzalar, sanatçı şarkı yayınlar, şarkı PlaylistEntries aracılığıyla oynatma listelerine eklenir. Cymbal Records, Ava Sterling ve Mina Okafor'un yanı sıra bu sanatçıların dört şarkısının da sahibidir. Northwind Audio, Kai Nakamura'ya ve Midnight Drive adlı şarkıya sahiptir.
masa | satırlar | anahtar | İçeriği |
Etiketler | 2 |
| ad, pazarlama bütçesi |
Sanatçılar | 3 |
| name, which label |
Şarkılar | 5 |
| başlık, sanatçı, akış sayısı |
Oynatma listeleri | 4 |
| ad, takipçi sayısı |
PlaylistEntries | 10 |
| hangi şarkı hangi oynatma listesinde yer alıyor? |
✅ Kontrol noktası: Cloud Shell'de 🎉 ready, Explorer'da music altında beş tablo ve boş bir sorgu düzenleyici sekmesi açık olmalıdır.
3. Grafiği oluşturma: A seçeneği (görsel modelleyici)
Özellik grafiği, tabloların nasıl bağlandığını gösteren bir açıklamadır. Bu kodu görsel grafik modelleyicide birlikte tıklayabilir (bu adımda tüm tıklamalar) veya SQL olarak yazabilirsiniz (sonraki adımda tek bir yapıştırma). İkisi de aynı nesneyi üretir. İkisini birden değil, yalnızca birini kullanın.
1. Grafik kabuğunu oluşturma
👉🌐 Konsol: BigQuery Studio'da, Yeni oluştur satırında Yapay zeka ve bilgi menüsünü açıp Grafik'i tıklayın.
👉🌐 Console: MusicGraph değerini Grafik adı, music değerini ise Veri kümesindeki grafik hedefi olarak girin. Bölge, veri kümesinden (ABD) doldurulur.
👉🌐 Console: Veri kaynakları bölümünde beş tabloyu (Sanatçılar, Plak Şirketleri, PlaylistEntries, Oynatma Listeleri, Şarkılar) seçin ve Oluştur'u tıklayın.

👀 Tuval, aralarında çizgi olmayan beş renkli düğümle açılıyor. Sağdaki Ayrıntılar panelinde Düğümler (5) ve Kenarlar (0) listelenir. Her düğüm, tablosunun birincil anahtarını ve tüm sütunlarını özellik olarak taşır. Bunları görmek için herhangi bir düğümü tıklayın.

2. Dört kenarı çizin
Kenar, çizilmiş bir yabancı anahtardır. Her biri, anahtarı tutan tablodan işaret ettiği tabloya gider.
👉🌐 Console (Konsol): New edge'i (Yeni kenar) tıklayın. Tablo seçin iletişim kutusunda PlaylistEntries simgesini seçip Ekle'yi tıklayın. Kenar ekle panelinde:
- Ad'ı
EntryToSongolarak ayarlayın. - Birincil anahtar ekle'yi tıklayın ve
entry_id'yi kabul edin. - Kaynak bölümünde Kaynak düğümü'nü PlaylistEntries olarak ayarlayın, ardından her ikisi için de
entry_idseçmek üzere Referans verilen sütunları düğüme ekle ve Referans verilen sütunları kenara ekle'yi kullanın. - Hedef bölümünde Hedef düğümü'nü Şarkılar olarak ayarlayın, ardından hem Düğümdeki referans sütunları hem de Kenardaki referans sütunları için
song_idsimgesini seçin. - Bitti'yi tıklayın.

👉🌐 Console (Konsol) kelimesini üç kez daha tekrarlayın:
kenar adı | masa | kaynak düğüm → hedef düğüm | Her iki tarafta da seçilecek sütun |
| PlaylistEntries | PlaylistEntries → Playlists | kaynak |
| Şarkılar | Şarkılar → Sanatçılar | kaynak |
| Sanatçılar | Sanatçılar → Müzik Şirketleri | kaynak |
Her kenarı ek özellikler olmadan bırakın.
👀 Ayrıntılar panelinde artık Kenarlar (4) yazıyor ve tuvalde şu zincir gösteriliyor: Etiketler ← Sanatçılar ← Şarkılar ← OynatmaListesiGirişleri → Oynatma Listeleri.

3. Ölçü ekleme
👉🌐 Konsol: Şarkılar düğmesini, ardından Ayrıntılar panelinin üst kısmındaki düzenle (kalem) simgesini tıklayın. Plak şirketinin Özellikler bölümünde Özellik ekle'yi, ardından Alan ekle'yi tıklayın.
👉🌐 Console (Konsol): Alan adı olarak total_streams girin ve İfade kutusuna şunu yazın:
MEASURE(SUM(streams))
👉🌐 Konsol: Ekle'yi, ardından Bitti'yi tıklayın.

4. Yazdığı kodu okuyun ve yayınlayın.
👉🌐 Konsol: Sağ panelde Kod sekmesini açın. Modelleme uzmanı, sizin için CREATE PROPERTY GRAPH ifadesini yazdı. Şarkılar düğümüne gidin: Özellik listesi artık
MEASURE(SUM(streams)) AS `total_streams`
Bu, özelliğin tek satırlık özetidir. Bu adımdan sonraki her şey, bu satırın ne yaptığıyla ilgilidir.

👉🌐 Console: Yayınla'yı tıklayın.
✅ Kontrol noktası: Gezgin'deki music artık MusicGraph'ı içeren bir Grafikler klasörüne sahip. Beş düğüm, dört kenar ve Kod sekmesindeki MEASURE(SUM(streams)) satırını tıklayın. Sonraki adımı atlayın ve YAN YANA TOPLAMA ve TOPLU'ya gidin.
4. Grafiği oluşturma: B seçeneği (SQL)
Grafiği modelleyicide oluşturduysanız bu adımı atlayın.
👉📋 Sorgu düzenleyici: Kodu yapıştırın ve Çalıştır'ı tıklayın:
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
)
👀 Sonuç panelinde, mülk grafiğinin oluşturulduğu belirtiliyor.

Bir kez okuma
Grafikte beş düğüm tablosu ve dört kenar tablosu vardır. Her düğüm tablosu KEY adını verir ve PROPERTIES listeler. MEASURE ile başlayan satırlar yeni kısımdır: Her biri, desteklenen toplama işlemlerinden birini bir özellik etrafında sarmalar ve buna gerekli olan bir takma ad verir.
Her kenar tablosu, yabancı anahtardır. Anahtarı tutan tabloda SOURCE KEY, işaret ettiği tabloda DESTINATION KEY olarak yazılır. NO PROPERTIES, kenarın kendi başına hiçbir şey taşımadığı anlamına gelir.
PlaylistEntries öğesinin üç kez göründüğünü fark edin: bir kez düğüm tablosu olarak, iki kez daha EntryToSong ve EntryToPlaylist kenarlarının arkasındaki fiziksel tablo olarak. Bu kasıtlı olarak yapılmıştır ve nedenini daha sonra açıklayacağız.
Oluşturduğunuz içeriklere göz atma
👉🌐 Console: Gezgin bölmesinde music, ardından Graphs'i genişletin ve MusicGraph'i tıklayın. Grafik sayfası, beş düğüm ve dört kenar içeren bir tuvalde açılır. Özelliklerini görmek için bir düğümü tıklayın. Metrikler, toplamlarıyla birlikte listelenir. Resmin arkasındaki ifadeyi görmek için Kod sekmesini açın.

✅ Kontrol noktası: music, MusicGraph'ı içeren bir Graphs klasörüne sahip ve Kod sekmesinde MEASURE(SUM(streams)) AS total_streams gösteriliyor.
5. YANALAN ve TOPLA, yan yana
Bu, tüm codelab'i tek bir sorguda birleştirir. Her iki sütun da aynı tablodan aynı soruyu (etiket başına toplam yayın sayısı) yanıtlamaya çalışır.
Bu tablo, GRAPH_EXPAND tarafından oluşturulur. Grafiği düzleştirir: Bir tablodan başlar ve her kenarı dışa doğru LEFT JOIN olarak takip eder. Böylece, bağlı olan tüm tablolar tek bir geniş sonuçta yan yana yer alır. Şarkı başına değil, yerleşim başına bir satır ve TableLabel_property adlı her sütun. Sorgulamadan önce inceleyin.
👉📋 Sorgu düzenleyici: Kodu yapıştırın ve Çalıştır'ı tıklayın:
SELECT Labels_label_name, Songs_title, Songs_streams, Playlists_playlist_name
FROM GRAPH_EXPAND("music.MusicGraph")
ORDER BY Songs_title, Playlists_playlist_name
👀 Beklenen: 10 satır (PlaylistEntries içindeki her yerleşim için bir satır). Kurulum tam olarak bunu yükledi. Neon Summer, bulunduğu her oynatma listesinde bir kez olmak üzere dört yer kaplıyor ve her birinde Songs_streams okunuyor. Bu satırlarda bir sorun yok. Oynatma listeleri gerçekten dört tane. Ancak bir şarkıya ait olan sütun artık yerleşimlere ait satırlarda tekrarlanıyor ve bu, sonraki sorgunun ölçtüğü asıl sorun.
Şimdi de karşılaştırma.
👉📋 Sorgu düzenleyici: Kodu yapıştırın ve Çalıştır'ı tıklayın:
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
👀 Sonuç:
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 |

Elle kontrol edin. Cymbal'ın dört şarkısı sırasıyla 2,0 milyar, 1,5 milyar, 1,2 milyar ve 0,4 milyar kez yayınlandı. Bu sayı 5,1 milyar. AGG doğru. SUM iki buçuk kat fazla büyük ve Northwind'in tek şarkısı iki katına çıktı.
Üç yeni söz dizimi
GRAPH_EXPAND("music.MusicGraph"), her kenarıLEFT JOINolarak izleyerek grafiği geniş bir tabloya dönüştüren tablo değerli bir işlevdir. Her sütunTableLabel_propertyolarak adlandırılır. Bu nedenle,Songs_streams, Songs tablosundaki ham sütun,Songs_total_streamsise bildirdiğiniz ölçüdür.SUM(Songs_streams), bu geniş tablo üzerinde normal SQL'dir ve düzleştirmenin oluşturduğu her yineleneni devralır.AGG(Songs_total_streams), ölçüyü bildirildiği şekilde değerlendirir:SUM(streams)bir şarkı geniş tabloda kaç satır kaplarsa kaplasınsong_idbaşına bir kez.
✅ Kontrol noktası: İki etiket, iki sütun ve with_agg sayıları el sayısıyla eşleşiyor.
6. TOPLA işlevi neden fazla sayar?
Bir şarkı seçip bu birleştirme işlemlerinin şarkı üzerinde ne gibi etkileri olduğunu görün.
👉📋 Sorgu düzenleyici: Kodu yapıştırın ve Çalıştır'ı tıklayın:
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
👀 Sonuç:
adım | title | dinlenme | oynatma listesi |
ÖNCESİ - Şarkılar tablosu | Neon Yaz | 2.000.000.000 | null |
SONRA: Oynatma listelerine eklenir. | Neon Yaz | 2.000.000.000 | Gym Pump |
SONRA: Oynatma listelerine eklenir. | Neon Yaz | 2.000.000.000 | Şu Anda Popüler Olanlar |
SONRA: Oynatma listelerine eklenir. | Neon Yaz | 2.000.000.000 | Yükselen Pop |
SONRA: Oynatma listelerine eklenir. | Neon Yaz | 2.000.000.000 | Yolculuk |

Bir satır dört satır oldu. Akış sayısı değişmedi, kopyalandı. Kopyaların Cymbal Records'a katkısını toplayın: Dört oynatma listesinde 2 milyar dinlenen Neon Summer 8 milyar, iki oynatma listesinde 1,5 milyar dinlenen Paper Crown 3 milyar, bir oynatma listesinde 1,2 milyar dinlenen Double Shot 1,2 milyar, bir oynatma listesinde 0,4 milyar dinlenen Slow Arrow 0,4 milyar. Bu, 12,6 milyar yani SUM döndürülen sayıdır. Northwind's Midnight Drive, iki oynatma listesinde yer aldığından 4,5 milyar, 9,0 milyara yükseldi.
Bu, fan-out işlemidir ve birleştirme işleminde hata yoktur. Oynatma listesi satırları gerçektir. Hata, yerleşimlere ait satırlarda bir şarkıya ait sayının toplanmasıdır.
Şarkılar düğümünde KEY (song_id) ile birlikte bildirildiği için ölçü bunu düzeltir. Önemli olan tahıldır. AGG işlevi total_streams olarak değerlendirildiğinde, şarkı anahtarı başına bir kez toplanır ve yalnızca o zaman gruplandırdığınız öğeye göre özetlenir.
Ne değişti?
Eskiden şöyle yazıyordunuz: | Ölçüyle |
| Grafikte |
|
|
Üç |
|
Birleştirme işleminden önce toplama yapan bir CTE | Hiç. Greni |
✅ Kontrol noktası: Beş satır (BİRİ ÖNCE, DÖRDÜ SONRA) ve bunlardan 12,6 milyar yeniden oluşturabilirsiniz.
7. Kural: Yalnızca AGG bir ölçü okur
Ölçülerin kendi türü (MEASURE) vardır ve tam olarak bir işlev bunu kabul eder. Aşağıdaki dört sorgu bilerek başarısız olur. Her birini çalıştırıp kırmızı hatayı okuyun. Herkesin ilk denediği dört yöntem bunlardır. Bu yöntemlerin ne işe yaradığını bilmek daha sonra zamandan tasarruf etmenizi sağlar.
👉📋 Sorgu düzenleyici — AGG düz bir sütunda:
SELECT AGG(Songs_streams) FROM GRAPH_EXPAND("music.MusicGraph")
👀 No matching signature for aggregate function AGG ... Argument 1: expected MEASURE

👉📋 Sorgu düzenleyici: AGG içermeyen bir ölçü sütunu:
SELECT Songs_total_streams FROM GRAPH_EXPAND("music.MusicGraph") LIMIT 1
👀 Returning expressions of type MEASURE is not allowed

👉📋 Sorgu düzenleyici: GQL'de referans verilen ve hiçbir zaman ölçü görmeyen bir ölçü (bu bir GQL sorgusudur. Genel bakıştaki sürüm notuna bakın):
GRAPH music.MusicGraph
MATCH (s:Songs)
RETURN s.total_streams
LIMIT 1
👀 total_streams is not exposed by element type GRAPH_NODE(...)

👉📋 Sorgu düzenleyici: Bir ölçüm sütununun üzerine SUM getirin.
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

Bu nedenle, tür sistemi kuralı sizin için zorunlu kılar. Ölçü yalnızca GRAPH_EXPAND üzerinden görülebilir ve yalnızca AGG üzerinden okunabilir. Daha önce fazla sayılan 12,6 milyar yalnızca ham sütunun toplanmasıyla elde edilebilir.Bu değer, hiçbir zaman ölçünün yanlış işlenmesinden kaynaklanmaz.
✅ Kontrol noktası: Dört kırmızı hata var ve her birinin hangi kuralı uyguladığını söyleyebilirsiniz.
8. Bir ölçünün desteklediği her toplama
MEASURE(), altı toplama işleminden birini kapsar: SUM, AVG, MIN, MAX, COUNT ve COUNT(DISTINCT). Şarkılar düğümünde altı öğenin tamamını kullanarak grafiği yeniden oluşturun. Kenarlar NO PROPERTIES olarak kalır. Bu, bir kenarın fiziksel tablosunu bir düğümle paylaştığı durumlarda belgelenmiş en iyi uygulamadır.
👉📋 Sorgu düzenleyici: Kodu yapıştırın ve Çalıştır'ı tıklayın:
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
)

Şimdi hepsini tekrar okuyun. Her ölçü AGG işleminden geçer ve son sütun, AGG sonuçlarının aritmetik işlemler yapabileceğiniz normal değerler olduğunu gösterir. Grafik yeni değiştiyse önce Önbelleğe alınmış sonuçları kullan seçeneğinin işaretini kaldırın (Diğer → Sorgu ayarları).
👉📋 Sorgu düzenleyici: Kodu yapıştırın ve Çalıştır'ı tıklayın:
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
👀 Sonuç:
Labels_label_name | total_streams | avg_streams | min_streams | max_streams | şarkı | sanatçılar | 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 |

Her sayı, on yerleştirme satırı üzerinden değil, Cymbal için dört şarkı ve Northwind için bir şarkı üzerinden hesaplanır. Özellikle AVG, diğer şekilde yanlış olurdu: Yerleşim satırları üzerinden ham sütunun ortalaması alındığında, Neon Summer'ın 2 milyarı dört kez sayıldığından Cymbal için 1,575 milyar elde edilir.
Bu nedenle "TOPLA yerine TOPLA.ÇARPIM kullan" aslında iki karardan oluşur. Ölçümü tanımlarken altı toplama işleminden hangisi olduğunu seçersiniz. Ölçümü okurken işlev her zaman AGG olur.
✅ Kontrol noktası: Etiket başına bir satır, her satırda yedi sayı ve streams_per_song eşittir avg_streams.
9. Ölçüyü değil, gruplandırmayı değiştirme
Aynı ölçü farklı bir soruyu yanıtlıyor. Etiket yerine oynatma listesine göre gruplandırın.
👉📋 Sorgu düzenleyici: Kodu yapıştırın ve Çalıştır'ı tıklayın:
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
👀 Sonuç:
Playlists_playlist_name | dinlenme | şarkı |
Yolculuk | 6.900.000.000 | 3 |
Gym Pump | 6.500.000.000 | 2 |
Şu Anda Popüler Olanlar | 4.700.000.000 | 3 |
Yükselen Pop | 3.500.000.000 | 2 |

İki AGG satırı, YAN YANA TOPLAMA ve AGG'daki satırlarla bayt bayt aynıdır. Yalnızca GROUP BY taşındı. Road Trip oynatma listesinde Neon Summer, Midnight Drive ve Slow Arrow şarkıları yer alıyor. Bu oynatma listesinde her şarkı bir kez çalınıyor. "Bu oynatma listesine ulaşan yayınlar" ifadesi tam olarak bunu ifade ediyor.
Ölçüyü yazan kişi, bir kez tane boyutuna karar verir. Daha sonraki tüm sorgular bu ayarı devralır.
✅ Kontrol noktası: 6,9 milyar ile Road Trip zirvede.
10. GRAPH_EXPAND'in sunduğu avantajları görün
Şeklini öğrenmek için GRAPH_EXPAND komutunu çalıştırmanız gerekmez. BQ.SHOW_GRAPH_EXPAND_SCHEMA sistem yordamı, sütun listesini bir değişkene yazar.
👉📋 Sorgu düzenleyici: Üç satırı da yapıştırın, ardından Çalıştır'ı tıklayın:
DECLARE schema STRING DEFAULT '';
CALL BQ.SHOW_GRAPH_EXPAND_SCHEMA('music.MusicGraph', schema);
SELECT schema;
👀 Sonuç, bir JSON dizesidir. Her alanın adı, türü ve modu vardır ve her ölçü sütunu "is_measure": true taşır. Yeni oluşturduğunuz grafik için aşağıdakiler gibi bilgiler elde edersiniz:
ad | tür | is_measure | |
Songs_title | Dize | ||
Songs_streams | TAM SAYI | ||
Songs_total_streams | TAM SAYI | doğru | |
Songs_avg_streams | KAYAN NOKTALI | doğru | |
Songs_distinct_artists | TAM SAYI | doğru | |
PlaylistEntries_placement_count | TAM SAYI | doğru | |

Bir mülkte ayarladığınız tüm açıklamalar veya eş anlamlılar da burada gösterilir. İsteğe bağlı sohbet adımında, bu mesajları kimlerin okuduğu gösterilir.
✅ Kontrol noktası: MEASURE ile tanımladığınız her sütunda is_measure bulunan bir JSON dizesi.
11. GRAPH_EXPAND işlevinin bir grafiğin şekliyle ilgili ihtiyaçları
Bu adımda çalıştırılacak bir şey yok. Sadece okuyun. GRAPH_EXPAND, bir tablodan başlayıp kenarları dışa doğru takip ederek LEFT JOIN zinciriyle geniş tablosunu oluşturur. Bu durumdan üç kural ortaya çıkıyor ve MusicGraph bunların hepsini karşılıyor.

Tam olarak bir kök düğüm tablosu. Kök, anahtarı başka hiçbir tabloda görünmeyen düğüm tablosudur. Yani hiçbir kenarın işaret etmediği tablodur. MusicGraph'ta PlaylistEntries: İki kenarın kaynağı ve hiçbirinin hedefi değil. Geniş tabloda, yerleşim başına bir olmak üzere 10 satır bulunur.
Her kenar, çoktan bire, kaynaktan hedefe olacak şekilde çalışır. Her girişte bir şarkı ve bir oynatma listesi, her şarkıda bir sanatçı, her sanatçıda bir etiket bulunur. Bu nedenle, geniş tablo hiçbir zaman kökün kendi satırlarının ötesine geçmez. Kökün erişemediği veriler görünmez: Yerleşimi olmayan bir şarkı, geniş tabloda eksik olur.
Çoktan çoka ilişkiler düğüm haline gelir. Şarkılar ve oynatma listeleri arasında çoktan çoğa ilişki vardır. Birleşim tablosunu Şarkılar'dan Şarkı listeleri'ne giden tek bir kenar olarak tanımladıysanız GRAPH_EXPAND, bunu belirsiz olduğu için yoksayar ve kullanılabilir kenar kalmadığından işlem başarısız olur. PlaylistEntries öğesini, kendisinden çıkan iki çoktan bire kenarı olan bir düğüm tablosuna yükseltmek, belgelenmiş bir kalıptır ve grafiği oluştururken yaptığınız işlemdir.
12. (İSTEĞE BAĞLI) GQL ile yollar
Şimdiye kadar her sorunun yanıtı bir sayı oldu. Bu özellik desteklenmez. Cymbal'ın yayınları dinleyicilere nerede ulaşıyor?, grafikteki rotalarla ilgili bir sorudur ve toplam bu soruyu yanıtlayamaz. Toplama yaptığınızda rota kaybolur.
1. Akışların nereye gittiğini sorun
👉📋 Sorgu düzenleyici: Kodu yapıştırın ve Çalıştır'ı tıklayın:
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
👀 Dört oynatma listesi oluşturulur:
pl.playlist_name | pl.followers | streams_reaching_this_playlist | şarkı |
Şu Anda Popüler Olanlar | 35.000.000 | 4.700.000.000 | Double Shot, Neon Summer, Paper Crown |
Yükselen Pop | 2.000.000 | 3.500.000.000 | Neon Summer, Paper Crown |
Yolculuk | 5.000.000 | 2.400.000.000 | Neon Summer, Slow Arrow |
Gym Pump | 3.000.000 | 2.000.000.000 | Neon Yaz |

MATCH satırını cümle olarak okuyun: Bir etiketten başlayıp sanatçılarına, şarkılarına, bu şarkıların bulunduğu oynatma listesi girişlerine ve ardından oynatma listelerine doğru ilerleyin. Oklar, kenarların bildirildiği yönü gösterir. <-, bir adım geri gider.
Şimdi üçüncü sütunu toplayın. 12, 6 milyar: SUM adımında verdiğimiz yanlış sayı.
Burada doğru. O zamanlar, Cymbal'da ne kadar yayın yapıldığı soruluyordu ve bir şarkı, kaç oynatma listesinde yer alırsa alsın bir kez sayılıyordu. Bu sorunun cevabı, bu akışların ulaştığı yerdir ve dört oynatma listesindeki bir şarkı gerçekten dört kitleye ulaşır. GRAPH_EXPAND işaretlemesiyle oluşturulan kopya, bir sorunun yanıtı ve diğer sorunun cevabı için hata veriyor. AGG, hiçbir zaman yinelenenlerin kötü olmasıyla ilgili değildi. Amaç, aritmetiğin soruyla eşleşmesini sağlamaktı.
2. Yolların kendisini döndürme
Toplamayı bırakıp rotaları isteyin.
👉📋 Sorgu düzenleyici: Kodu yapıştırın ve Çalıştır'ı tıklayın:
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 = tüm eşleşmeyi adlandırır ve TO_JSON bunu oluşturur.
👀 8 satır ve bir path sütun bekleyin. Her hücre, bir rota üzerindeki düğümlerin ve kenarların JSON dizisidir. Her düğüm, labels ve properties değerlerini taşır.

Yerleşim başına bir rota olduğundan şarkı başına değil, dört şarkı için sekiz satır.
3. Grafik sekmesini açın.
👉🌐 Konsol: Sonuçların üzerinde Grafik'i tıklayın.
Bu sekme yalnızca bir sonuçta grafik öğeleri olduğunda görünür. Önceki sorgu sayılar döndürdüğü için Grafik sekmesi yoktu. Bu sorgu yollar döndürdüğü için Grafik sekmesi var.

Grafiğin Cymbal'a ait köşesi, görünümdeki düğümlerin ve kenarların sayısı ile etiket başına bir çip olacak şekilde zorunlu düzen olarak çizilir. Düzeni ayırmak için bir düğümü sürükleyin, özelliklerini okumak için bir düğümü tıklayın.
✅ Kontrol noktası: İlk sorgunun üçüncü sütunundaki değerlerin toplamı 12, 6 milyar, ikinci sorgu 8 yol döndürüyor ve Grafik sekmesi bunları çiziyor.
13. (İSTEĞE BAĞLI) Grafikle sohbet etme
Bu adımda SQL yok. BigQuery veri aracıları, bilgi kaynağı olarak grafik kullanabilir ve dokümanlarda, çok düzeyli toplama için ölçüleri kullandıkları belirtilir. Bunun doğru olup olmadığına bakalım.
1. Ajanı oluşturma
👉🌐 Konsol: Soldaki BigQuery gezinme menüsünde Aracılar'ı, ardından Aracı kataloğu'nu ve Aracı oluştur'u tıklayın.
👉🌐 Konsol: Aracı adı alanına Music graph agent, Aracı açıklaması alanına ise şunu girin:
Ask questions about labels, artists, songs and playlists in the music property graph.
👉🌐 Console: Bilgi kaynakları bölümünde Kaynak ekle'yi tıklayın. Kaynakları seçin iletişim kutusunda projenizi, music'ı ve Grafikler'i genişletin, MusicGraph'i işaretleyin ve Onayla'yı tıklayın.
👀 Kaynak ekle düğmesi gri renkte görünür. Bir aracı en fazla bir grafik tutabilir ve grafikleri tablolarla karıştıramaz.

👉🌐 Console: Region (Bölge) ayarını grafiğin konumundan değiştirin. Kaydet'i, ardından Yayınla'yı tıklayın. Yayınlama kanalları panelinde Temsilciyi yayınla'yı tıklayın ve onayı kapatın.
2. Soruyu sorun
👉🌐 Konsol: Sohbet oluştur'u tıklayın. Bir sohbet sayfası açılır. Aşağıdaki metni en alttaki Bir soru sorun kutusuna yazıp Enter tuşuna basın:
For each label, show total streams and how many playlists their songs are on
👀 Ajan, bir tablo ve tek cümlelik bir özet döndürüyor:
label_name | total_streams | playlist_placements |
Cymbal Records | 5.100.000.000 | 8 |
Northwind Audio | 4.500.000.000 | 2 |

5,1 milyar. Ajan, fan-out hakkında bilgilendirilmedi ve bu kategoriye girmedi.
3. Yazdığı sorguyu okuyun.
👉🌐 Konsol: Gezinme menüsünde İş Gezgini'ni ve en yeni işi tıklayın. Etiketleri arasında, aracınızın kimliğinin yer aldığı ca-bq-job: true ve data-agent-id bulunur. Sorgusu ise şöyledir:
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

Ölçüler, okuduğu şemada yer aldığından GRAPH_EXPAND ve AGG kendi başına kullanıldı. Temsilcinin açıklamasında bu durumdan bahsedilmiyor.
✅ Kontrol noktası: Sohbet yanıtında 5,1 milyar, işin SQL'inde ise AGG(...) var.
14. Temizleme
👉💻 Cloud Shell: Veri kümesini, tablolarını ve özellik grafiğini bırakın:
cd ~/bq-graph-measures-lab
./cleanup.sh
👀 Beklenen ✓ dropped YOUR_PROJECT_ID.music (tables and graph).
İsteğe bağlı veri aracısını oluşturduysanız konsolda Agents → Agent catalog (Ajanlar → Ajan kataloğu) bölümünden silin. ./setup_project.sh bu laboratuvar için bir proje oluşturduysa en temiz çözüm, projenin tamamını kapatmaktır. Proje kimliği ~/project_id.txt içinde yer alır.
15. Tebrikler
MEASURE(SUM(streams)) satırını beyan ettiniz ve bu satır, 12,6 milyarı 5,1 milyara düşürdü. Bu değişiklik, sizin için ve bir temsilcinin yazdıkları da dahil olmak üzere, bu grafiğe karşı yazılan her sorgu için geçerli oldu.
Öğrendikleriniz
- Ölçü, tanesini belirleyen
KEYsimgesinin yanında bir düğümde beyan edilen bir toplama işlemidir. GRAPH_EXPAND, grafiğiTableLabel_propertysütunlu geniş bir tabloya düzleştirir.AGG, bir ölçüyü okuyan tek işlevdir ve tür sistemi bunu dört farklı şekilde zorunlu kılar.- Altı toplama işlemi kullanılabilir ve
AGGsonuçları, bölünebilen normal değerlerdir. GROUP BYdeğiştirildiğinde soru, ölçüye dokunulmadan yeniden sorulur.GRAPH_EXPAND, bir kök, çoktan bire kenarlar ve düğümlere yükseltilmiş kavşaklar istiyor.
Karar tablosu
Belirti | Neden | Düzelt |
Çok büyük bir toplam |
| bir ölçü bildirin, |
"expected MEASURE, found INT64" ("MEASURE bekleniyordu, INT64 bulundu") |
|
|
"MEASURE türünde ifadelerin döndürülmesine izin verilmez" | ölçü sütunu olmadan | paketleyin: |
"not exposed by element type" (öğe türüne göre kullanıma sunulmadı) | GQL'de referans verilen ölçü | yalnızca |
| kavşak, kenar olarak modellenir | birleşim tablosunu düğüme yükseltme |
Grafiği değiştirdikten sonraki eski numara | önbelleğe alınmış sonuç | Önbelleğe alınan sonuçları kullan seçeneğinin işaretini kaldırın. |
Kasten ele almadığımız konular
Mülklerdeki açıklamalar ve eş anlamlı kelimeler, veri aracıları için doğrulanmış sorgular ve sözlükler, birden fazla MATCH'nın ötesinde GQL, birden fazla grafik genelinde ölçümler. Her biri kendi laboratuvarıdır.
Daha fazla bilgi
- Metriklerle çalışma
- Özellik grafiği oluşturma ve sorgulama
- Etkileşimli Analytics'e genel bakış
- Laboratuvar deposu: Bu codelab'deki her sorgu, adım adım numaralandırılmış