gremlin - 如何在Gremlin中执行分页

标签 gremlin tinkerpop3

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

g.V().has("key", value).limit(10)


编辑

在Gremlin Server上通过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()迫使您计算所有顶点,这将需要对其进行迭代(即将它们全部存储到内存中)。

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

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图形数据库实现-它们都具有这种行为。

一次制作十个顶点而不将其全部存储在内存中的唯一方法是使用与以下示例相同的Traversal实例:

gremlin> t = g.V().hasLabel('person');[]
gremlin> t.next(2)
==>v[1]
==>v[2]
gremlin> t.next(2)
==>v[4]
==>v[6]


使用该模型,您只需要迭代一次顶点,而不会在单个时间点将它们全部带入内存。

关于此主题的其他想法可以在此blog post中找到。

关于gremlin - 如何在Gremlin中执行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39826983/

相关文章:

gremlin - 如何使用 tinkerpop gremlin 和 neptune 将远程图导出到 json?

titan - Gremlin:找到两个顶点之间的边的有效方法是什么?

java - 我可以从此 GraphTraversal 中获取顶点而不是元素吗?

titan - 如何排除 gremlin titan 中的某些顶点

Gremlin 按最大属性过滤

node.js - 我无法获取已遍历的顶点数据的数据。谁能帮我?

graph - hasNot() 在 Gremlin 中应该如何工作?

java - 如何在java环境中打印Tinkerpop(TinkerGraph)查询的输出?

Windows 错误 "The most significant bit.."的 Gremlin 控制台

java - 我可以通过添加模块来自定义 Jackson ObjectMapper 吗?