我想将Cypher结果切成100行的块,并且能够检索特定的块。
目前,确保行不会混淆的唯一方法是使用ORDER BY,这会使查询效率非常低(3秒对我来说太多了)
MATCH (p:Person) RETURN p.id ORDER BY p.id SKIP {chunk}*100 LIMIT 100
其中{chunk}是用于标识特定块的外部参数。
有什么建议吗?
PS:属性p.id已编入索引。
答案 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
空间中的空白 - 但这需要您扫描差距。)