apoc.import.csv

从本地文件导入数据需要在 apoc.conf 中设置 apoc.import.file.enabled=true。Aura 不支持此功能,因此 Aura 实例仅限于导入公开托管的文件。

详细信息

语法

apoc.import.csv(nodes, rels, config) :: (file, source, format, nodes, relationships, properties, time, rows, batchSize, batches, done, data)

描述

根据提供的 CSV 文件中给定的标签和类型,导入 NODE(节点)和 RELATIONSHIP(关系)值。

输入参数

名称

类型

描述

节点

LIST<MAP>

包含节点值导入位置的 Map 列表;{ fileName :: STRING, data :: BYTEARRAY, labels :: LIST<STRING> }

rels

LIST<MAP>

包含关系值导入位置的 Map 列表:{ fileName :: STRING, data :: BYTEARRAY, type :: STRING }

config

MAP

{ delimiter = "," :: STRING, arrayDelimiter = ";" :: STRING, ignoreDuplicateNodes = false :: BOOLEAN, quotationCharacter = """ :: STRING, stringIds = true :: BOOLEAN, skipLines = 1 :: INTEGER, ignoreBlankString = false :: BOOLEAN, ignoreEmptyCellArray = false :: BOOLEAN, compression = "NONE" :: ["NONE", "BYTES", "GZIP", "BZIP2", "DEFLATE", "BLOCK_LZ4", "FRAMED_SNAPPY"], charset = "UTF-8" :: STRING, batchSize = 2000 :: INTEGER }

返回参数

名称

类型

描述

file

STRING

导入数据所用的文件名。

source

STRING

导入数据的来源:"file"(文件)、"binary"(二进制)或 "file/binary"。

format

STRING

文件格式:["csv", "graphml", "json"]。

节点

INTEGER(整数)

导入的节点数量。

relationships

INTEGER(整数)

导入的关系数量。

属性

INTEGER(整数)

导入的属性数量。

time

INTEGER(整数)

导入持续时间。

rows

INTEGER(整数)

返回的行数。

batchSize

INTEGER(整数)

导入过程中使用的批处理大小。

batches

INTEGER(整数)

导入过程中执行的批次数。

done

布尔值 (BOOLEAN)

导入是否成功完成。

data

ANY

导入返回的数据。

配置参数

此过程支持以下配置参数

配置参数
名称 类型 默认 描述 导入工具对应项

delimiter

STRING

,

列之间的分隔符

--delimiter=,

arrayDelimiter

STRING

;

数组中的分隔符

--array-delimiter=;

ignoreDuplicateNodes

布尔值 (BOOLEAN)

false

对于重复节点,仅加载第一个并跳过其余部分 (true),或导致导入失败 (false)

--ignore-duplicate-nodes=false

quotationCharacter

STRING

"

引用字符

--quote='"'

stringIds

布尔值 (BOOLEAN)

true

将 ID 视为字符串

--id-type=STRING

skipLines

INTEGER(整数)

1

要跳过的行数(包含标题行)

不适用

ignoreBlankString

布尔值 (BOOLEAN)

false

如果为 true,则忽略空白字符串属性

不适用

ignoreEmptyCellArray

布尔值 (BOOLEAN)

false

如果为 true,则像导入工具一样忽略包含单个空字符串的数组属性

不适用

compression

枚举 [NONE, BYTES, GZIP, BZIP2, DEFLATE, BLOCK_LZ4, FRAMED_SNAPPY]

null

允许接收二进制数据,可以是不压缩的 (值: NONE) 或压缩的(其他值)。

不适用

charset

STRING

'UTF-8'

当前 JDK 中扩展 java.nio.Charset 的字符集名称。例如:US-ASCII, ISO-8859-1, UTF-8, UTF-16

--input-encoding

batchSize

INTEGER(整数)

2000

处理完指定行数后提交并继续

不适用

使用 Cypher 加载 CSV 文件

Cypher 支持将数据从 CSV 文件加载到 Neo4j 数据库中。

LOAD CSV 示例
LOAD CSV WITH HEADERS FROM 'file:///persons.csv' AS line
RETURN line.id, line.name

有关更多信息,请参阅 Cypher 手册 → LOAD CSV

用法示例

此过程导入符合 Neo4j 导入工具标题格式的 CSV 文件。

导入节点

以下 CSV 文件包含两个人

persons.csv
id:ID,name:STRING
1,John
2,Jane

此示例假设文件已放置在 Neo4j 实例的 import 目录中。

我们可以同时使用 APOC 和 Cypher 创建两个设置了 name 属性的 Person 节点

apoc.import.csv
CALL apoc.import.csv([{fileName: 'file:/persons.csv', labels: ['Person']}], [], {});
YIELD nodes
RETURN nodes
使用 Cypher 的 LOAD CSV
LOAD CSV WITH HEADERS FROM 'file:///persons.csv' AS line
CREATE (:Person { id: line['id:ID'], name: line['name:STRING'] })
RETURN count(*) AS nodes
结果
节点

2

我们可以通过运行以下查询来检查已导入的内容

MATCH (p:Person)
RETURN p
结果
p

(:Person {name: "John", id: "1"})

(:Person {name: "Jane", id: "2"})

节点和关系

以下文件包含 CSV 格式的 NODERELATIONSHIP

people-nodes.csv
:ID|name:STRING|speaks:STRING[]
1|John|en,fr
2|Jane|en,de
knows-rels.csv
:START_ID|:END_ID|since:INT
1|2|2016

我们将导入两个 Person 节点以及它们之间的一个 KNOWS 关系(并设置 since 属性的值)。字段终止符和数组分隔符已更改为非默认值,且 CSV 使用数字 ID。

apoc.import.csv
CALL apoc.import.csv(
  [{fileName: 'file:/people-nodes.csv', labels: ['Person']}],
  [{fileName: 'file:/knows-rels.csv', type: 'KNOWS'}],
  {delimiter: '|', arrayDelimiter: ',', stringIds: false}
);
使用 Cypher 的 LOAD CSV
LOAD CSV WITH HEADERS FROM 'file:///old.csv'  AS line FIELDTERMINATOR '|'
CREATE (p:Person { id: line[':ID'], speaks: split(line['speaks:STRING[]'], ','), name: line['name:STRING'] })
WITH count(*) AS nodes

LOAD CSV WITH HEADERS FROM 'file:///users.csv'  AS line FIELDTERMINATOR '|'
MATCH (a:Person {id: line[':START_ID']}), (b:Person {id: line[':END_ID']})
CREATE (a)-[:KNOWS { since: toInteger(line['since:INT']) }]->(b)
RETURN nodes, count(*) AS relationships
结果
节点 relationships

2

1

我们可以通过运行以下查询来检查已导入的内容

MATCH path = (p1:Person)-[:KNOWS]->(p2:Person)
RETURN path
结果
path

(:Person {name: "John", speaks: ["en", "fr"], csv_id: 1})-[:KNOWS {since: 2016}]→(:Person {name: "Jane", speaks: ["en", "de"], csv_id: 2})

二进制文件

您还可以从二进制 byte[](未压缩,默认值为 NONE)或压缩文件(允许的压缩算法:GZIP, BZIP2, DEFLATE, BLOCK_LZ4, FRAMED_SNAPPY)导入文件。请注意,在这种情况下,对于 relationsnodes 参数映射,文件键应为 data 而不是 fileName,即:

CALL apoc.import.csv([{data: `binaryGzipByteArray`, labels: ['Person']}], [{data: `binaryGzipByteArray`, type: 'KNOWS'}], {compression: 'GZIP'})

CALL apoc.import.csv([{data: `binaryFileNotCompressed`, labels: ['Person']}], [{data: `binaryFileNotCompressed`, type: 'KNOWS'}], {compression: 'NONE'})

例如,这可以很好地与 apoc.util.compress 函数配合使用

WITH apoc.util.compress(':ID|firstname:STRING|lastname:IGNORE|age:INT\n1|John|Doe|25\n2|Jane|Doe|26', {compression: 'DEFLATE'}) AS nodeCsv
WITH apoc.util.compress(':START_ID|:END_ID|prop1:IGNORE|prop2:INT\n1|2|a|3\n2|1|b|6', {compression: 'DEFLATE'}) AS relCsv, nodeCsv
CALL apoc.import.csv([{data: nodeCsv, labels: ['Person']}], [{data: relCsv, type: 'KNOWS'}], {delimiter: '|', compression: 'DEFLATE'})
YIELD source, format, nodes, relationships, properties
RETURN source, format, nodes, relationships, properties
结果
source format 节点 relationships 属性

"binary"

"csv"

2

2

8

属性

对于属性,字段的 <name> 部分指定属性键,而 <field_type> 部分(在 : 之后)指定数据类型(见下文)。您可以在节点数据文件和关系数据文件中使用属性。

使用 int, long, float, double, boolean, byte, short, char, string, point, date, localtime, time, localdatetime, datetimeduration 中的一种来指定属性的数据类型。如果未提供数据类型,则默认为 string。要定义数组类型,请在类型后附加 []。例如:

test.csv
:ID,name,joined:date,active:boolean,points:int
user01,Joe Soap,2017-05-05,true,10
user02,Jane Doe,2017-08-21,true,15
user03,Moe Know,2018-02-17,false,7

Point(点)

点使用 Cypher 的 Map 语法指定。该 Map 允许使用与 Point 函数输入相同的键。标题中的点数据类型可以使用一个默认值的 MAP 进行修补,这些默认值将用于该列的所有值,例如 point{crs: 'WGS-84'}。以这种方式指定标题允许您在数据文件的值位置使用不完整的 Map。可选地,数据文件中的值可以覆盖标题中的默认值。

point.csv
:ID,name,location:point{crs:WGS-84}
city01,"Malmö","{latitude:55.6121514, longitude:12.9950357}"
city02,"London","{y:51.507222, x:-0.1275}"
city03,"San Mateo","{latitude:37.554167, longitude:-122.313056, height: 100, crs:'WGS-84-3D'}"

在上述 csv 中:

  • 第一个城市的地理位置按照标题中定义的坐标系,使用 latitudelongitude 定义。

  • 第二个城市改为使用 xy。这通常会导致使用笛卡尔坐标参考系统。由于标题定义了 crs:WGS-84,因此将使用该坐标参考系统。

  • 第三个城市覆盖了标题中定义的坐标参考系统,并将其明确设置为 WGS-84-3D。

Temporal(时间)

所有时间数据类型的格式必须按照 Temporal instants(时间瞬间)语法Durations(持续时间)语法进行定义。两种时间类型 Time 和 DateTime 接受一个时区参数,该参数对于数据文件中的所有或多个值可能是通用的。因此,可以在标题中为 Time 和 DateTime 值指定默认时区,例如:time{timezone:+02:00}datetime{timezone:Europe/Stockholm}

point.csv
:ID,date1:datetime{timezone:Europe/Stockholm},date2:datetime
1,2018-05-10T10:30,2018-05-10T12:30
2,2018-05-10T10:30[Europe/Berlin],2018-05-10T12:30[Europe/Berlin]

在上述 csv 中:

  • 第一行有两个不指定明确时区的值。date1 的值将使用标题中为该字段指定的 Europe/Stockholm 时区。date2 的值将使用数据库配置的默认时区。

  • 在第二行中,date1date2 都明确将时区设置为 Europe/Berlin。这将覆盖 date1 的标题定义,以及数据库配置的默认时区。