Menulis kueri pola grafik di Microsoft Fabric

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

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