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.
Pencocokan pola grafik memungkinkan Anda menjelaskan struktur data yang ingin Anda temukan menggunakan sintaks visual yang intuitif. Alih-alih menggabungkan tabel, Anda menulis pola yang terlihat seperti hubungan itu sendiri - simpul yang terhubung oleh tepi. Artikel ini memperlihatkan kepada Anda cara menulis kueri pola GQL untuk skenario umum dalam grafik di Microsoft Fabric.
Contohnya menggunakan himpunan data sampel jejaring sosial. Untuk referensi sintaks pola lengkap, lihat Pola grafik GQL.
Gunakan artikel ini untuk mempelajari cara membangun dan menggabungkan pola node, tepi, dan jalur. Untuk tugas siap adaptasi seperti menemukan tetangga atau entitas tanpa hubungan, lihat Tulis kueri GQL umum. Untuk penyaringan, pengelompokan, dan agregasi alur kerja, lihat Filter dan agregasi data grafik.
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.
Mencocokkan hubungan langsung
Pola dasar cocok dengan jenis node, jenis tepi tertentu, dan jenis node lainnya. Sintaks terlihat seperti diagram hubungan.
Misalnya, untuk menemukan maksimal 100 orang yang dipasangkan dengan perusahaan tempat mereka bekerja:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100
Gunakan pola tepi yang tidak diarahkan saat Anda tidak tahu atau tidak peduli tentang arah. Misalnya, untuk menemukan hingga 100 kenalan bersama terlepas dari siapa yang memulai koneksi:
MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100
Note
Grafik saat ini tidak mendukung pembuatan tepi yang tidak diarahkan, tetapi Anda dapat mengkueri tepi ke arah mana pun dengan menggunakan -[:label]- sintaksis.
Memfilter pola dengan WHERE sebaris
Tempatkan WHERE di dalam pola ketika sebuah kondisi menentukan node atau edge mana yang dapat berpartisipasi dalam pertandingan. Gunakan kondisi MATCH ... WHERE pada tingkat pernyataan untuk memfilter hasil kecocokan yang telah selesai, atau FILTER terpisah ketika kondisi tersebut diterapkan pada baris yang dihasilkan oleh pernyataan sebelumnya. Penempatan predikat dapat mengubah hasil jalur terpendek. Untuk informasi lebih lanjut, lihat Tempatkan predikat sebelum atau sesudah pemilihan jalur.
Misalnya, untuk menemukan orang yang lahir sebelum 1990 yang bekerja di perusahaan yang namanya dimulai dengan 'A':
MATCH (p:Person WHERE p.birthday < 19900101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name
Filter pada properti tepi untuk membatasi hubungan mana yang cocok. Misalnya, untuk mengembalikan hanya orang yang mulai bekerja di perusahaan pada tahun 2010 atau yang lebih baru:
MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
RETURN p.firstName, c.name, w.workFrom
Sesuaikan hubungan multi-hop
Gunakan pola panjang variabel untuk melewati beberapa tahapan dalam satu ekspresi. Tentukan jumlah hop minimum dan maksimum dengan {min,max} sintaks.
Misalnya, untuk menemukan hingga 100 orang yang dapat dijangkau dalam dua hingga empat derajat persahabatan dari Alice,
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100
Untuk menemukan hingga 100 koneksi langsung dan koneksi tingkat kedua (satu atau dua lompatan) dari Alice:
MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100
Mengontrol penelusuran dengan mode jalur
Secara default, GQL menggunakan WALK, yang memungkinkan node dan tepi berulang. Gunakan mode jalur lain jika Anda membutuhkan keunikan elemen yang lebih ketat.
| Mode jalur | Behavior | Gunakan saat... |
|---|---|---|
WALK |
Memungkinkan node dan tepi yang berulang (default) | Anda ingin semua jalan yang cocok dalam batas terbatas. |
TRAIL |
Tidak ada tepi berulang | Anda ingin menghindari mengulangi tepi yang sama, tapi node yang sama bisa muncul melalui tepi yang berbeda. |
SIMPLE |
Tidak ada node yang berulang kecuali node awal dan akhir yang sama, dan tidak ada sisi yang berulang | Anda ingin tidak ada simpul yang muncul lebih dari sekali di tengah jalur, tetapi izinkan jalur yang menutup kembali ke awal. Berguna untuk mendeteksi perulangan. |
ACYCLIC |
Tidak ada node atau tepi yang berulang | Anda perlu menjamin bahwa tidak ada simpul yang muncul di mana saja di jalur lebih dari sekali. Gunakan untuk hierarki ketat, silsilah, atau traversal apa pun di mana pengulangan simpul akan menghasilkan hasil yang salah. |
WALK adalah mode yang paling permisif dan ACYCLIC paling ketat.
Untuk SIMPLE dan ACYCLIC, keunikan tepi berasal dari keunikan simpul. Sebuah SIMPLE lintasan dapat berakhir dengan kembali ke simpul pertamanya, tetapi tetap tidak bisa menggunakan kembali sebuah sisi.
Untuk mengilustrasikan perbedaannya, pertimbangkan jalur Alice → Bob → Carol → Bob:
- WALK — memungkinkan jalur ini. Simpul dan tepi dapat diulang dengan bebas.
- TRAIL — memungkinkan jalur ini. Bob muncul dua kali, tetapi setiap tepi yang digunakan adalah hubungan yang berbeda (Alice→Bob dan Carol→Bob adalah tepi yang berbeda), sehingga tidak ada tepi yang diulang.
- SEDERHANA — memblokir jalur ini. Bob muncul lebih dari sekali, dan SIMPLE hanya mengizinkan simpul untuk muncul berulang jika simpul tersebut merupakan awal dan akhir lintasan (siklus tertutup). Di sini Alice adalah awal dan Bob adalah akhir, jadi tidak ada pengecualian yang berlaku.
- ACYCLIC — memblokir jalur ini. Bob muncul lebih dari sekali di mana saja di jalur.
Contoh berikut menunjukkan cara menggunakan TRAIL untuk menghitung berapa banyak jalur berbeda yang mengarah ke masing-masing dari 100 orang pertama yang dapat dijangkau di jaringan Alice dalam empat hop:
MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
LET personId = dst.id
RETURN personId, dst.firstName, dst.lastName, count(*) AS pathCount
GROUP BY personId, dst.firstName, dst.lastName
ORDER BY pathCount DESC
LIMIT 100
Gunakan ACYCLIC untuk mengembalikan hingga 100 orang yang dapat dijangkau dari Alice dalam empat hop, di mana setiap orang di jalur tersebut unik:
MATCH ACYCLIC (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100
Mode pencocokan default REPEATABLE ELEMENTS memungkinkan sisi digunakan kembali oleh jalur-jalur terpisah dalam pola graf yang sama. Penggunaan DIFFERENT EDGES atau DIFFERENT RELATIONSHIPS ketika setiap pengikatan tepi di semua jalur harus berbeda:
MATCH DIFFERENT EDGES
(p:Person)-[:knows]->(friend:Person),
(p)-[:knows]->(other:Person)
RETURN p.firstName, friend.firstName, other.firstName
LIMIT 100
Kembalikan satu jalur terpendek
ALL adalah pencarian jalur default dan mengembalikan setiap jalur yang cocok. Gunakan ANY SHORTEST untuk mengembalikan satu jalur terpendek untuk setiap pasangan sumber-tujuan. Kueri berikut menemukan satu jalur terpendek dari Alice ke Bob:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
RETURN p, path_length(p) AS hopCount
Ketika beberapa jalur terpendek memiliki panjang yang sama, jalur yang dikembalikan tidak ditentukan secara deterministik.
ALL SHORTEST dan ANY pencarian jalur tidak didukung.
Penempatan predikat dapat mengubah hasil dari ANY SHORTEST. Predikat inline pada node dan edge membatasi jalur mana yang memenuhi syarat, sementara postfilter dapat menghapus jalur yang dipilih tanpa memilih jalur lain yang lebih panjang sebagai gantinya. Lihat Tempatkan predikat sebelum atau sesudah pemilihan jalur.
Tip
Gunakan batas atas yang pasti agar biaya kueri dapat diprediksi. Pola tak terbatas ALL WALK tidak didukung. Pola tak terbatas dengan TRAIL, SIMPLE, atau ACYCLIC berakhir melalui keunikan elemen tetapi masih dapat mengembalikan banyak jalur. Unbounded ANY SHORTEST WALK hanya mendukung bentuk kueri tertentu. Lihat Batasan saat ini.
Menggunakan kembali variabel untuk mengekspresikan entitas bersama
Menggunakan kembali variabel yang sama dalam dua bagian pola menciptakan batasan kesetaraan implisit - kedua referensi harus cocok dengan simpul yang sama. Teknik ini memungkinkan Anda mengekspresikan "menemukan entitas yang terhubung melalui entitas ketiga bersama."
Misalnya, untuk menemukan hingga 100 pasang orang yang saling mengenal dan bekerja di perusahaan yang sama:
MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100
Variabel c digunakan kembali untuk kedua workAt target, sehingga kueri hanya mengembalikan pasangan di mana kedua orang saling mengenal dan bekerja di perusahaan yang sama.
Untuk menemukan hingga 100 pasang orang yang sama-sama menyukai postingan yang sama:
MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100
Tip
Kondisi ini WHERE a.id < b.id mencegah pasangan duplikat (Alice + Bob dan Bob + Alice) muncul di hasil.
Menggabungkan beberapa pola
Cantumkan beberapa pola dalam satu MATCH, dipisahkan oleh koma. Gunakan kembali variabel ketika pola harus mengikat elemen grafik yang sama.
Misalnya, untuk menemukan hingga 100 orang beserta keduanya tempat kerja dan kota tempat mereka tinggal:
MATCH (p:Person)-[:workAt]->(c:Company),
(p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100
Variabel p bersama menghubungkan dua pola. Setiap baris hasil mewakili satu orang dengan perusahaan dan kota mereka.
Pola yang tidak terhubung juga valid, tetapi membentuk produk Kartesius dari hasil kecocokannya. Gunakan hanya jika Anda sengaja membutuhkan setiap kombinasi. Untuk panduan kinerja, lihat Gunakan variabel bersama untuk join yang efisien.
Sesuaikan hubungan opsional
Gunakan OPTIONAL MATCH saat hubungan mungkin tidak ada untuk setiap simpul. Baris tanpa kecocokan dipertahankan dengan NULL nilai, mirip dengan SQL LEFT JOIN.
Misalnya, tampilkan hingga 100 orang dengan nama perusahaan mereka, termasuk orang tanpa pekerjaan (yaitu, menampilkan nilai NULL untuk kolom perusahaan).
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100
Gunakan IS NULL setelah OPTIONAL MATCH menemukan hingga 100 orang yang tidak bekerja di perusahaan mana pun:
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100
Konten terkait
- Pola graf GQL
- Memfilter dan mengagregasi data grafik
- Menulis kueri GQL umum
- Batasan saat ini