apoc.export.graphml.query

此过程不建议在多线程中运行,因此并行运行时(Parallel runtime)不支持该过程。有关更多信息,请参阅 Cypher 手册 → 并行运行时

详细信息

语法

apoc.export.graphml.query(statement, file, config) :: (file, source, format, nodes, relationships, properties, time, rows, batchSize, batches, done, data)

描述

将 Cypher 语句中给定的 NODE(节点)和 RELATIONSHIP(关系)值导出到指定的 GraphML 文件中。

输入参数

名称

类型

描述

statement

STRING

用于收集导出数据的查询语句。

file

STRING

要导出数据的文件名。

config

MAP

{ stream = false :: BOOLEAN, format = 'cypher-shell' :: STRING timeoutSeconds = 100 :: INTEGER, compression = 'NONE' :: ['NONE', 'BYTES', 'GZIP', 'BZIP2', 'DEFLATE', 'BLOCK_LZ4', 'FRAMED_SNAPPY'], charset = 'UTF_8' :: STRING, source :: MAP, target :: MAP, useTypes :: BOOLEAN caption :: LIST<STRING>, nodesOfRelationships = false :: BOOLEAN }

返回参数

名称

类型

描述

file

STRING

数据导出到的文件名。

source

STRING

导出数据的摘要。

format

STRING

文件的导出格式。

节点

INTEGER(整数)

已导出节点的数量。

relationships

INTEGER(整数)

已导出关系的数量。

属性

INTEGER(整数)

已导出属性的数量。

time

INTEGER(整数)

导出所花费的时间。

rows

INTEGER(整数)

返回的行数。

batchSize

INTEGER(整数)

导出过程执行的批处理大小。

batches

INTEGER(整数)

导出过程执行的批次数。

done

布尔值 (BOOLEAN)

导出是否成功执行。

data

ANY

导出返回的数据。

配置参数

此过程支持以下配置参数

配置选项
参数 类型 默认 描述

stream

布尔值 (BOOLEAN)

false

将数据作为查询结果返回,而不是将其存储在文件中。

compression

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

'NONE'

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

timeoutSeconds

INTEGER(整数)

100

查询在超时前应运行的最大秒数。

charset

STRING

'UTF_8'

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

useTypes

布尔值 (BOOLEAN)

false

将类型添加到文件头中。

format

STRING

'cypher-shell'

导出格式。

source

MAP

false

target 一起使用以导入仅包含关系的文件。在这种情况下,edge 标签的 source 和 target 属性不是基于节点的内部 ID,而是基于自定义属性值。
例如,在路径 (:Foo {name: "aaa"})-[:KNOWS]→(:Bar {age: 666}) 中,KNOWS 关系可以使用配置 <edge id="e2" source="aaa" sourceType="string" target="666" targetType="long" label="KNOWS"><data key="label">KNOWS</data><data key="id">1</data></edge> 进行导出。注意额外的 sourceType/targetType,以便在导入时检测正确的类型。

target(目标)

MAP

100

source 一起使用以导入仅包含关系的文件。在这种情况下,edge 标签的 source 和 target 属性不是基于节点的内部 ID,而是基于自定义属性值。
例如,在路径 (:Foo {name: "aaa"})-[:KNOWS]→(:Bar {age: 666}) 中,KNOWS 关系可以使用配置 <edge id="e2" source="aaa" sourceType="string" target="666" targetType="long" label="KNOWS"><data key="label">KNOWS</data><data key="id">1</data></edge> 进行导出。注意额外的 sourceType/targetType,以便在导入时检测正确的类型。

caption

LIST<STRING>

['name', 'title', 'label', 'id']

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

nodesOfRelationships

布尔值 (BOOLEAN)

false

添加找到的节点之间缺失的关系。

使用示例

本节中的示例基于以下示例图

CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967})
CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961})
CREATE (Hugo:Person {name:'Hugo Weaving', born:1960})
CREATE (LillyW:Person {name:'Lilly Wachowski', born:1967})
CREATE (LanaW:Person {name:'Lana Wachowski', born:1965})
CREATE (JoelS:Person {name:'Joel Silver', born:1952})
CREATE
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),
(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),
(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),
(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),
(LillyW)-[:DIRECTED]->(TheMatrix),
(LanaW)-[:DIRECTED]->(TheMatrix),
(JoelS)-[:PRODUCED]->(TheMatrix);

下方的 Neo4j Browser 可视化显示了导入的图

play movies
图 1. 电影图谱可视化

apoc.export.graphml.query 过程将 Cypher 查询的结果导出到 CSV 文件或以数据流形式输出。

以下查询将所有 DIRECTED(导演)关系,以及该关系两侧具有 Person(人物)和 Movie(电影)标签的节点导出到文件 movies-directed.graphml 中。

WITH "MATCH path = (person:Person)-[directed:DIRECTED]->(movie)
      RETURN person, directed, movie" AS query
CALL apoc.export.graphml.query(query, "movies-directed.graphml", {})
YIELD file, source, format, nodes, relationships, properties, time, rows, batchSize, batches, done, data
RETURN file, source, format, nodes, relationships, properties, time, rows, batchSize, batches, done, data;
结果
file source format 节点 relationships 属性 time rows batchSize batches done data

"movies-directed.graphml"

"statement: nodes(3), rels(2)"

"graphml"

3

2

7

2

5

-1

0

TRUE

NULL

movies-directed.csv 的内容如下所示:

movies-directed.graphml
<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="https://w3org.cn/2001/XMLSchema-instance" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
<key id="born" for="node" attr.name="born"/>
<key id="name" for="node" attr.name="name"/>
<key id="tagline" for="node" attr.name="tagline"/>
<key id="label" for="node" attr.name="label"/>
<key id="title" for="node" attr.name="title"/>
<key id="released" for="node" attr.name="released"/>
<key id="label" for="edge" attr.name="label"/>
<graph id="G" edgedefault="directed">
<node id="n188" labels=":Movie"><data key="labels">:Movie</data><data key="title">The Matrix</data><data key="tagline">Welcome to the Real World</data><data key="released">1999</data></node>
<node id="n193" labels=":Person"><data key="labels">:Person</data><data key="born">1967</data><data key="name">Lilly Wachowski</data></node>
<node id="n194" labels=":Person"><data key="labels">:Person</data><data key="born">1965</data><data key="name">Lana Wachowski</data></node>
<edge id="e271" source="n193" target="n188" label="DIRECTED"><data key="label">DIRECTED</data></edge>
<edge id="e272" source="n194" target="n188" label="DIRECTED"><data key="label">DIRECTED</data></edge>
</graph>
</graphml>

以下查询返回所有 DIRECTED 关系以及该关系两侧带有 PersonMovie 标签的节点的流:

WITH "MATCH path = (person:Person)-[directed:DIRECTED]->(movie)
      RETURN person, directed, movie" AS query
CALL apoc.export.graphml.query(query, null, {stream: true})
YIELD file, nodes, relationships, properties, data
RETURN file, nodes, relationships, properties, data;
结果
file 节点 relationships 属性 data

NULL

3

2

7

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
 <graphml xmlns="\"http://graphml.graphdrawing.org/xmlns\""
          xmlns:xsi="\"https://w3org.cn/2001/XMLSchema-instance\""
          xsi:schemaLocation="\"http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\"">
   <key id="\"born\"" for="\"node\"" attr.name="\"born\""/>
   <key id="\"name\"" for="\"node\"" attr.name="\"name\""/>
   <key id="\"tagline\"" for="\"node\"" attr.name="\"tagline\""/>
   <key id="\"label\"" for="\"node\"" attr.name="\"label\""/>
   <key id="\"title\"" for="\"node\"" attr.name="\"title\""/>
   <key id="\"released\"" for="\"node\"" attr.name="\"released\""/>
   <key id="\"label\"" for="\"edge\"" attr.name="\"label\""/>
   <graph id="\"G\"" edgedefault="\"directed\"">
     <node id="\"n188\"" labels="\":Movie\"">
       <data key="\"labels\"">:Movie</data>
       <data key="\"title\"">The Matrix</data>
       <data key="\"tagline\"">Welcome to the Real World</data>
       <data key="\"released\"">1999</data>
     </node>
     <node id="\"n193\"" labels="\":Person\"">
       <data key="\"labels\"">:Person</data>
       <data key="\"born\"">1967</data>
       <data key="\"name\"">Lilly Wachowski</data>
     </node>
     <node id="\"n194\"" labels="\":Person\"">
       <data key="\"labels\"">:Person</data>
       <data key="\"born\"">1965</data>
       <data key="\"name\"">Lana Wachowski</data>
     </node>
     <edge id="\"e271\"" source="\"n193\"" target="\"n188\"" label="\"DIRECTED\"">
       <data key="\"label\"">DIRECTED</data>
     </edge>
     <edge id="\"e272\"" source="\"n194\"" target="\"n188\"" label="\"DIRECTED\"">
       <data key="\"label\"">DIRECTED</data>
     </edge>
   </graph>
 </graphml>
  "