多查询Neo4j/Cypher分页

2024-04-25 12:08:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要对多个性能密集型查询的结果进行分页(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      

然后我尝试将查询合并到一个大查询中,但是它需要使用聚合函数(比如collectdistinct),所以它对性能有很大的影响,查询变得非常慢。你知道吗

我想知道我是否遗漏了一些东西,以及在这种情况下是否有一种正确的方法来实现分页。你知道吗


Tags: runinforifresult性能cursorresults
1条回答
网友
1楼 · 发布于 2024-04-25 12:08:26

目前,正确的方法是在Cypher查询中使用SKIPLIMIT。底层协议没有只返回查询结果的一部分的机制,因此即使使用代码,您仍然可以生成、发送和缓冲整个结果集。你知道吗

我们的路线图上有一个项目介绍了全流控制,以及一个反应式API。这将启用对增量传递记录的完整堆栈支持,并提供跳过和取消流的选项。但这是一个复杂的变化,所以最早要到今年年底才会到来。在那之前,你最好的选择是使用Cypher关键字。你知道吗

相关问题 更多 >

    热门问题