apoc.import.json

详细信息

语法

apoc.import.json(urlOrBinaryFile [, config ]) :: (file, source, format, nodes, relationships, properties, time, rows, batchSize, batches, done, data)

描述

从提供的 JSON 文件中导入图数据。

输入参数

名称

类型

描述

urlOrBinaryFile

ANY

用于导入数据的文件名或二进制数据。

config

MAP

{ unwindBatchSize = 5000 :: INTEGER, txBatchSize = 5000 :: INTEGER, importIdName = "neo4jImportId" :: STRING, nodePropertyMappings = {} :: MAP, relPropertyMappings = {} :: MAP, compression = "NONE" :: ["NONE", "BYTES", "GZIP", "BZIP2", "DEFLATE", "BLOCK_LZ4", "FRAMED_SNAPPY”], cleanup = false :: BOOLEAN, nodePropFilter = {} :: MAP, relPropFilter = {} :: MAP }。默认值为:{}

返回参数

名称

类型

描述

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

导入返回的数据。

配置参数

此过程支持以下配置参数

配置参数
名称 类型 默认 描述

unwindBatchSize

INTEGER(整数)

5000

UNWIND 操作的批处理大小。

txBatchSize

INTEGER(整数)

5000

事务的批处理大小。

importIdName

STRING

neo4jImportId

用于填充 JSON 中存在的 "id" 字段的属性名称。例如,对于一行 {"type":"node", "labels":["Language"], "id":"10"},若设置 importIdName:`foo`,将创建一个节点 (:User {foo: "10"})

nodePropertyMappings

MAP

{}

用于自定义 Neo4j 类型(point、date 等)的标签/属性名称/属性类型映射。例如:{ User: { born: 'Point', dateOfBirth: 'Datetime' } }

relPropertyMappings

MAP

{}

用于自定义 Neo4j 类型(point、date 等)的关系类型/属性名称/属性类型映射。例如:{ KNOWS: { since: 'Datetime' } }

compression

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

null

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

cleanup

布尔值 (BOOLEAN)

false

如果 JSON 中存在 "id" 字段,则将其移除。注意,如果开启此选项,将无法导入关系,因为我们依赖 "id" 字段来连接节点。

nodePropFilter

MAP<STRING, LIST<STRING>>

{}

一个以标签为键、以导入过程中需过滤的属性键列表为值的映射。例如 { User: ['name', 'surname'], Another: ['foo']} 将跳过标签为 'User' 的节点的 'name' 和 'surname' 属性,以及标签为 'Another' 的节点的 'foo' 属性。
注意,如果一个节点拥有多个标签,例如本例中的 (:User:Another {}),则两个标签的所有属性都会被过滤,即 'name'、'surname' 和 'foo'。
我们还可以传入键 _all 来过滤所有节点的属性,例如 {_all: ['myProp']}

relPropFilter

MAP<STRING, LIST<STRING>>

{}

一个以关系类型为键、以导入过程中需过滤的属性键列表为值的映射。例如 { MY_REL: ['foo', 'baz'] } 将跳过 '[:MY_REL]' 关系的 'foo' 和 'baz' 属性。
我们还可以传入键 _all 来过滤所有关系的属性,例如 {_all: ['myProp']}

nodePropertyMappingsrelPropertyMappings 支持以下 Neo4j 类型

  • POINT

  • DATE

  • LOCAL TIME

  • LOCAL DATETIME

  • DURATION(持续时间)

  • ZONED TIME

  • ZONED DATETIME

使用示例

apoc.import.json 过程可用于导入由 apoc.export.json.* 过程创建的 JSON 文件,且导出时需使用配置参数 jsonFormat: 'JSON_LINES'(默认配置)。

all.json 包含 Neo4j 电影图数据的一个子集,由 apoc.export.json.all 生成。

all.json
{"type":"node","id":"0","labels":["User"],"properties":{"born":"2015-07-04T19:32:24","name":"Adam","place":{"crs":"wgs-84","latitude":13.1,"longitude":33.46789,"height":null},"age":42,"male":true,"kids":["Sam","Anna","Grace"]}}
{"type":"node","id":"1","labels":["User"],"properties":{"name":"Jim","age":42}}
{"type":"node","id":"2","labels":["User"],"properties":{"age":12}}
{"id":"0","type":"relationship","label":"KNOWS","properties":{"bffSince":"P5M1DT12H","since":1993},"start":{"id":"0","labels":["User"],"properties":{"born":"2015-07-04T19:32:24","name":"Adam","place":{"crs":"wgs-84","latitude":13.1,"longitude":33.46789,"height":null},"age":42,"male":true,"kids":["Sam","Anna","Grace"]}},"end":{"id":"1","labels":["User"],"properties":{"name":"Jim","age":42}}}

我们可以使用 apoc.import.json 导入此文件。

CALL apoc.import.json("file:///all.json")
结果
| file               | source | format | nodes | relationships | properties | time | rows | batchSize | batches | done | data
| "file:///all.json" | "file" | "json" | 3     | 1             | 15         | 105  | 4    | -1        | 0       | TRUE | NULL

唯一性约束

为了避免导入重复值,所有导入的节点标签和关系类型上都必须设置 唯一性约束。如果缺少此约束,该过程将返回一个错误消息,其中包含关于缺少约束的信息以及创建该约束的命令。(因为此过程使用 WRITE 模式,所以它本身无法添加约束。)

示例 1. 在创建唯一性约束前后导入 JSON 文件

文件 missingConstraint.json 包含以下内容

{"type":"node","id":"1","labels":["Test"],"properties":{"name":"A test name"}}

在没有约束的数据库上执行以下查询将抛出错误

CALL apoc.import.json("file:///missingConstraint.json")
错误消息
Failed to invoke procedure `apoc.import.json`: Caused by: java.lang.RuntimeException: Missing constraint required for import. Execute this query:
CREATE CONSTRAINT FOR (n:Test) REQUIRE n.neo4jImportId IS UNIQUE;

错误消息的最后一行提供了创建约束所需的语句

CREATE CONSTRAINT FOR (n:Test) REQUIRE n.neo4jImportId IS UNIQUE;

添加约束后,导入将成功运行

CALL apoc.import.json("file:///missingConstraint.json")
结果
| file                             | source | format | nodes | relationships | properties | time | rows | batchSize | batches | done | data
| "file:///missingConstraint.json" | "file" | "json" | 1     | 0             | 2          | 24   | 1    | -1        | 0       | TRUE | NULL

二进制文件

您还可以从二进制 byte[](未压缩,默认值,配置为 {compression: NONE})或压缩文件(允许的压缩算法为:GZIP, BZIP2, DEFLATE, BLOCK_LZ4, FRAMED_SNAPPY)导入文件。如下所示

CALL apoc.import.json(`binaryFileNotCompressed`, {compression: 'NONE'})

CALL apoc.import.json(`binaryGzipByteArray`, {compression: 'GZIP'})

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

WITH apoc.util.compress('{"type":"node","id":"2","labels":["User"],"properties":{"age":12}}', {compression: 'DEFLATE'}) AS jsonCompressed
CALL apoc.import.json(jsonCompressed, {compression: 'DEFLATE'})
YIELD source, format, nodes, relationships, properties
RETURN source, format, nodes, relationships, properties
结果
| source | format | nodes | relationships | properties
| "binary" | "json" | 1     | 0             | 2