java - Tinkerpop/Gremlin:选择顶点和输出边数
问题描述
我试图找到一个有效的 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 特定的。)
解决方案
如果您只需要知道边缘是否存在,那么您应该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]
推荐阅读
- powershell - 使用 PowerShell 和基于文件的数据库操作
- python - 当for循环没有运行整个代码时如何修复它
- python - 如何将 f-string 与变量一起使用,而不是与字符串文字一起使用?
- linux - 从管道读取输入时执行问题
- php - 删除多个文件
- symfony - TYPO3 9.5 - PLESK 17.8 - NGINX
- xamarin.forms - 如何为 Android 创建状态栏图标
- go - 如何将命名模板的结果发送到函数
- javascript - Javascript自下而上创建SVG路径与自上而下
- julia - 为什么 Julia Int64、Float64 和 boolean 支持 getindex