如何从CSV文件导入图数据库中不存在的数据?
问题分析与解决方案
你的查询产生重复条目主要有两个原因:
- 数据库中已存在的
chidori攻击类型是genjutsu,但CSV中对应的类型是ninjutsu,MERGE会因为属性不匹配创建新的Attack节点,导致同名不同类型的攻击节点重复。 - 使用
MATCH查找Person节点时,若节点不存在(比如naruto、sasuke),该行数据会被直接过滤,无法创建对应的人物节点和关联关系。
以下是修正后的查询,确保仅插入数据库中不存在的节点和关系:
LOAD CSV WITH HEADERS FROM 'file:///xyz.csv' AS row // 过滤CSV末尾的空字段(因为CSV每行最后有个逗号) WITH row WHERE row.charecter IS NOT NULL AND row.type IS NOT NULL AND row.name IS NOT NULL // MERGE Person节点,不存在则创建 MERGE (c:Person {name: row.charecter}) // MERGE Attack节点,基于name和type的组合,不存在则创建 MERGE (a:Attack {name: row.name, type: row.type}) // MERGE关联关系,确保该Attack到Person的关系不存在时才创建 MERGE (a)-[:BELONGS_TO]->(c)
额外说明
如果你的业务逻辑中,攻击名称name是唯一标识(即同名攻击的类型必须一致),那么需要先处理数据冲突:要么修改CSV中kakashi对应的type为genjutsu,要么更新数据库中已有的chidori节点类型为ninjutsu。此时可以调整Attack的MERGE条件,只基于name:
LOAD CSV WITH HEADERS FROM 'file:///xyz.csv' AS row WITH row WHERE row.charecter IS NOT NULL AND row.type IS NOT NULL AND row.name IS NOT NULL MERGE (c:Person {name: row.charecter}) MERGE (a:Attack {name: row.name}) // 若Attack节点已存在,更新其type为CSV中的值(可选,根据业务需求) SET a.type = row.type MERGE (a)-[:BELONGS_TO]->(c)
内容的提问来源于stack exchange,提问作者Jaison
相关产品推荐
相关产品推荐

