Tinkerpop/Gremlin: select 个顶点和出边数
Tinkerpop/Gremlin: select vertices together with outgoing edge count
我试图找到一个高效的 gremlin 查询,returns 遍历顶点和出边的数量。或者甚至更好,而不是传出边的数量,如果传出边存在或不存在,则为布尔值。
背景:我试图提高一个程序的性能,该程序在顶点上写入一些属性,然后迭代出边以删除其中的一些属性。在很多情况下,没有出边和迭代
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 .)
如果您只需要知道边缘是否存在,那么您应该 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]
通过这种方式,您无需计算所有边,只需计算第一个就足以回答您的问题。如果您愿意,可以做 true
和 false
稍作修改:
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]
我试图找到一个高效的 gremlin 查询,returns 遍历顶点和出边的数量。或者甚至更好,而不是传出边的数量,如果传出边存在或不存在,则为布尔值。
背景:我试图提高一个程序的性能,该程序在顶点上写入一些属性,然后迭代出边以删除其中的一些属性。在很多情况下,没有出边和迭代
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 .)
如果您只需要知道边缘是否存在,那么您应该 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]
通过这种方式,您无需计算所有边,只需计算第一个就足以回答您的问题。如果您愿意,可以做 true
和 false
稍作修改:
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]