在我当前的nodejs应用程序中,我使用Neo4j作为数据库并使用其REST API。通过运行我的单元测试,我发现我有两个非常慢的运行测试并将其跟踪到cypher查询是不良性能本身的罪魁祸首。现在虽然性能仍然很慢,但至少第一种情况在我的本地开发机器上的用例在一个可接受的时间内运行大约300ms。 但是,第二个查询会添加一整秒,直到我得到结果(在我的情况下只有两行)。唯一的区别是我使用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
有关图表的一些数据:
所有slug属性都有一个唯一的约束。品牌名称的name属性也被编入索引。
为什么第二个查询速度慢得多,我该如何解决呢?
答案 0 :(得分:1)
我犯了错误,并没有在第一个节点上使用冒号指定其标签。我实际创建了内部规则,每个节点应该只有一个Label。
按标签匹配很快,结果的排序实际上没有影响,无论是升序还是降序。它仍然没有解释注意到的行为,但是这提醒您在密码查询中使用标签。
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
为我做了诀窍。