如何在Gremlin中执行分页

如何在Gremlin中执行分页,gremlin,tinkerpop3,Gremlin,Tinkerpop3,在Tinkerpop 3中,如何执行分页?我希望获取查询的前10个元素,然后获取下10个元素,而不必将它们全部加载到内存中。例如,下面的查询返回1000000条记录。我想10个接10个,而不是一次装入所有的1000000 g.V().has("key", value).limit(10) 编辑 通过Gremlin服务器上的HttpChannelizer工作的解决方案将是理想的解决方案。从功能角度来看,Gremlin分页的一个漂亮功能是: gremlin> g.V().hasLabel('

在Tinkerpop 3中,如何执行分页?我希望获取查询的前10个元素,然后获取下10个元素,而不必将它们全部加载到内存中。例如,下面的查询返回1000000条记录。我想10个接10个,而不是一次装入所有的1000000

g.V().has("key", value).limit(10)
编辑
通过Gremlin服务器上的
HttpChannelizer
工作的解决方案将是理想的解决方案。

从功能角度来看,Gremlin分页的一个漂亮功能是:

gremlin> g.V().hasLabel('person').fold().as('persons','count').
               select('persons','count').
                 by(range(local, 0, 2)).
                 by(count(local))
==>[persons:[v[1],v[2]],count:4]
gremlin> g.V().hasLabel('person').fold().as('persons','count').
               select('persons','count').
                 by(range(local, 2, 4)).
                 by(count(local))
==>[persons:[v[4],v[6]],count:4]
通过这种方式,您可以获得结果中的顶点总数。不幸的是,
fold()
强制您计算所有顶点,这些顶点需要全部迭代(即将它们全部放入内存)

在这种情况下,只要您打算在多次单独尝试中执行遍历,就无法避免迭代所有100000个顶点。例如:

gremlin> g.V().hasLabel('person').range(0,2)
==>v[1]
==>v[2]
gremlin> g.V().hasLabel('person').range(2,4)
==>v[4]
==>v[6]
第一条语句与使用
limit(2)
终止遍历相同。在第二次遍历中,只需要第二个顶点,而不是像魔术一样跳过前两个顶点的迭代,因为这是一次新的遍历。我不知道有哪种TinkerPop图形数据库实现能有效地做到这一点——它们都有这种行为

一次执行十个顶点而不将它们全部存储在内存中的唯一方法是使用与中相同的
遍历
实例:

gremlin> t = g.V().hasLabel('person');[]
gremlin> t.next(2)
==>v[1]
==>v[2]
gremlin> t.next(2)
==>v[4]
==>v[6]
使用该模型,您只需迭代顶点一次,而不会在单个时间点将它们全部带到内存中


关于这个主题的其他一些想法可以在这里找到。

为什么不添加
order().by()
并对您的gremlin查询执行
range()
函数。

谢谢Stephen,最后一个解决方案听起来不错。但是,如果您使用的是
HttpChannelizer
,您会怎么做呢?如果您使用的是HTTP,您就不能。您必须切换到websockets,然后免费获得该流,或者如果您想更手动地控制它,可以使用会话。在python中,是否可以通过
.next()
步骤将遍历保存到后续多次迭代中?在java中(正如我对janus graph的理解),可以通过使用session进行查询来实现-create session
Client Client=cluster.connect(“uniqueSessionName”,true)
,通过一个查询(例如
t=g.V().hasLabel('person');
)定义遍历变量,并在其他查询(例如
t.next(2))
中迭代该遍历,但是如何为pythongremlin实现它呢?python中没有
connect()
选项,但您可以构造一个“会话”自己请求消息并通过
客户端.submit()
发送。该消息的格式与
submit()
中构建的消息的标准无会话形式没有太大区别。谢谢,Stephen。但是,当我试图在message=request.RequestMessage(processor='session',op='eval'…'session':'4ad866cd-def9-4a76-86a1-f788785bb482','别名':{'g':self.\u traversal\u source}})中设置
session。。。我得到了错误
异常(“未知处理器”)
-据我所知,系统中没有这样的处理器