Gremlin Java:按最大边数计算顶点

时间:2017-03-30 09:18:23

标签: java neo4j gremlin

假设我们有这样的图表。

(User)-[:KNOWS]->(Friend)

我想计算用户的所有传出关系并按用户对它们进行分组,然后添加一些条件进行过滤。 (比如超过10个知道) 这就是我做的,

g.V().hasLabel("Friend").in("KNOWS").hasLabel("User").groupCount().next()

这是返回一张地图,所以我可以添加条件来过滤结果。我的问题是,我们是否有任何有效的替代方法来做到这一点?

1 个答案:

答案 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边缘。

你基本上有两种方法可以加快速度:

  1. 正如Paul Jackson所建议的那样:将边数作为属性添加到顶点,预先计算它,然后将此属性编入索引
  2. 如果您真的想要动态计算边数,请使用Spark-Gremlin之类的内容。