【发布时间】:2019-05-14 23:02:40
【问题描述】:
我试图找到一个有效的 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());
两者似乎都有效,但是否有更好的解决方案不需要底层图实现来获取或计算所有边?
(我们目前在 Postgresql 中使用 tinkerpop/gremlin 的 sqlg 实现,两个查询似乎都从 Postgresql 获取所有传出边。这可能是缺少一些优化的情况。但我的问题不是 sqlg 特定的。)
【问题讨论】: