加载 CSV

许多现有的应用程序和数据集成使用 CSV 作为最小公分母格式。CSV 文件包含带有分隔符(最常见的是逗号,但也包括制表符 (TSV) 和冒号 (DSV))分隔列和换行符分隔行的文本。字段可能用引号括起来,以处理杂散引号、换行符以及在字段中使用分隔符。

在 Cypher 中,它受 `LOAD CSV` 支持,并且可以使用 `neo4j-import`(`neo4j-admin import`)工具进行批量导入。现有的 `LOAD CSV` 适用于大多数用途,但缺少一些功能,`apoc.load.csv` 和 `apoc.load.xls` 添加了这些功能。

  • 提供行号

  • 提供每行的映射和列表表示形式

  • 自动数据转换(包括拆分为数组)

  • 可以选择保留原始字符串格式的值

  • 忽略字段(使将整行分配为属性更容易)

  • 无标题文件

  • 用 null 替换某些值

APOC 过程还支持读取压缩文件。

数据转换对于直接设置属性很有用,但对于 Cypher 中的计算来说,它是有问题的,因为 Cypher 不知道映射值的类型,因此它们默认为 `Any`。

要正确使用它们,您必须通过对值使用内置(例如 `toInteger`)转换函数来指示 Cypher 其类型。

要从文件读取,您需要启用配置选项。

apoc.import.file.enabled=true

默认情况下,文件路径是全局的,对于相对于import目录的路径,请设置。

apoc.import.file.use_neo4j_config=true

apoc.load.csv示例

test.csv
name,age,beverage
Selma,9,Soda
Rana,12,Tea;Milk
Selina,19,Cola
CALL apoc.load.csv('test.csv')
YIELD lineNo, map, list
RETURN *;
表1. 结果
行号 列表 映射

0

["Selma", "9", "Soda"]

{name: "Selma", age: "9", beverage: "Soda"}

1

["Rana", "12", "Tea;Milk"]

{name: "Rana", age: "12", beverage: "Tea;Milk"}

2

["Selina", "19", "Cola"]

{name: "Selina", age: "19", beverage: "Cola"}

配置选项

除了文件,您还可以传入一个配置映射。

名称 默认值 描述

跳过

跳过结果行

限制

限制结果行

标题

true

指示文件是否具有标题

分隔符

','

分隔符字符串或“TAB”

引用字符

'"'

用于带引号元素的字符

数组分隔符

';'

数组分隔符

忽略

[]

要忽略的列

空值

[]

将哪些值视为null,例如['na',false]

映射

{}

每个字段的映射,条目键是字段名,例如{years:{…​.} 请参见下文

出错时失败

布尔值

true

表2. mapping条目中每个字段的映射配置
名称 默认值 描述

类型

'int', 'string'等。

数组

false

指示字段是否为数组

数组分隔符

';'

数组的分隔符

名称

重命名字段

忽略

false

忽略/删除此字段

空值

[]

将哪些值视为null,例如['na',false]

CALL apoc.load.csv('test.csv', {skip:1, limit:1, header:true, ignore:['name'],
   mapping:{
     age: {type:'int'},
     beverage: {array:true, arraySep:';', name:'drinks'}
   }
})
YIELD lineNo, map, list
RETURN *;
表3. 结果
行号 列表 映射

1

[12,["Tea","Milk"]]

{"age":12,"drinks":["Tea","Milk"]}

给定以下csv

testMultiCharSep.csv
nameSEPARage
SelmaSEPAR8
RanaSEPAR11
SelinaSEPAR18

我们可以执行

CALL apoc.load.csv('testMultiCharSep.csv', {sep:'SEPAR'})
YIELD lineNo, map, list
RETURN *;
表4. 结果
行号 列表 映射

0

["Selma", "9"]

{name: "Selma", age: "9"}

1

["Rana", "12"]

{name: "Rana", age: "12"}

2

["Selina", "19"]

{name: "Selina", age: "19"}

事务批处理

为了处理大型文件,可以将CALL …​ IN TRANSACTIONSLOAD CSV一起使用,但您需要注意急切操作,这些操作可能会破坏该行为。

在apoc中,您可以将任何数据源与apoc.periodic.iterate结合使用以实现相同的功能。

CALL apoc.periodic.iterate('
CALL apoc.load.csv({url}) yield map as row return row
','
CREATE (p:Person) SET p = row
', {batchSize:10000, iterateList:true, parallel:true});
请注意,并行操作仅适用于非冲突更新,否则可能会导致死锁。

要使这些数据结构可用于Cypher,您可以使用apoc.load.xml。它接受文件或http URL并将XML解析为映射数据结构。

请参阅以下过程的使用示例。

错误处理

您可以使用failOnError配置来处理URL或csv错误的情况下的结果。例如,借助apoc.when过程,您可以返回nothingToListnothingToMap作为列表和映射结果,以及错误的URL。

CALL apoc.load.csv("MY_CSV_URL", {failOnError:false})
YIELD list, map
WITH list, map
call apoc.do.when(list = [], "return 'nothingToList' as list, 'nothingToMap' as map", "return list, map", {list: list, map: map})
YIELD value
RETURN value["list"], value["map"]