首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用coalesce with range?

如何使用coalesce with range?
EN

Stack Overflow用户
提问于 2020-10-23 02:46:28
回答 1查看 96关注 0票数 0

使用感恩死亡图表:

代码语言:javascript
运行
复制
g = TinkerFactory.createGratefulDead().traversal()

我想首先尝试一个range,如果没有结果值,则返回一个不同的range

代码语言:javascript
运行
复制
gremlin> g.V().
......1> coalesce(
......2>   range(900,909),
......3>   range(0,9)
......4> )

我的期望是第一个range不会找到任何东西,因为这个图只有808个顶点,所以它会返回前10个项目。但是,它返回所有808个顶点,似乎忽略了range。我该如何构建它呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-23 03:12:57

您并没有以正确的方式考虑coalesce()。请记住,您正在处理流经Gremlin管道的一系列“事物”。在您的示例中,从g.V()开始,它迭代图中的所有顶点。将在每个顶点上调用coalesce()coalesce()旨在返回生成输出的第一个遍历参数的结果。第一个顶点将失败,第二个顶点将成功,并输出当前顶点,因为它适合0到9的范围。如果使用profile()命令,您可以看到实际效果

代码语言:javascript
运行
复制
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().coalesce(range(10,20),range(0,1))
==>v[1]
==>v[2]
==>v[3]
==>v[4]
==>v[5]
==>v[6]
gremlin> g.V().coalesce(range(10,20),range(0,1)).profile()
==>Traversal Metrics
Step                                                               Count  Traversers       Time (ms)    % Dur
=============================================================================================================
TinkerGraphStep(vertex,[])                                             6           6           0.565    66.10
CoalesceStep([[RangeGlobalStep(10,20)], [RangeG...                     6           6           0.290    33.90
  RangeGlobalStep(10,20)                                                                       0.036
  RangeGlobalStep(0,1)                                                 6           6           0.047
                                            >TOTAL                     -           -           0.855        -

我不确定是否有其他方法可以做到这一点,但在我的脑海中,我认为你必须用fold()实现一个列表,这样你就可以迭代它,看看你是否用完了项,然后如果你再次迭代它:

代码语言:javascript
运行
复制
gremlin> g.V().fold().coalesce(range(local,10,20).unfold(),range(local,0,1).unfold())
==>v[1]
gremlin> g.V().fold().coalesce(range(local,10,20).unfold(),range(local,0,2).unfold())
==>v[1]
==>v[2]
gremlin> g.V().fold().coalesce(range(local,5,6).unfold(),range(local,0,2).unfold())
==>v[6]

使用fold()可能会带来一些成本,因为您需要在内存中实现该列表。另一种选择可能是这样做:

代码语言:javascript
运行
复制
gremlin> g.V().order().by(id).range(10,20).fold().coalesce(unfold(),V().order().by(id).range(0,2))
==>v[1]
==>v[2]
gremlin> g.V().order().by(id).range(5,6).fold().coalesce(unfold(),V().order().by(id).range(0,2))
==>v[6]

如果您可以强制图表(取决于您使用的图表)将优化的顺序,那么您只会在内存中实现一个小得多的列表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64488648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档