如何先执行分页(Skip/Limit)再运行子查询?
优化Cypher分页后关联查询的性能
你当前的写法会让子查询对所有Something节点执行,包括被SKIP掉的1000个,完全浪费资源。正确的做法是先对主节点做分页筛选,再执行关联子查询,这样子查询只会作用在最终需要的50个节点上。
正确查询语句
MATCH (s:Something) SKIP 1000 LIMIT 50 CALL { WITH s MATCH (s)-[:SOMETHING]->(o:Other) RETURN o } RETURN s, o
逻辑说明
- 先通过
MATCH (s:Something) SKIP 1000 LIMIT 50筛选出目标50个节点,这一步只处理主节点,不会触发关联查询。 - 再对筛选后的每个
s执行子查询,关联对应的Other节点,此时子查询仅执行50次,大幅减少不必要的计算。
可选优化:聚合关联结果
如果你希望每个s对应的o节点以集合形式返回,避免重复的s行,可以修改为:
MATCH (s:Something) SKIP 1000 LIMIT 50 CALL { WITH s MATCH (s)-[:SOMETHING]->(o:Other) RETURN COLLECT(o) AS others } RETURN s, others
内容的提问来源于stack exchange,提问作者Jiew Meng
相关产品推荐
相关产品推荐

