【问题标题】:Neo4j/Cypher - LIMIT makes query run faster although less results are returnedNeo4j/Cypher - LIMIT 使查询运行得更快,尽管返回的结果更少
【发布时间】:2020-05-21 01:42:36
【问题描述】:

我创建了一个图表,其中包含有关电影以及作为剧组或演员在这些电影中工作过的人的信息。下面的查询应该找到至少有两部电影的导演,这些电影的发行日期相隔 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 万个关系。

根据 cmets 的要求: 这是使用 LIMIT 的配置文件执行

这是一个没有限制的解释计划:

【问题讨论】:

  • 你的图表有多大?您还可以与 LIMIT 共享一个 PROFILE 执行和一个没有限制的 EXPLAIN 计划吗?
  • 也请分享一下你使用的neo4j版本和版本
  • @MichaelHunger 你好。我已经按照您的要求编辑了我的问题。
  • 团队还要求提供这些统计数据curl -H accept:application/json -H content-type:application/json -d '{"statements":[{"statement":"CALL db.stats.retrieve(\"GRAPH COUNTS\")"}]}' http://_________:7474/db/data/transaction/commit &gt; graphCounts.json

标签: neo4j cypher limit


【解决方案1】:

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

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

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

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

【讨论】:

  • 你好。感谢你的回答。我无法创建 rel 类型的 DIRECTED,因为电影剧组中的某个人可能有许多不同的工作,而不仅仅是几个。除非有办法在批量导入数据时动态创建关系类型。
猜你喜欢
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2017-02-09
相关资源
最近更新 更多