首页 > 解决方案 > 合并查询优化 Neo4j

问题描述

我想在 2 个节点之间创建一个关系,其中只有几个唯一对,所有其他节点可能会重复。可能由于只有几个唯一节点,导入工具无法创建关系,但是,当我在 shell 中运行关系创建查询时,它需要的时间太长。如何通过某种唯一性过滤来优化此查询?

MATCH (a:Applications), (sms:Sms {id: a.application_id})
MERGE (a)-[r:APP_SMS]->(sms)
RETURN distinct a.application_id, sms.id

我只发现在查询的返回部分使用 distinct 的可能性。

我已经使用 profile 和 limit 25 执行了相同的查询,以查看查询计划和结果:

10382692 total db hits in 3219 ms

查询计划

标签: neo4jcypher

解决方案


stdob--建议的那样,您需要在 :Sms(id) 上创建一个索引,因此这将成为sms节点的廉价 NodeByIndexSeek 而不是 NodeByLabelScan。

在 DISTINCT 操作之后您只有 25 行有点令人担忧,因为id字段往往暗示标签中节点的唯一性,但这里似乎并非如此。对于具有相同id属性的节点,这些重复的节点是具有相同的属性,还是除了其他属性id不同之外?如果您在数据库中有重复的节点,这表明存在建模问题。

编辑

根据评论,您在查询中添加了 LIMIT 25,因此 DISTINCT 25 结果是有意义的。

这里不应该存在重复问题,除非id在 :Sms 节点之间不是唯一的。

不确定是否有很多可以优化的地方。您可以尝试使用apoc.periodic.iterate()对关系的 MERGE 进行批处理,但您应该在没有并行化的情况下这样做以避免锁定问题。


推荐阅读