1

我正在尝试通过将遍历组件放入函数中,使用 gremlin python 为我的遍历创建可重用组件,但我遇到了一些遍历组件无法正常工作的问题。

作为设置,我正在使用 docker 容器运行 gremlin 服务器,并将配置文件从github repo加载到现代图中

docker run -p 8182:8182 tinkerpop/gremlin-server:3.4.6 conf/gremlin-server-modern.yaml

我的测试 python 代码如下所示:

from gremlin_python.process.anonymous_traversal import traversal
from gremlin_python.process.graph_traversal import __
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection

def connect_gremlin(endpoint='ws://localhost:8182/gremlin'):
    return traversal().withRemote(DriverRemoteConnection(endpoint,'g'))

def n():
    return __.values('name')

def r():
    return __.range(2,4)

g = connect_gremlin()

# works as expected
g.V().map(n()).toList()

# returns an empty list
g.V().map(n()).filter(r()).toList()

# but using range step directly works as expected
g.V().map(n()).range(2,4).toList()

我可以成功地将values步骤移动到一个函数中,但是当我尝试对步骤执行相同的操作时,range它返回一个空列表而不是第 2 到第 4 项。有人知道我在做什么错吗?

4

1 回答 1

1

map步骤旨在将每个遍历器的状态映射到新状态。在单个遍历器的上下文中,range从零开始的任何地方都不会达到您的预期。

以下是一些使用 Python 的示例:

>>> g.V().map(__.range(0,1)).limit(5).toList()
[v[1400], v[1401], v[1402], v[1403], v[1404]]

>>> g.V().map(__.range(0,2)).limit(5).toList()
[v[1400], v[1401], v[1402], v[1403], v[1404]]

>>> g.V().map(__.range(1,2)).limit(5).toList()
[]

这就是为什么该values步骤在一个map步骤中起作用而range不起作用的原因。

与其使用一个map步骤注入代码,为什么不只是增量添加到遍历中,然后在完成时对其进行迭代呢?

于 2020-06-05T17:34:55.343 回答