apoc.import.xml
语法 |
|
||
描述 |
从提供的 XML 文件导入图。 |
||
输入参数 |
名称 |
类型 |
描述 |
|
|
用于导入数据的文件名或二进制数据。 |
|
|
|
|
|
返回参数 |
名称 |
类型 |
描述 |
|
|
一个导入的节点。 |
|
从文件读取
默认情况下,从文件系统导入数据是禁用的。我们可以通过在 apoc.conf 中设置以下属性来启用它
apoc.import.file.enabled=true
如果我们尝试使用任何导入过程而没有首先设置此属性,我们将收到以下错误消息
调用过程失败:原因:java.lang.RuntimeException: 未启用文件导入,请在您的 apoc.conf 中设置 apoc.import.file.enabled=true |
导入文件从 import 目录读取,该目录由 server.directories.import 属性定义。这意味着我们提供的任何文件路径都是相对于此目录的。如果我们尝试从绝对路径(例如 /tmp/filename)读取,我们将收到类似于以下内容的错误消息
调用过程失败:原因:java.lang.RuntimeException: 无法将 url 或 key file:/path/to/neo4j/import/tmp/filename 读取为 json: /path/to/neo4j//import/tmp/filename (没有此文件或目录) |
我们可以通过在 apoc.conf 中设置以下属性来启用从文件系统中任何位置读取文件
apoc.import.file.use_neo4j_config=false
|
Neo4j 现在将能够从文件系统中任何位置读取,因此在设置此属性之前,请确保这是您的意图。 |
使用示例
本节中的示例基于 Microsoft 的 book.xml 文件。
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
...
该文件可以从 GitHub 下载。
我们可以编写以下查询来创建 Microsoft 书籍 XML 文件的图结构。
CALL apoc.import.xml(
"https://raw.githubusercontent.com/neo4j/apoc/2025.05/core/src/test/resources/xml/books.xml",
{relType:'NEXT_WORD', label:'XmlWord'}
)
YIELD node
RETURN node;
| node |
|---|
(:XmlDocument {_xmlVersion: "1.0", _xmlEncoding: "UTF-8", url: "https://raw.githubusercontent.com/neo4j/apoc/2025.05/core/src/test/resources/xml/books.xml"}) |
下面的 Neo4j Browser 可视化显示了导入的图
二进制文件
您还可以从二进制 byte[](未压缩)或压缩文件(允许的压缩算法有:GZIP、BZIP2、DEFLATE、BLOCK_LZ4、FRAMED_SNAPPY)导入文件。
CALL apoc.import.xml(`binaryGzipByteArray`, {compression: 'GZIP'})
或
CALL apoc.import.xml(`binaryFileNotCompressed`, {compression: 'NONE'})
例如,这个与 apoc.util.compress 函数配合良好
WITH apoc.util.compress('<?xml version="1.0" encoding="UTF-8"?>
<parent name="databases">
<child name="Neo4j">
Neo4j is a graph database
</child>
<child name="relational">
<grandchild name="MySQL"><![CDATA[
MySQL is a database & relational
]]>
</grandchild>
<grandchild name="Postgres">
Postgres is a relational database
</grandchild>
</child>
</parent>', {compression: 'DEFLATE'}) as xmlCompressed
CALL apoc.import.xml(xmlCompressed, {compression: 'DEFLATE'})
YIELD node
RETURN node
| node |
|---|
[source,json] ---- { "identity": 11, "labels": [ "XmlDocument" ], "properties": { "_xmlEncoding": "UTF-8", "_xmlVersion": "1.0" } } ---- |