可重复使用的遍历组件并不总是与 gremlin 一起工作

reusable traversal components not always working with gremlin

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

作为设置,我是 运行 gremlin 服务器,使用 docker 容器,配置文件从 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 步骤做同样的事情时,它 returns 一个空列表而不是第二个到第 4 项。有人知道我做错了什么吗?

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 步骤注入代码,为什么不增量地添加到遍历中,然后在完成时迭代它?