Permintaan GREMLIN untuk menemukan seluruh sub-grafik yang node tertentu terhubung dengan cara apapun
Saya baru mengenal GREMLIN dan menggunakan gremlin-python
untuk 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_1
terhubungCreditCard_A
dengan1_HasCreditCard_A
edgeCustomer_2
terhubungCreditCard_B
dengan2_HasCreditCard_B
edgeCustomer_3
terhubungCreditCard_A
dengan3_HasCreditCard_A
edge
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_1
dalam query, sub-grafik yang dihasilkan akan berisiCustomer_1
,Customer_3
,CreditCardA
,1_HasCreditCard_A
, dan3_HasCreditCard_A
. - Jika saya specififed
Customer_2
, sub-grafik kembali akan terdiri dariCustomer_2
,CreditCard_B
,2_HasCreditCard_B
. - Jika saya bertanya
Customer_3
, objek subgraf yang sama persis seperti yang dikembalikan dariCustomer_1
kueri 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
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
emit
langkah sebelumrepeat
- Saya akan menambahkan
dedup
langkah 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