Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pemfilteran mempersempit hasil Anda ke baris yang penting. Agregasi meringkas baris tersebut menjadi hitungan, total, dan rata-rata. Artikel ini memperlihatkan kepada Anda cara menerapkan kedua teknik dalam kueri GQL terhadap grafik dalam Microsoft Fabric.
Contohnya menggunakan himpunan data sampel jejaring sosial. Untuk penjelasan menyeluruh tentang alur dan pernyataan kueri, lihat panduan bahasa GQL.
Gunakan artikel ini untuk penyaringan baris dan pola, agregasi terkelompok dan tidak dikelompokkan, filter khusus agregat, dan routing bersyarat. Untuk membangun pola multihop dan memilih jalur, lihat Tulis kueri pola grafik. Untuk tugas bisnis yang siap disesuaikan, lihat Menulis kueri GQL umum.
Prasyarat
- Item grafik yang dibangun dari dataset sampel jejaring sosial, dengan tipe node, tipe tepi, dan properti yang dijelaskan dalam contoh skema jejaring sosial.
- Pemahaman tentang konsep dasar
MATCHdanRETURNkueri. Lihat Panduan bahasa GQL.
Memfilter baris dengan FILTER
Gunakan FILTER untuk menyimpan hanya baris yang memenuhi kondisi. Tempatkan FILTER setelah MATCH untuk mempersempit hasil yang cocok.
Kueri berikut mengembalikan semua wanita dengan nama dan ulang tahun mereka:
MATCH (p:Person)
FILTER p.gender = 'female'
RETURN p.firstName, p.lastName, p.birthday
Gabungkan beberapa kondisi dengan AND dan OR. Misalnya, kueri berikut mengembalikan nama semua wanita yang lahir sebelum 1990:
MATCH (p:Person)
FILTER p.gender = 'female' AND p.birthday < 19900101
RETURN p.firstName, p.lastName
Tip
Gunakan klausa inline WHERE ketika kondisi menentukan node atau edge mana yang dapat berpartisipasi dalam pertandingan. Gunakan FILTER ketika kondisi berlaku untuk baris yang dihasilkan oleh pernyataan sebelumnya. Penempatan predikat dapat mengubah hasil jalur terpendek; lihat Tempatkan predikat sebelum atau sesudah pemilihan jalur.
Filter selama pencocokan pola
Klausa inline WHERE di dalam MATCH pola membatasi node dan tepi mana yang memenuhi syarat untuk match. Pengoptimal kueri dapat menerapkan predikat yang setara selama pemindaian, sehingga sintaks sebaris pada dasarnya tidak lebih cepat daripada FILTER yang terpisah. Pilih bentuk yang mengekspresikan semantik yang dimaksudkan.
Misalnya, untuk menemukan orang yang lahir sebelum 1994 bersama dengan perusahaan tempat mereka bekerja, membatasi hasil untuk perusahaan yang namanya dimulai dengan 'A':
MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name
Filter properti tepi dengan cara yang sama. Misalnya, untuk menampilkan hanya orang yang mulai bekerja di perusahaan pada tahun 2000 atau setelahnya:
MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)
RETURN p.firstName, p.lastName, c.name, w.workFrom
Untuk informasi lebih lanjut tentang memilih antara penyaringan inline dan pasca-pertandingan, lihat Optimalkan performa kueri GQL.
Menangani nilai null dalam filter
GQL menggunakan logika tiga nilai: predikat mengevaluasi ke TRUE, , FALSEatau UNKNOWN. Saat nilai properti null, perbandingan mengembalikan UNKNOWN.
FILTER memperlakukan UNKNOWN sebagai tidak cocok, maka baris tersebut dikecualikan.
Gunakan IS NULL dan IS NOT NULL untuk menguji nilai null secara eksplisit:
-- Only include people whose browser is known
MATCH (p:Person)
FILTER p.browserUsed IS NOT NULL
RETURN p.firstName, p.browserUsed
Gunakan coalesce() untuk mengganti nilai default saat properti mungkin null:
MATCH (p:Person)
RETURN p.firstName, coalesce(p.browserUsed, 'Unknown browser') AS browser
Perhatian
NULL = NULL bernilai UNKNOWN, bukan TRUE. Selalu gunakan IS NULL untuk menguji nilai null, bukan kesetaraan.
Hasil agregat dengan RETURN
Gunakan fungsi agregat di RETURN untuk meringkas hasil Anda. Graph mendukung fungsi agregat berikut: COUNT, , SUM, MINAVG, MAX, COLLECT_LISTCOLLECT_ONEdan COLLECT_ELEMENTS.
Misalnya, untuk menghitung semua orang dalam grafik:
MATCH (p:Person)
RETURN count(*) AS totalPeople
Untuk menghitung nilai yang berbeda seperti berapa banyak perusahaan yang berbeda mempekerjakan orang:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT c) AS companyCount
Masukan filter untuk satu agregasi
Tambahkan FILTER (WHERE predicate) setelah agregat untuk memfilter hanya input agregat tersebut. Agregat lain dalam RETURN yang sama tetap menerima semua baris input.
MATCH (p:Person)
RETURN count(*) AS allPeople,
count(*) FILTER (WHERE p.birthday < 19900101) AS peopleBornBefore1990
Tambahkan LIMIT di dalam filter agregat untuk menggunakan paling banyak sebanyak itu baris yang memenuhi syarat. Kueri menerapkan predikat sebelum batas khusus agregat.
MATCH (p:Person)
RETURN count(*) FILTER (WHERE p.birthday < 19900101 LIMIT 100) AS sampleCount
FILTER dan LIMIT yang khusus untuk agregat tidak menghapus baris dari bagian kueri lainnya. Gunakan pernyataan FILTER atau klausa WHERE pada tingkat kecocokan saat Anda ingin memfilter aliran baris.
Kumpulkan nilai
Gunakan COLLECT_LIST untuk mengembalikan satu elemen daftar untuk setiap nilai input, termasuk nilai nol. Tambahkan DISTINCT untuk menghapus duplikat.
MATCH (p:Person)
RETURN collect_list(DISTINCT p.browserUsed) AS browsers
COLLECT_ONE Mengembalikan satu nilai input non-null. Nilai yang dipilih tidak deterministik, jadi gunakan hanya ketika nilai dari grup dapat diterima.
COLLECT_ELEMENTS menerima input bernilai daftar dan menggabungkan elemennya menjadi satu daftar:
MATCH (p:Person)
RETURN collect_elements([p.firstName, p.lastName]) AS names
Tanpa mengelompokkan kolom, kueri agregat tanpa baris input akan mengembalikan daftar kosong dari COLLECT_LIST dan COLLECT_ELEMENTS dan null dari COLLECT_ONE.
Mengelompokkan hasil dengan GROUP BY
GROUP BY Gunakan RETURN untuk mengelompokkan baris menurut nilai bersama dan menghitung agregat dalam setiap grup. Pengelompokan ini setara dengan GQL SQL GROUP BY.
Misalnya, untuk menghitung karyawan per perusahaan:
MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
ORDER BY employeeCount DESC
Kelompokkan menurut beberapa kolom dan komputasi beberapa agregat sekaligus. Misalnya, uraikan jumlah orang dan rentang ulang tahun berdasarkan jenis kelamin dan browser, mengembalikan 10 kombinasi yang paling umum:
MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
browser,
count(*) AS personCount,
min(p.birthday) AS earliestBirthday,
max(p.birthday) AS latestBirthday
GROUP BY gender, browser
ORDER BY personCount DESC
LIMIT 10
Note
Semua ekspresi non-agregat di RETURN harus muncul di GROUP BY. Ekspresi yang tidak ada GROUP BY harus menggunakan fungsi agregat.
Mengurutkan dan membatasi hasil agregat
Gunakan ORDER BY dan LIMIT bersama-sama dengan GROUP BY untuk menemukan hasil N teratas.
Misalnya, untuk menemukan lima kota teratas menurut jumlah penduduk:
MATCH (p:Person)-[:isLocatedIn]->(city:City)
LET cityId = city.id, cityName = city.name
RETURN cityId, cityName, count(*) AS residentCount
GROUP BY cityId, cityName
ORDER BY residentCount DESC
LIMIT 5
Penting
Tempatkan ORDER BY sebelum LIMIT.
LIMIT selalu berlaku untuk kumpulan hasil yang sudah diurutkan.
Arahkan baris dengan pernyataan bersyarat
Gunakan pernyataan kondisional untuk mengarahkan setiap baris masuk ke cabang pertama yang cocok. Input dapat berasal dari tahap kueri sebelumnya, bukan hanya agregasi. Sebagai contoh, kueri berikut mengkategorikan perusahaan setelah menghitung jumlah karyawan mereka:
MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
NEXT
WHEN employeeCount >= 100u THEN
RETURN companyId, companyName, employeeCount, 'Large' AS category
WHEN employeeCount >= 10u THEN
RETURN companyId, companyName, employeeCount, 'Medium' AS category
ELSE
RETURN companyId, companyName, employeeCount, 'Small' AS category
Branch dapat menjalankan pernyataan kueri lengkap dan prosedur bersarang, bukan hanya mengembalikan ekspresi. Contoh berikut mengirim tiga baris input melalui bentuk cabang yang berbeda. Satu cabang menjalankan sebuah MATCH, satu cabang menggabungkan dua agregat dengan UNION ALL lalu mengagregasikan hasilnya, dan cabang fallback mengembalikan sebuah konstanta:
FOR selector IN [1, 2, 3]
RETURN selector
NEXT
WHEN selector = 1 THEN
MATCH (:Person)-[:knows]->(:Person)
RETURN count(*) AS total, 'Knows edges' AS category
WHEN selector = 2 THEN {
MATCH (:Person)-[:workAt]->(:Company)
RETURN count(*) AS partialCount
UNION ALL
MATCH (:Person)-[:studyAt]->(:University)
RETURN count(*) AS partialCount
NEXT
RETURN sum(partialCount) AS total, 'Affiliation edges' AS category
}
ELSE
RETURN 0u AS total, 'No selected metric' AS category
Mesin kueri mengevaluasi predikat secara berurutan untuk setiap baris. Hanya menjalankan cabang pertama yang cocok. Jika sebuah predikat bernilai UNKNOWN, evaluasi dilanjutkan ke cabang berikutnya. Tanpa kondisi ELSE, baris yang tidak cocok dengan cabang WHEN akan dihilangkan.
Pernyataan kondisional berbeda dengan CASE ekspresi. Graph mendukung ekspresi sederhana CASE <expression> WHEN <value> untuk pemilihan nilai berbasis kesetaraan. Ekspresi yang dicari CASE WHEN <predicate> tidak didukung. Untuk informasi lebih lanjut, lihat Pernyataan kondisional.
Konten terkait
- Ekspresi, predikat, dan fungsi GQL
- Menulis kueri pola grafik
- Menulis kueri GQL umum
- Mengoptimalkan performa kueri GQL