おそらくこれは、Gremlin を使用したソリューションへの着想につながるでしょう。問題を標準の TinkerPop トイ グラフに適合させました。私は次のことを理解することに着手しました:
特定の頂点について、それが接続されているすべての頂点を見つけてから、その合計セット内の各頂点が互いにどのように関連しているかを調べます。あなたの説明を考えると、それはあなたが探しているもののように聞こえます。
だから私は始めました:
gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> g.v(1).outE.as('x').inV.loop(2){it.loops<3}{true}.select
==>[x:e[7][1-knows->2]]
==>[x:e[8][1-knows->4]]
==>[x:e[9][1-created->3]]
==>[x:e[10][4-created->5]]
==>[x:e[11][4-created->3]]
ID 1 の頂点の場合、すべてのアウト エッジを取得し、それを再度ループしてフレンド エッジを取得し、最後に「x」ステップの値を選択します。これにより、少なくともそのサブグラフが gv(1) の周りにあることを知ることができますが、質問を読んで、サブグラフを gv(1) に接続されている頂点だけに制限するためにさらに一歩進んでください。結果を見ると、gv(1) と gv(5) の間にエッジがないため、e[10] は実際には含めるべきではありません。
サブグラフからその関係を排除するために、クエリをさらに改良しました。
gremlin> x=[g.v(1)];g.v(1).out.aggregate(x).back(2).outE.filter{x.contains(it.inV.next())}.as('e').inV.loop(3){it.loops<3}{true}.select
==>[e:e[7][1-knows->2]]
==>[e:e[8][1-knows->4]]
==>[e:e[9][1-created->3]]
==>[e:e[11][4-created->3]]
したがって、上記は基本的に次のように述べています。
- サブグラフに保持する必要があるすべての頂点を保持するリスト x を初期化します。
- gv(1).out.aggregate(x) 基本的に、初期化したものに加えて、サブグラフに必要なすべての頂点を「x」に入れます
- トラバーサルの開始点に戻り、x に頂点を含む Edges を見つけてから、前と同じようにループし、エッジ リストである「e」ステップの値を選択します。
e[10] が結果に含まれていないことがわかります。ここから、視覚化のための出力を非常に簡単に作成できます。