apoc.import是否使用merge或create添加新数据?

问题描述

CALL apoc.import.csv(
  [{fileName: 'file:/persons.csv',labels: ['Person']}],[{fileName: 'file:/kNows.csv',type: 'KNowS'}],{delimiter: '|',arrayDelimiter: ',',stringIds: false}
)

对于此示例,在内部,“导入”是否使用合并或创建来添加节点,关系和属性?我进行了测试,看来它甚至使用“创建”来添加新行,甚至用于新的ID记录。有办法控制吗?何时使用apoc.load VS apoc.import?看来apoc.load更加灵活,用户可以选择专门出于目的使用cypher命令。对吧?

解决方法

From the source of CsvEntityLoader(这似乎是在做秘密工作),节点是盲目创建的,而不是被合并的。

虽然您可以设置一个ignoreDuplicateNodes配置属性,但它只会忽略传入CSV中重复的ID(即,它不会将传入记录与现有图形重复删除)。您可以通过在任何唯一标识的属性上创建适当的unique constraint来防止自己创建重复的节点,这至少可以防止您意外地两次执行相同的导入操作。

个人而言,我只会使用apoc.import.csv一次性将数据批量加载到新图形中(或从另一个通过{{1}导出为CSV的图形中加载转储数据) })。即便如此,您仍然拥有batch import tool,它将为大型数据集提供更高的性能。

在大多数情况下,我倾向于使用the built-in LOAD CSV命令或apoc.export.csv.*,因为您可以精确控制对来自文件的每个记录的处理方式(例如执行apoc.load.csv而不是MERGE)。

,

如@Pablissimo的回答所示,ignoreDuplicateNodes配置选项(显式设置为true时)实际上并没有在数据库中检查重复项 –它只是检查在文件中。解决此漏洞的请求为brought up before,但尚未解决。因此,如果这与您的用例有关,那么您不应该使用apoc.import.csv

如果您的文件从未指定数据库中已经存在的节点,则适用此答案的其余部分。

如果您的节点CSV文件遵循neo4j-admin import命令的import file header format,并且具有用于指定包含节点唯一ID的列的:ID字段的标头,则apoc.import.csv默认情况下,该过程在遇到重复的节点ID(在同一文件中)时,失败。这是因为该过程的ignoreDuplicateNodes配置值默认为false(您可以指定true跳过重复的ID而不失败)。

但是,由于您的节点导入没有失败,但是正在生成重复的节点,这意味着您的节点CSV文件未适当指定:ID字段。要解决此问题,您需要添加:ID字段,并使用配置选项ignoreDuplicateNodes:true调用该过程。或者,您可以通过某种方式修改这些CSV文件以删除重复的行。