我想在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的可能性。
我用配置文件和限制25执行了相同的查询,以查看查询计划和结果:
10382692 total db hits in 3219 ms
答案 0 :(得分:1)
按照stdob--
的建议,您需要在:Sms(id)上创建一个索引,这样对于sms
节点,这将成为便宜的NodeByIndexSeek而不是NodeByLabelScan。
在DISTINCT操作之后您只有25行,这有点令人担忧,因为id
字段倾向于暗示标签中节点的唯一性,但是在这里似乎并非如此。对于具有相同id
属性的节点,这些重复的节点具有相同的属性,还是除id
以外的其他属性不同?如果数据库中有重复的节点,则表明存在建模问题。
编辑
根据评论,您在查询中添加了LIMIT 25,这样DISTINCT 25的结果才有意义。
除非id
在:Sms节点上不是唯一的,否则这里不应出现重复问题。
不确定是否有很多可以优化的地方。您可以尝试使用apoc.periodic.iterate()批处理关系的MERGE,但应在不进行并行化的情况下执行此操作,以避免锁定问题。