0

我相信我所拥有的应该是一个非常简单的,但由于某种原因我没有前进。我有经典的社交网络设置,用户可以在其中成为朋友。我知道想用 D3.js 可视化用户的网络

为此,很明显如何获得朋友

user -[:friend]- friend

现在,我还想显示用户朋友之间的联系,以便它很好地聚集在一个力导向图中。然而,这是我当前的问题,因为我想知道“朋友”集是如何相互连接的。我首先想到

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

会工作,但显然没有。我似乎忽略了一件非常明显的事情,但我不确定是什么。

编辑: Gremlin 也很受欢迎,如果它更具遍历性/显式性,可能会更高效

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) 的那些顶点。从结果来看,确实不应该包含 e[10],因为 gv(1) 和 gv(5) 之间没有边。

我进一步细化了查询以从子图中消除这种关系:

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 中顶点的边,然后像以前一样循环它并选择“e”步骤的值,即边列表。

现在您可以看到 e[10] 不再出现在结果中。从这里您可以很容易地构建可视化输出。

于 2013-03-02T14:29:19.087 回答