特定のノードが何らかの方法で接続されているサブグラフ全体を見つけるためのGremlinクエリ

Aug 19 2020

私は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_1Customer_3CreditCardA1_HasCreditCard_A、と3_HasCreditCard_A
  • 私はspecififed場合はCustomer_2、返されたサブグラフは、で構成されますCustomer_2CreditCard_B2_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 noam621 Aug 20 2020 at 13:51

2番目の編集に関しては、これは開始頂点に接続されているすべての頂点を返す有効なソリューションのように見えます。いくつかの小さな修正:

  • あなたは変更することができますbothE().otherV()both()
  • 開始頂点も取得する場合は、emit前のステップを移動する必要があります。repeat
  • dedup重複するすべての頂点を削除するステップを追加します(頂点へのパスが複数ある場合があります)
g.V(node_id).emit().repeat(both().simplePath()).dedup()

例: https://gremlify.com/jngpuy3dwg9