使用感恩死亡图表:
g = TinkerFactory.createGratefulDead().traversal()我想首先尝试一个range,如果没有结果值,则返回一个不同的range
gremlin> g.V().
......1> coalesce(
......2> range(900,909),
......3> range(0,9)
......4> )我的期望是第一个range不会找到任何东西,因为这个图只有808个顶点,所以它会返回前10个项目。但是,它返回所有808个顶点,似乎忽略了range。我该如何构建它呢?
发布于 2020-10-23 03:12:57
您并没有以正确的方式考虑coalesce()。请记住,您正在处理流经Gremlin管道的一系列“事物”。在您的示例中,从g.V()开始,它迭代图中的所有顶点。将在每个顶点上调用coalesce()。coalesce()旨在返回生成输出的第一个遍历参数的结果。第一个顶点将失败,第二个顶点将成功,并输出当前顶点,因为它适合0到9的范围。如果使用profile()命令,您可以看到实际效果
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()实现一个列表,这样你就可以迭代它,看看你是否用完了项,然后如果你再次迭代它:
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()可能会带来一些成本,因为您需要在内存中实现该列表。另一种选择可能是这样做:
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]如果您可以强制图表(取决于您使用的图表)将优化的顺序,那么您只会在内存中实现一个小得多的列表。
https://stackoverflow.com/questions/64488648
复制相似问题