【问题标题】:Neo4j Cypher execution time when using DESC vs ASC too slow使用 DESC 与 ASC 时 Neo4j Cypher 的执行时间太慢
【发布时间】:2015-03-11 19:08:24
【问题描述】:

在我当前的 nodejs 应用程序中,我使用 Neo4j 作为数据库并使用它的 REST API。通过运行我的单元测试,我发现我有两个运行速度非常慢的测试,并将其追踪到密码查询是导致性能不佳的罪魁祸首。现在虽然性能仍然很慢,但对于我的本地开发机器上的用例来说,至少第一个案例在大约 300 毫秒内运行在一个可以接受的时间。 但是,第二个查询增加了一整秒,直到我得到结果(在我的例子中只有两行)。唯一的区别是我使用的是 DESC 而不是品牌名称的 ASC 排序。

查询 1

MATCH (Distributor {slug: "some-dist"})-[:SELLS]->(product:Product)-[:IS|:BELONGS_TO*0..5]->(Category {slug: "electrical"}),
(product)-[:HAS_BRAND]->(brand:Brand)
RETURN DISTINCT brand ORDER BY brand.name ASC

查询 2

MATCH (Distributor {slug: "some-dist"})-[:SELLS]->(product:Product)-[:IS|:BELONGS_TO*0..5]->(Category {slug: "electrical"}),
(product)-[:HAS_BRAND]->(brand:Brand)
RETURN DISTINCT brand ORDER BY brand.name DESC

关于图表的一些数据:

  • 4 个分发节点
  • ~600 个品牌节点
  • ~1500 个类别节点
  • ~30000 个产品节点

所有 slug 属性都具有唯一性的约束。 Brand name 的 name 属性也被索引。

为什么,第二个查询慢得多,我该如何解决?

【问题讨论】:

  • 增加混乱...“RETURN DISTINCT brand.name ORDER BY brand.name DESC”比“RETURN DISTINCT brand.name ORDER BY brand.name ASC”快,时间差不多与上述原始问题的区别
  • 您查看PROFILE 输出了吗?哪个应该向您显示查询创建的中间行数和 db-hits?在 2.2 之前的 neo4j-shell 和从 2.2 开始的浏览器中执行此操作。

标签: neo4j cypher


【解决方案1】:

我犯了错误,没有在第一个节点上使用冒号来指定它的标签。我实际上创建了每个节点都应该有一个标签的内部规则。

按标签匹配很快,结果的排序并没有真正的影响,无论是升序还是降序。它仍然没有解释注意到的行为,但让这提醒您在密码查询中使用标签。

MATCH (:Distributor {slug: "some-dist"})-[:SELLS]->(product:Product)-[:IS|:BELONGS_TO*0..5]->(Category {slug: "electrical"}),
(product)-[:HAS_BRAND]->(brand:Brand)
RETURN DISTINCT brand ORDER BY brand.name DESC

对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2018-09-29
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多