Gremlin 如何使用范围合并?

Gremlin 如何使用范围合并?,gremlin,tinkerpop,Gremlin,Tinkerpop,使用死亡图: g = TinkerFactory.createGratefulDead().traversal() 我想首先尝试一个范围,如果它不产生值,则返回另一个范围: gremlin> g.V(). ......1> coalesce( ......2> range(900,909), ......3> range(0,9) ......4> ) 我的期望是,第一个范围将找不到任何内容,因为图形只有808个顶点,因此它将返回前10个项目。但是,它返

使用死亡图:

g = TinkerFactory.createGratefulDead().traversal()
我想首先尝试一个
范围
,如果它不产生值,则返回另一个
范围

gremlin> g.V().
......1> coalesce(
......2>   range(900,909),
......3>   range(0,9)
......4> )

我的期望是,第一个
范围
将找不到任何内容,因为图形只有808个顶点,因此它将返回前10个项目。但是,它返回所有808个顶点,似乎忽略了
范围
。我应该如何构造它?

您没有考虑正确的方法。记住,你正在处理一系列通过你的小精灵管道流动的“事物”。在您的示例中,从迭代图中所有顶点的
g.V()
开始<代码>合并()将在每个顶点上调用
coalesce()
用于从生成输出的第一个遍历参数返回结果。第一个将失败,第二个将成功并输出当前顶点,因为它适合0到9的范围。如果您
profile()
,您可以看到这一点:

不确定是否有其他方法可以做到这一点,但在我的脑海中,我认为您必须使用
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]

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

感谢您的详细回复。我想我更了解这一点。这样的折叠会不会带来性能问题,因为它会在整个顶点集上运行,然后才受到范围的限制?是的-它有可能导致性能问题,因为您必须在内存中实现一个结果列表,但是您尝试多次处理流中的项目,因此我不确定您还可以做什么。我在回答中又加了一条建议
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]