【问题标题】:Tinkerpop/Gremlin: select vertices together with outgoing edge countTinkerpop/Gremlin:选择顶点和传出边数
【发布时间】: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 特定的。)

【问题讨论】:

    标签: java gremlin tinkerpop


    【解决方案1】:

    如果您只需要知道边是否存在,那么您应该 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 2021-12-07
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多