Neo4j Merge查询重复创建三个节点中的一个问题求助
听起来你在从SQL Server转Neo4j的过程中踩了个典型的新手坑,我来帮你捋捋可能的原因和解决办法:
检查你的删除语句是否彻底
如果你用的是普通的MATCH (n) DELETE n,那如果节点还有关联关系,Neo4j是不允许删除节点的,会直接报错,这时候就会有节点残留下来。正确的删除所有节点和关系的语句应该是:MATCH (n) DETACH DELETE nDETACH关键字会先删除节点的所有关系,再删除节点,确保整个数据库被清空。你可以先在Neo4j Browser里跑一遍这条语句,确认数据库确实空了,再执行你的创建逻辑试试。创建节点时用
MERGE替代CREATE
这大概率是重复创建的核心原因!SQL里的插入是INSERT,但Neo4j的CREATE是无条件创建新节点,哪怕数据库里已经有相同属性的节点,每次执行都会新建一个。而MERGE的作用是“匹配或创建”——如果数据库里已经存在符合条件的节点,就直接匹配它;不存在才会新建。
比如你原来的创建语句可能是:CREATE (b:Bid {id: $bidId, amount: $amount})改成
MERGE就不会重复创建了:MERGE (b:Bid {id: $bidId}) ON CREATE SET b.amount = $amount这里用
ON CREATE只在节点新建时设置属性,如果是匹配到已存在的节点,就不会修改属性,当然你也可以用ON MATCH来处理匹配到的情况,根据你的业务需求调整。检查调试时的事务处理逻辑
如果你在C#里用Neo4j的驱动,要确保每次调试执行的代码块都正确处理了事务。比如如果某次创建操作抛出异常,有没有正确回滚事务?如果事务没回滚,可能会导致部分节点被创建后残留下来,下次执行又重复创建。可以在调试时加一些日志,看看每次执行删除和创建步骤的结果,确认每一步都成功完成了。
另外,调试的时候可以在执行创建语句前后,用MATCH (n:Bid) RETURN count(n)和MATCH (n:Ask) RETURN count(n)来统计节点数量,这样能更清楚地看到是删除步骤没生效,还是创建步骤重复执行了。
内容的提问来源于stack exchange,提问作者Jeremy Parker

