加载 CSV
许多现有的应用程序和数据集成使用 CSV 作为最小公分母格式。CSV 文件包含带有分隔符(通常是逗号,但也包括制表符 (TSV) 和冒号 (DSV))的文本,用于分隔列,并使用换行符表示行。字段可能被引用以处理散乱的引号、换行符以及在字段内使用分隔符的情况。
在 Cypher 中,它由 LOAD CSV
支持,并通过 neo4j-import
(neo4j-admin import
) 工具支持批量导入。现有的 LOAD CSV
在大多数情况下都能正常工作,但缺少一些功能,这些功能由 apoc.load.csv
和 apoc.load.xls
补充。
-
提供行号
-
提供每行的映射 (map) 和列表 (list) 两种表示形式
-
自动数据转换(包括分割成数组)
-
选择保留原始字符串格式的值
-
忽略字段(使将整行分配为属性更容易)
-
无头部文件
-
将某些值替换为 null
APOC 存储过程还支持读取压缩文件。
数据转换对于直接设置属性很有用,但对于 Cypher 中的计算来说则存在问题,因为 Cypher 不知道映射值的类型,因此它们默认为 Any
。
要正确使用它们,您必须通过对值使用内置的(例如 toInteger
)转换函数来向 Cypher 指示它们的类型。
要从文件读取,您必须启用此配置选项
apoc.import.file.enabled=true
默认情况下,文件路径是全局的;对于相对于 import
目录的路径,请设置
apoc.import.file.use_neo4j_config=true
apoc.load.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 *;
行号 | 列表 | 映射 |
---|---|---|
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"} |
配置选项
除了文件,您还可以传入配置映射
名称 | 默认值 | 描述 |
---|---|---|
|
|
跳过结果行 |
|
|
限制结果行数 |
|
|
指示文件是否包含头部 |
|
|
分隔符字符串或 'TAB' |
|
|
用于引用元素的字符 |
|
|
数组分隔符 |
|
|
要忽略的列 |
|
|
哪些值应被视为 null,例如 |
|
|
按字段映射,条目键为字段名,例如 |
|
|
true |
名称 | 默认值 | 描述 |
---|---|---|
|
|
'int', 'string' 等 |
|
|
指示字段是否为数组 |
|
|
数组分隔符 |
|
|
重命名字段 |
|
|
忽略/删除此字段 |
|
|
哪些值应被视为 null,例如 |
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 *;
行号 | 列表 | 映射 |
---|---|---|
1 |
[12,["Tea","Milk"]] |
{"age":12,"drinks":["Tea","Milk"]} |
假定以下 CSV
nameSEPARage
SelmaSEPAR8
RanaSEPAR11
SelinaSEPAR18
我们可以执行
CALL apoc.load.csv('testMultiCharSep.csv', {sep:'SEPAR'})
YIELD lineNo, map, list
RETURN *;
行号 | 列表 | 映射 |
---|---|---|
0 |
["Selma", "9"] |
{name: "Selma", age: "9"} |
1 |
["Rana", "12"] |
{name: "Rana", age: "12"} |
2 |
["Selina", "19"] |
{name: "Selina", age: "19"} |
事务批处理
为了处理大型文件,CALL … IN TRANSACTIONS
可以与 LOAD 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 解析为映射数据结构。
请参阅以下存储过程使用示例。
错误处理
您可以使用 failOnError
配置来处理 URL 或 CSV 不正确情况下的结果。例如,借助 apoc.when
存储过程,当 URL 不正确时,您可以将 nothingToList
和 nothingToMap
作为列表和映射结果返回。
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"]