apoc.load.json过程
|
从本地文件加载数据需要配置 apoc.conf,将 |
语法 |
|
||
描述 |
如果给定的 JSON 文件是 |
||
输入参数 |
名称 |
类型 |
描述 |
|
|
用于导入数据的文件名或二进制数据。 |
|
|
|
用于从列表中提取特定部分的 JSON 路径表达式。默认值为:``。 |
|
|
|
|
|
返回参数 |
名称 |
类型 |
描述 |
|
|
从给定文件加载的数据映射。 |
|
从文件读取
默认情况下,禁止从文件系统导入。我们可以通过在 apoc.conf 中设置以下属性来启用它
apoc.import.file.enabled=true
如果我们尝试在未先设置此属性的情况下使用任何导入过程,将会收到以下错误消息
Failed to invoke procedure: Caused by: java.lang.RuntimeException: Import from files not enabled, please set apoc.import.file.enabled=true in your apoc.conf |
导入文件从 import 目录读取,该目录由 server.directories.import 属性定义。这意味着我们提供的任何文件路径都是相对于此目录的。如果我们尝试从绝对路径(例如 /tmp/filename)读取,将会收到类似于以下的错误消息
Failed to invoke procedure: Caused by: java.lang.RuntimeException: Can’t read url or key file:/path/to/neo4j/import/tmp/filename as json: /path/to/neo4j//import/tmp/filename (No such file or directory) |
我们可以通过在 apoc.conf 中设置以下属性来启用从文件系统任意位置读取文件
apoc.import.file.use_neo4j_config=false
|
Neo4j 现在可以从文件系统的任何位置读取,因此在设置此属性之前,请确保这是您的意图。 |
使用示例
person.json 包含一个表示某人及其子女的 JSON 文档。
{
"name":"Michael",
"age": 41,
"children": ["Selina","Rana","Selma"]
}
我们将此文件放入 Neo4j 实例的 import 目录中。现在,让我们编写一个使用 apoc.load.json 过程的查询来探究此文件。
以下查询处理 person.json 并将内容作为 Cypher 数据结构返回
CALL apoc.load.json("file:///person.json")
YIELD value
RETURN value;
| 值 |
|---|
{name: "Michael", children: ["Selina", "Rana", "Selma"], age: 41} |
我们返回了一个与 JSON 文档几乎相同的映射。现在,我们可以扩展该查询,根据此 JSON 文件创建图。我们将为 Michael 和他的每个孩子创建一个 Person 节点,并从每个孩子到 Michael 节点创建一条 CHILD_OF 关系。
person.json 创建图CALL apoc.load.json("file:///person.json")
YIELD value
MERGE (p:Person {name: value.name})
SET p.age = value.age
WITH p, value
UNWIND value.children AS child
MERGE (c:Person {name: child})
MERGE (c)-[:CHILD_OF]->(p);
下方的 Neo4j Browser 可视化显示了导入的图
二进制文件
您还可以从二进制 byte[](未压缩)或压缩文件中导入(允许的压缩算法有:GZIP、BZIP2、DEFLATE、BLOCK_LZ4、FRAMED_SNAPPY)。
CALL apoc.load.json(`binaryGzipByteArray`, '', {compression: 'GZIP'})
或
CALL apoc.load.json(`binaryFileNotCompressed`, '', {compression: 'NONE'})
例如,这可以很好地与 apoc.util.compress 函数配合使用
WITH apoc.util.compress('{"foo":[1,2,3]}', {compression: 'DEFLATE'}) as jsonCompressed
CALL apoc.load.json(jsonCompressed, '', {compression: 'DEFLATE'})
YIELD value
RETURN value
| 值 |
|---|
{"foo": [1, 2, 3] } |