neo4j - 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 万个关系。
解决方案
:Movie
是的,这是一个计划问题,我认为当您在第二个节点上留下标签时,它也应该消失。
它不应该进行两次外部扫描,然后在中间进行连接。不幸的是,没有计划者提示告诉它不要这样做。
在您的情况下,从左到右的扩展更有意义,因为它会随着它的进行而缩小。
顺便提一句。您还可以将作业提升到 rel 类型,:DIRECTED
而不是 job=director,这也使其效率更高。
推荐阅读
- ios - 拨打 USSD 号码或打开电话应用程序
- vim - 从 Git Bash 调用的 Vim:视觉块前置不会应用于所有行
- three.js - 如何在 ThreeJS 中将纹理放置到挤压几何体的一侧?
- redis - 字符串类型的字符串与哈希?哈希将只有一个键而不是多个
- three.js - Three.js - mtlLoader 材质
- perl - 如何使用 Perl 作为配置文件的语言?
- javascript - 如何根据值在 Javacsript 中自动选择 Ajax 下拉菜单
- python - 将 RGB numpy 矩阵转换为灰度矩阵
- go - 无法更新包(去:错误加载模块要求)
- java - 无法在 Spring Data Redis 中流水线化 EVALSHA 命令