0

私は自分が持っているものは非常に単純であるべきだと信じていますが、何らかの理由で前進していません. 私は、ユーザーがお互いに友達になれる古典的なソーシャルネットワークの設定をしています。D3.js を使用してユーザーのネットワークを視覚化したい

そのため、友達を取得する方法は明らかです

user -[:friend]- friend

ここで、ユーザーの友人間のつながりも表示して、力指向グラフで適切にクラスター化するようにします。ただし、「友達」セットがどのように互いに接続されているかを知りたいので、これは私の現在の問題です。最初に思った

with friend
match friend -[connection:friend]- friend

動作しますが、明らかに動作しません。非常に明白なことを見落としているようですが、何がわかりません。

編集: グレムリンも大歓迎です。よりトラバーサル/明示的であれば、よりパフォーマンスが向上する可能性があります

4

1 に答える 1

0

おそらくこれは、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] が結果に含まれていないことがわかります。ここから、視覚化のための出力を非常に簡単に作成できます。

于 2013-03-02T14:29:19.087 に答える