[英]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]]
所以上面基本上说,
现在您可以看到结果中不再包含e [10]。 在这里,您可以轻松构建可视化的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.