繁体   English   中英

Neo4j Cypher:建立共同的朋友网络

[英]Neo4j Cypher: Get mutual friends network

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

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

user -[:friend]- friend

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

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

可以,但是显然不行。 我似乎忽略了一件非常明显的事情,但我不确定是什么。

编辑:Gremlin也很受欢迎,如果它遍历Y /显式,可能会表现更好

也许这会激发您使用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中包含顶点的outEdges,然后像以前一样将其循环,并选择“ e”步骤的值(即边缘列表)。

现在您可以看到结果中不再包含e [10]。 在这里,您可以轻松构建可视化的输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM