Tinkerpop / Gremlin:选择顶点以及传出边数

时间:2018-12-13 17:03:29

标签: java gremlin tinkerpop

我尝试找到一个有效的gremlin查询,该查询返回带有顶点和传出边数的遍历。如果不存在传出边缘,则使用布尔值代替传出边缘的数量甚至更好。

背景:我试图提高程序的性能,该程序在顶点上写入一些属性,然后在传出的边缘上进行迭代以删除其中的一些属性。在很多情况下,没有传出的边缘,并且迭代 for (Iterator<Edge> iE = v.edges(Direction.OUT); iE.hasNext();) { ... }占用了运行时间的很大一部分。因此,与其将id解析为顶点(而不是使用gts.V(ids),而是想收集有关出局边的存在的信息)(如果可能),可以跳过迭代。

我的第一次尝试是:

gts.V(ids).as("v").choose(__.outE(), __.constant(true), __.constant(false)).as("e").select("v", "e");

第二个想法是:

gts.V(ids).project("v", "e").by().by(__.outE().count());

两者似乎都可行,但是有没有更好的解决方案,不需要底层图形实现来获取或计算所有边?

(我们目前将Tinkerpop / gremlin的sqlg实现与Postgresql一起使用,并且这两个查询似乎都从Postgresql获取所有传出的边。这可能是缺少一些优化的情况。但是我的问题不是特定于sqlg的。)

1 个答案:

答案 0 :(得分:4)

如果只需要知道边缘是否存在,则应该limit()生成by()调制器:

gremlin> g.V().project('v','e').by().by(outE().limit(1).count())
==>[v:v[1],e:1]
==>[v:v[2],e:0]
==>[v:v[3],e:0]
==>[v:v[4],e:1]
==>[v:v[5],e:0]
==>[v:v[6],e:1]

通过这种方式,您无需计算所有边缘,仅计算第一个就足以回答您的问题。如果愿意,可以进行truefalse的修改:

gremlin> g.V().project('v','e').by().by(coalesce(outE().limit(1).constant(true),constant(false)))
==>[v:v[1],e:true]
==>[v:v[2],e:false]
==>[v:v[3],e:false]
==>[v:v[4],e:true]
==>[v:v[5],e:false]
==>[v:v[6],e:true]