切片neo4j Cypher导致块

时间:2016-04-19 21:56:36

标签: sorting neo4j cypher slice

我想将Cypher结果切成100行的块,并且能够检索特定的块。

目前,确保行不会混淆的唯一方法是使用ORDER BY,这会使查询效率非常低(3秒对我来说太多了)

MATCH (p:Person) RETURN p.id ORDER BY p.id SKIP {chunk}*100 LIMIT 100

其中{chunk}是用于标识特定块的外部参数。

有什么建议吗?

PS:属性p.id已编入索引。

2 个答案:

答案 0 :(得分:0)

您可以尝试在提取块之前向Person添加标签,然后使用

之类的查询
Match (p:Chunk:Person) with p LIMIT 100 
Match (p) remove p:Chunk
Return *

答案 1 :(得分:0)

如果p.id值是唯一且密集(例如,值从1开始并递增,没有任何间隙),则此查询将利用{{上的索引1}}有效地获得每百个人的块:

:Person(id)

现在,实际上,你的WITH (({chunk} - 1) * 100 + 1) AS startId MATCH (p:Person) WHERE p.id IN RANGE(startId, startId + 99) RETURN p.id ORDER BY p.id 空间可能不会保持密集,即使它是以这种方式开始的。 id节点将随着时间的推移而被删除。在这种情况下,上面的查询可以返回少于100行。因此,您可以使块大小超过100并进行一些后处理以获得所需的100。在最坏的情况下,您可能需要多次请求才能获得所需的100个请求,但每个请求都会很快。 (理想情况下,您可能希望将不再使用的Person值分配给新的id节点,以填补Person空间中的空白 - 但这需要您扫描差距。)