我需要对多个性能密集型查询的结果进行分页(limit+offset)。你知道吗
首先,我使用python的生成器模拟分页
first = 100
# Offset
skip = 50
cursor = 0
# Generator is returned by neo4j so we don't have a significant performance impact
q1_results = tx.run(.....)
q2_results = tx.run(.....)
for result in q1_results:
if cursor < first:
yield result
cursor += 1
for result in q2_results:
if cursor < first:
yield result
cursor += 1
但是,这里的问题是强制执行偏移量:为了以编程方式实现它,我必须在第一个结果上再次迭代,并以这种方式执行:
first = 100
# Offset
skip = 50
cursor = 0
skip_cursor = 0
# Generator is returned by neo4j so we don't have a significant performance impact
q1_results = tx.run(.....)
q2_results = tx.run(.....)
for result in q1_results:
if cursor < first & skip_cursor > skip:
yield result
cursor += 1
else:
skip_cursor += 1
for result in q2_results:
if cursor < first & skip_cursor > skip:
yield result
cursor += 1
else:
skip_cursor += 1
然后我尝试将查询合并到一个大查询中,但是它需要使用聚合函数(比如collect
和distinct
),所以它对性能有很大的影响,查询变得非常慢。你知道吗
我想知道我是否遗漏了一些东西,以及在这种情况下是否有一种正确的方法来实现分页。你知道吗
目前,正确的方法是在Cypher查询中使用
SKIP
和LIMIT
。底层协议没有只返回查询结果的一部分的机制,因此即使使用代码,您仍然可以生成、发送和缓冲整个结果集。你知道吗我们的路线图上有一个项目介绍了全流控制,以及一个反应式API。这将启用对增量传递记录的完整堆栈支持,并提供跳过和取消流的选项。但这是一个复杂的变化,所以最早要到今年年底才会到来。在那之前,你最好的选择是使用Cypher关键字。你知道吗
相关问题 更多 >
编程相关推荐