Permintaan GREMLIN untuk menemukan seluruh sub-grafik yang node tertentu terhubung dengan cara apapun

Aug 19 2020

Saya baru mengenal GREMLIN dan menggunakan gremlin-pythonuntuk melintasi grafik saya. Grafik terdiri dari banyak cluster atau sub-grafik yang saling terhubung, dan tidak saling terhubung dengan cluster lain dalam grafik.

Contoh sederhananya adalah grafik dengan 5 node dan 3 tepi:

  • Customer_1terhubung CreditCard_Adengan 1_HasCreditCard_Aedge
  • Customer_2terhubung CreditCard_Bdengan 2_HasCreditCard_Bedge
  • Customer_3terhubung CreditCard_Adengan 3_HasCreditCard_Aedge

Saya ingin kueri yang akan mengembalikan objek sub-grafik dari semua node dan edge yang terhubung (masuk atau keluar) ke node yang ditanyakan. Saya kemudian dapat menyimpan sub-grafik ini sebagai variabel dan kemudian menjalankan traversal yang berbeda di atasnya untuk menghitung hal-hal yang berbeda.

Kueri ini harus rekursif karena cluster ini dapat terdiri dari node yang banyak (ke dalam atau ke luar) lompatan satu sama lain. Ada juga berbagai jenis node dan edge, dan semuanya harus dikembalikan.

Sebagai contoh:

  • Jika saya ditentukan Customer_1dalam query, sub-grafik yang dihasilkan akan berisi Customer_1, Customer_3, CreditCardA, 1_HasCreditCard_A, dan 3_HasCreditCard_A.
  • Jika saya specififed Customer_2, sub-grafik kembali akan terdiri dari Customer_2, CreditCard_B, 2_HasCreditCard_B.
  • Jika saya bertanya Customer_3, objek subgraf yang sama persis seperti yang dikembalikan dari Customer_1kueri akan dikembalikan.

Saya telah menggunakan Neo4J dengan Cypher dan Dgraph dengan GraphQL dan menemukan tugas ini cukup mudah dalam dua bahasa ini, tetapi saya berjuang sedikit lebih dalam memahami gremlin.

EDIT:

Dari, pertanyaan ini , jawaban yang dipilih harus mencapai apa yang saya inginkan, tetapi tanpa menentukan jenis tepi dengan mengubahnya .both('created')menjadi adil .both().

Namun, sintaks loop: .loop{true}{true}tentu saja tidak valid di Python. Apakah fungsi loop ini tersedia di gremlin-python? Saya tidak dapat menemukan apapun.

EDIT 2:

Saya telah mencoba ini dan tampaknya berfungsi seperti yang diharapkan, saya pikir.

g.V(node_id).repeat(bothE().otherV().simplePath()).emit()

Apakah ini solusi yang valid untuk apa yang saya cari? Apakah mungkin juga untuk menyertakan node yang dikueri dalam hasil ini?

Jawaban

2 noam621 Aug 20 2020 at 13:51

Mengenai pengeditan kedua, ini tampak seperti solusi valid yang mengembalikan semua simpul yang terhubung ke simpul awal. Beberapa perbaikan kecil:

  • Anda dapat mengubah bothE().otherV()menjadiboth()
  • jika Anda ingin mendapatkan juga simpul awal, Anda perlu memindahkan emitlangkah sebelumrepeat
  • Saya akan menambahkan deduplangkah untuk menghapus semua simpul duplikat (bisa lebih dari 1 jalur ke simpul)
g.V(node_id).emit().repeat(both().simplePath()).dedup()

contoh: https://gremlify.com/jngpuy3dwg9