特定のノードが何らかの方法で接続されているサブグラフ全体を見つけるためのGremlinクエリ
私はGremlinを初めて使用gremlin-python
し、グラフをトラバースするために使用しています。グラフは、グラフ内の他のクラスターと相互接続されておらず、内部接続されている多くのクラスターまたはサブグラフで構成されています。
この簡単な例は、5つのノードと3つのエッジを持つグラフです。
Customer_1
エッジで接続されCreditCard_A
てい1_HasCreditCard_A
ますCustomer_2
エッジで接続されCreditCard_B
てい2_HasCreditCard_B
ますCustomer_3
エッジで接続されCreditCard_A
てい3_HasCreditCard_A
ます
クエリされたノードに接続されている(入力または出力されている)すべてのノードとエッジのサブグラフオブジェクトを返すクエリが必要です。次に、このサブグラフを変数として保存し、さまざまなトラバーサルを実行してさまざまなものを計算できます。
これらのクラスターは、互いに多くの(内向きまたは外向きの)ホップで構成されている可能性があるため、このクエリは再帰的である必要があります。また、ノードとエッジにはさまざまな種類があり、それらをすべて返す必要があります。
例えば:
- 私が指定した場合
Customer_1
、クエリでは、結果としてサブグラフが含まれているだろうCustomer_1
、Customer_3
、CreditCardA
、1_HasCreditCard_A
、と3_HasCreditCard_A
。 - 私はspecififed場合は
Customer_2
、返されたサブグラフは、で構成されますCustomer_2
、CreditCard_B
、2_HasCreditCard_B
。 - 私が照会した場合
Customer_3
、から返されるとまったく同じ部分グラフオブジェクトCustomer_1
クエリが返されます。
私はNeo4JとCypherとDgraphとGraphQLの両方を使用し、この2つの言語でこのタスクが非常に簡単であることがわかりましたが、グレムリンを理解するのに少し苦労しています。
編集:
この質問、選択した答えは、私はしたいが、変更することによって、エッジ型を指定せずに達成しなければならない.both('created')
だけに.both()
。
ただし、ループ構文:.loop{true}{true}
はもちろんPythonでは無効です。このループ関数はで利用できますgremlin-python
か?何も見つかりません。
編集2:
私はこれを試しましたが、期待どおりに機能しているようです。
g.V(node_id).repeat(bothE().otherV().simplePath()).emit()
これは私が探しているものに対する有効な解決策ですか?クエリされたノードをこの結果に含めることもできますか?
回答
2番目の編集に関しては、これは開始頂点に接続されているすべての頂点を返す有効なソリューションのように見えます。いくつかの小さな修正:
- あなたは変更することができます
bothE().otherV()
にboth()
- 開始頂点も取得する場合は、
emit
前のステップを移動する必要があります。repeat
dedup
重複するすべての頂点を削除するステップを追加します(頂点へのパスが複数ある場合があります)
g.V(node_id).emit().repeat(both().simplePath()).dedup()
例: https://gremlify.com/jngpuy3dwg9