Bagikan melalui


Pola grafik GQL

Nota

Fitur ini saat ini dalam pratinjau publik. Pratinjau ini disediakan tanpa perjanjian tingkat layanan, dan tidak disarankan untuk beban kerja produksi. Fitur tertentu mungkin tidak didukung atau mungkin memiliki kemampuan terbatas. Untuk informasi lebih lanjut, lihat Supplemental Terms of Use for Microsoft Azure Previews.

Pola grafik adalah blok penyusun inti kueri GQL Anda. Mereka menjelaskan struktur yang Anda cari dalam grafik menggunakan simpul dan tepi dengan cara visual yang intuitif. Anggap pola grafik sebagai templat yang coba dicocokkan mesin kueri dengan data aktual dalam grafik Anda.

Penting

Artikel ini secara eksklusif menggunakan himpunan data grafik contoh jejaring sosial.

Pola elemen sederhana

Pola elemen sederhana membantu Anda mencocokkan simpul dan tepi individual dari grafik Anda yang memenuhi persyaratan tertentu. Pola-pola ini membentuk fondasi untuk pencocokan pola yang lebih kompleks.

Pola node sederhana

Pola node menentukan label dan properti yang harus dicocokkan oleh simpul:

(:City { name: "New York" })

Pola ini cocok dengan semua simpul yang memilikiPlace label dan City (ditunjukkan oleh & operator) dan yang propertinya name sama dengan "New York". Spesifikasi label dan properti yang diperlukan ini disebut pengisi pola node.

Konsep utama:

  • Pencocokan label: Gunakan & untuk memerlukan beberapa label.
  • Pemfilteran properti: Tentukan nilai persis yang harus cocok dengan properti.
  • Pencocokan fleksibel ("kovarian"): Simpul yang cocok dapat memiliki lebih banyak label dan properti di luar yang ditentukan.

Nota

Model grafik dengan beberapa label elemen belum didukung (masalah yang diketahui).

Pola tepi sederhana

Pola tepi lebih kompleks daripada pola simpul. Mereka tidak hanya menentukan pengisi tetapi juga menghubungkan pola simpul sumber ke pola simpul tujuan. Pola tepi menjelaskan persyaratan di tepi dan titik akhirnya:

(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)

Arah -[...]-> panah penting—menentukan (:Person) sebagai pola simpul sumber dan (:Comment) sebagai pola simpul tujuan. Memahami arah tepi sangat penting untuk mengkueri grafik Anda dengan benar.

Pola cermin yang setara:

Anda dapat membalik panah dan menukar pola simpul untuk membuat pola tepi yang setara dan dicerminkan:

(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)

Pola ini menemukan hubungan yang sama tetapi dari perspektif yang berlawanan.

Pola tepi yang diarahkan apa pun

Saat arah tepi grafik tidak menjadi masalah untuk kueri Anda, Anda bisa membiarkannya tidak ditentukan dengan membuat pola tepi yang diarahkan apa pun:

(:Song)-[:inspired]-(:Movie)

Pola ini cocok dengan tepi yang sama dengan (:Song)-[:inspired]->(:Movie) dan (:Movie)-[:inspired]->(:Song) digabungkan, terlepas dari simpul mana yang merupakan sumber dan mana tujuannya (contoh ini bukan dari jenis grafik jaringan sosial).

Pintasan pola tepi grafik

GQL menyediakan pintasan yang nyaman untuk pola tepi umum agar kueri Anda lebih ringkas:

  • ()->() singkatan ()-[]->() (tepi terarah dengan label apa pun)
  • ()<-() singkatan ()<-[]-() (tepi diarahkan secara terbalik dengan label apa pun)
  • ()-() singkatan ()-[]-() (tepi yang diarahkan apa pun dengan label apa pun)

Pintasan ini dapat berguna ketika Anda peduli dengan konektivitas tetapi bukan tentang jenis tepi grafik tertentu.

Ekspresi label

Pola dapat mengekspresikan persyaratan kompleks pada label simpul dan tepi yang cocok.

Example:

MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches

Ini menghitung jumlah isLocatedIn tepi yang menghubungkan simpul atau Personsimpul -tapi-tidak-Organization (yang selalu Company merupakan simpul dalam skema jejaring University sosial) ke City atau Country simpul.

Sintaks:

Syntax Meaning
A&B Label perlu menyertakan A dan B.
A|B Label perlu menyertakan setidaknya salah satu dari A atau B.
!A Label perlu mengecualikan A.

Selain itu, gunakan tanda kurung untuk mengontrol urutan evaluasi ekspresi label. Secara default, ! memiliki prioritas tertinggi dan & memiliki prioritas yang lebih tinggi daripada |. Oleh karena itu !A&B|C|!D sama ((!A)&B)|C|(!D)dengan .

Mengikat variabel

Variabel memungkinkan Anda merujuk ke elemen grafik yang cocok di bagian lain kueri Anda. Memahami cara mengikat dan menggunakan variabel sangat penting untuk membangun kueri yang kuat.

Variabel elemen pengikatan

Pola simpul dan tepi dapat mengikat simpul dan tepi yang cocok ke variabel untuk referensi nanti.

(p:Person)-[w:workAt]->(c:Company)

Dalam pola ini, p terikat ke node yang Person cocok, w ke tepi yang workAt cocok, dan c untuk mencocokkan Company simpul.

Penggunaan kembali variabel untuk batasan struktural:

Menggunakan kembali variabel yang sama dalam pola beberapa kali mengekspresikan pembatasan pada struktur kecocokan. Setiap kemunculan variabel yang sama harus selalu mengikat ke elemen grafik yang sama dalam kecocokan yang valid. Penggunaan kembali variabel sangat kuat untuk mengekspresikan persyaratan struktural yang kompleks.

(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Pola menemukan simpul Person dan x yang saling mengenal dan bekerja pada y, yang terikat ke variabel Company.c Penggunaan c kembali memastikan bahwa kedua orang bekerja di perusahaan yang sama.

Predikat pola dengan variabel elemen:

Variabel elemen pengikatan memungkinkan Anda menentukan predikat pola simpul dan tepi. Alih-alih hanya menyediakan pengisi dengan nilai properti yang tepat seperti { name: "New York, USA" }, pengisi dapat menentukan predikat yang dievaluasi untuk setiap elemen kandidat. Pola hanya cocok jika predikat mengevaluasi ke TRUE:

(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)

Pola tepi menemukan orang yang saling mengenal sejak 1 Januari 2000, menggunakan kondisi fleksibel daripada kecocokan yang tepat.

Nota

Variabel pola tepi selalu mengikat ke tepi individual dalam predikat pola tepi, bahkan saat menggunakan pola panjang variabel. Ini dapat membantu dengan tidak harus membatalkan variabel daftar grup tepi untuk melakukan pasca-filter. Lihat Mengikat variabel tepi pola panjang variabel.

Teknik predikat pola tingkat lanjut:

Predikat pola menyediakan kemampuan pemfilteran sebaris yang kuat yang dapat meningkatkan keterbacaan kueri:

-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.age > 30 AND p.department = 'Engineering')
      -[:workAt]->
      (c:Company WHERE c.revenue > 1000000 AND c.location = 'Seattle')

-- Complex edge predicates with calculations
MATCH (p1:Person)-[w:workAt WHERE w.start_date < ZONED_DATETIME('2020-01-01T00:00:00Z') 
                              AND w.salary > 75000]-(c:Company)

-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.active = TRUE AND c.public = TRUE

-- Filter during matching and after
MATCH (p:Person WHERE p.department = 'Sales')-[:workAt]->(c:Company)
WHERE p.quota_achievement > 1.2 AND c.revenue > c.revenue_target

Petunjuk / Saran

Menggunakan predikat pola ketika kondisi sangat selektif dapat mengurangi ukuran hasil perantara.

Mengikat variabel jalur

Anda juga dapat mengikat jalur yang cocok ke variabel jalur untuk pemrosesan lebih lanjut atau mengembalikan struktur jalur lengkap kepada pengguna:

p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Di sini, p terikat ke nilai jalur yang mewakili struktur jalur lengkap yang cocok, termasuk nilai referensi untuk semua simpul dan tepi dalam urutan yang diberikan.

Jalur terikat dapat dikembalikan ke pengguna atau diproses lebih lanjut menggunakan fungsi seperti NODES atau EDGES:

MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges

Menyusun pola

Kueri dunia nyata sering memerlukan pola yang lebih kompleks daripada struktur node-edge-node sederhana. GQL menyediakan beberapa cara untuk menyusun pola untuk traversal grafik canggih.

Menyusun pola jalur

Pola jalur dapat terdiri dengan menggabungkan pola simpul dan tepi sederhana untuk membuat traversal yang lebih panjang.

(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Pola melintasi dari seseorang melalui koneksi sosial dan profesional mereka untuk menemukan di mana perusahaan kolega mereka berada.

Konstruksi pola sepotong: Anda juga dapat membangun pola jalur secara lebih bertahap, yang dapat membuat pola kompleks lebih mudah dibaca dan dipahami:

(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Pendekatan ini memecah traversal yang sama menjadi langkah-langkah logis, sehingga lebih mudah dipahami dan di-debug.

Menyusun pola nonlinear

Bentuk pola yang dihasilkan tidak harus menjadi jalur linier. Anda dapat mencocokkan struktur yang lebih kompleks seperti pola "berbentuk bintang" yang memancar dari simpul pusat:

(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)

Pola ini menemukan seseorang bersama dengan pendidikan, pekerjaan, dan preferensi konten mereka sekaligus—kueri profil yang komprehensif.

Cocokkan jejak

Dalam pola yang kompleks, sering kali tidak diinginkan untuk melintasi tepi yang sama. Penggunaan kembali Edge menjadi penting ketika grafik aktual berisi siklus yang dapat menyebabkan jalur tak terbatas atau terlalu panjang. Untuk menangani penggunaan kembali tepi, grafik di Microsoft Fabric mendukung mode pencocokan TRAIL .

Awalan pola jalur dengan kata kunci TRAIL membuang semua kecocokan yang mengikat tepi yang sama beberapa kali:

TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)

Dengan menggunakan TRAIL, pola hanya menghasilkan kecocokan di mana semua tepi berbeda. Oleh karena itu, bahkan jika c = a sewaktu-waktu jalur membentuk siklus dalam kecocokan tertentu, e3 tidak pernah mengikat ke tepi yang sama dengan e1.

TRAIL Mode ini penting untuk mencegah perulangan tak terbatas dan memastikan bahwa kueri Anda mengembalikan jalur yang bermakna dan tidak berlebihan.

Menggunakan pola panjang variabel

Pola panjang variabel adalah konstruksi kuat yang memungkinkan Anda menemukan jalur dengan panjang yang bervariasi tanpa menulis spesifikasi pola berulang. Ini penting untuk melintas hierarki, jejaring sosial, dan struktur lain di mana panjang jalur optimal tidak diketahui sebelumnya.

Pola panjang variabel terikat

Penting

Pola panjang variabel terikat saat ini hanya mendukung batas atas maksimum 8. Lihat artikel tentang batasan saat ini.

Banyak kueri grafik umum memerlukan pengulangan pola tepi yang sama beberapa kali. Alih-alih menulis pola verbose seperti:

(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)

Anda dapat menggunakan sintaksis panjang variabel yang lebih ringkas:

(:Person)-[:knows]->{3}(:Person)

{3} menentukan bahwa -[:knows]-> pola tepi harus diulang tepat tiga kali.

Rentang pengulangan fleksibel: Untuk fleksibilitas lebih lanjut, Anda dapat menentukan batas bawah dan batas atas untuk pengulangan:

(:Person)-[:knows]->{1, 3}(:Person)

Pola ini menemukan teman langsung, teman-teman, dan teman dari teman-teman semua dalam satu kueri.

Nota

Batas bawah juga bisa .0 Dalam hal ini, tidak ada tepi yang cocok dan seluruh pola hanya cocok jika dan hanya jika dua pola node titik akhir cocok dengan simpul yang sama.

Contoh:

(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)

Pola ini cocok dengan pasangan orang berbeda yang saling mengenal tetapi juga cocok dengan orang yang sama dengan keduanya p1 dan p2 - bahkan jika orang itu tidak "mengenal" diri mereka sendiri.

Ketika tidak ada batas bawah yang ditentukan, umumnya default ke 0 (nol).

Komposisi panjang variabel yang kompleks: Pola panjang variabel dapat menjadi bagian dari pola yang lebih besar dan lebih kompleks seperti dalam kueri berikut:

MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
      (c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100

Pola ini menemukan pasangan komentar di mana orang yang saling mengenal menyukai komentar yang berbeda, dan komentar tersebut terhubung melalui rantai balasan masing-masing 1-5 tingkat.

Mengikat variabel tepi pola panjang variabel

Saat Anda mengikat pola tepi panjang variabel, nilai dan jenis variabel edge berubah tergantung pada konteks referensi. Memahami perilaku ini sangat penting untuk memproses kecocokan panjang variabel dengan benar:

Dua derajat referensi:

  • Di dalam pola panjang variabel: Variabel tepi grafik mengikat ke setiap tepi individu di sepanjang jalur yang cocok (juga disebut "tingkat referensi singleton")
  • Di luar pola panjang variabel: Variabel tepi grafik mengikat urutan semua tepi di sepanjang jalur yang cocok (juga disebut "tingkat referensi grup")

Contoh yang menunjukkan kedua konteks:

MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100

Evaluasi variabel e edge terjadi dalam dua konteks:

  • MATCH Dalam pernyataan: Kueri menemukan rantai teman-teman-teman-dari-teman di mana setiap persahabatan didirikan sejak tahun 2000. Selama pencocokan pola, predikat e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") pola tepi dievaluasi sekali untuk setiap tepi kandidat. Dalam konteks ini, e terikat ke nilai referensi tepi tunggal.

  • RETURN Dalam pernyataan: Di sini, e terikat ke daftar (grup) nilai referensi tepi dalam urutan nilai tersebut terjadi dalam rantai yang cocok. Hasilnya e[0] adalah nilai referensi tepi pertama di setiap rantai yang cocok.

Variabel tepi pola panjang variabel dalam agregasi horizontal:

Variabel tepi yang terikat oleh pencocokan pola panjang variabel adalah daftar grup di luar pola panjang variabel dan dengan demikian dapat digunakan dalam agregasi horizontal.

MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100

Lihat bagian agregasi horizontal untuk detail lebih lanjut.