加载 CSV

许多现有的应用程序和数据集成使用 CSV 作为最简通用格式。CSV 文件包含由定界符(通常是逗号,但也可以是制表符 (TSV) 和冒号 (DSV))分隔列,并使用换行符分隔行。字段有时会加引号,以处理字段内出现的杂乱引号、换行符和定界符。

在 Cypher 中,可以通过 LOAD CSV 以及用于批量导入的 neo4j-import (neo4j-admin import) 工具来支持此格式。现有的 LOAD CSV 对于大多数用途来说都没问题,但缺少一些功能,而 apoc.load.csvapoc.load.xls 补充了这些功能。

  • 提供行号

  • 提供每行的 Map 和列表两种表示形式

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

  • 保留原始字符串格式值的选项

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

  • 无标题行的文件

  • 将特定值替换为 null

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

数据转换对于直接设置属性很有用,但对于 Cypher 内部的计算来说存在问题,因为 Cypher 不知道 Map 值的数据类型,所以它们默认为 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. 结果
行号 list Map

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"}

配置选项

除了文件外,您还可以传入一个配置 Map

名称 (name) 默认 description(描述)

skip

none

跳过结果行

limit

none

限制结果行

header(标题行)

true

指示文件是否有标题行

sep(分隔符)

','

分隔符字符串或 'TAB'

quoteChar(引号字符)

'"'

用于引用元素的字符

arraySep(数组分隔符)

';'

数组分隔符

ignore(忽略)

[]

要忽略的列

nullValues(空值)

[]

要视为 null 的值,例如 ['na',false]

mapping(映射)

{}

字段级映射,条目键是字段名,例如 {years:{…​.},见下文

failOnError

boolean

true

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

type

none

'int'、'string' 等

array

false

指示字段是否为数组

arraySep(数组分隔符)

';'

数组分隔符

名称 (name)

none

重命名字段

ignore(忽略)

false

忽略/移除此字段

nullValues(空值)

[]

要视为 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. 结果
行号 list Map

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. 结果
行号 list Map

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 一起使用,但您必须注意可能会破坏该行为的急切 (Eager) 操作。

在 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 解析为 Map 数据结构。

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

错误处理

您可以使用 failOnError 配置来处理 URL 或 CSV 不正确时的结果。例如,借助 apoc.when 过程,您可以在 URL 不正确时将 nothingToListnothingToMap 作为列表和 Map 结果返回。

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"]
© . This site is unofficial and not affiliated with Neo4j, Inc.