首页 > 解决方案 > Neo4j/Cypher - LIMIT 使查询运行得更快,尽管返回的结果更少

问题描述

我创建了一个图表,其中包含有关电影以及作为工作人员或演员在这些电影中工作过的人的信息。下面的查询应该找到至少有一对电影的导演,他们的发行日期之间有 X 年。

MATCH (p:Person)-[r1:CREW]->(m1:Movie), (p:Person)-[r2:CREW]->(m2:Movie)
WHERE r1.job = 'Director' AND r2.job = 'Director' AND m1.movie_id < m2.movie_id
AND ABS(duration.between(m1.release_date, m2.release_date).years) >= 50
RETURN DISTINCT p.id, p.name
LIMIT 1000000

最后的这个 LIMIT 使查询实际运行并且非常快。没有这个限制,执行需要很长时间,然后引发堆异常。请注意,如标题所述,返回的结果约为 40-50。对我来说,使用 LIMIT 运行得更快是没有意义的,因为它实际上并没有限制任何东西……或者是吗?任何帮助表示赞赏。

编辑:
我正在使用 neo4j 4.0.4 社区版
我的图表包含大约 400000 个节点和 120 万个关系。

根据评论中的要求:这是一个带有 LIMIT 的配置文件执行 在此处输入图像描述

这是一个没有限制的解释计划: 在此处输入图像描述

标签: neo4jcypherlimit

解决方案


:Movie是的,这是一个计划问题,我认为当您在第二个节点上留下标签时,它也应该消失。

它不应该进行两次外部扫描,然后在中间进行连接。不幸的是,没有计划者提示告诉它不要这样做。

在您的情况下,从左到右的扩展更有意义,因为它会随着它的进行而缩小。

顺便提一句。您还可以将作业提升到 rel 类型,:DIRECTED而不是 job=director,这也使其效率更高。


推荐阅读