假设我们有这样的图表。
(User)-[:KNOWS]->(Friend)
我想计算用户的所有传出关系并按用户对它们进行分组,然后添加一些条件进行过滤。 (比如超过10个知道) 这就是我做的,
g.V().hasLabel("Friend").in("KNOWS").hasLabel("User").groupCount().next()
这是返回一张地图,所以我可以添加条件来过滤结果。我的问题是,我们是否有任何有效的替代方法来做到这一点?
答案 0 :(得分:3)
我不确定我是否正确理解了您的问题,但听起来您只想根据标签为knows
的传出边数来过滤所有用户。
在这种情况下,您可以直接从User
顶点开始,并根据KNOWS
边的数量对其进行过滤,而不是groupCount
:
g.V().hasLabel('User').where(outE('KNOWS').count().is(gt(10)))
查看此遍历的略微修改版本的结果,以使用GremlinBin中的现代图形:http://gremlinbin.com/bin/view/58dceb63ad0f7
到目前为止,我忽略了任何性能限制。但正如保罗杰克逊在评论中提到的那样,在OLTP模式下执行这样的查询是没有效率的。 Neo4j可能会迭代所有顶点,检查它们是否有标签User
,然后计算它们的KNOWS
边缘。
你基本上有两种方法可以加快速度: