使用 Apache Arrow 导出
Neo4j 图数据科学库中的图支持节点和关系的属性。导出这些属性的一种方法是使用 Cypher 过程,如 流节点 和 流关系 中所述。与过程类似,GDS 还支持通过 Arrow Flight 导出属性。
在本章中,我们假设已设置并配置了 Flight 服务器。要详细了解安装,请参阅 安装章节。
Arrow 导出功能经过版本控制,以允许将来进行更改。请参阅 相应部分 在 配置 Apache Arrow 服务器 文档中,了解有关版本控制命令的更多详细信息。
Arrow 票据格式
通过调用 GET
函数并提供 Flight 票据,Arrow 客户端启动从内存中图读取属性的 Flight 流。总体思路是镜像从内存中图流属性的过程的行为。为了识别我们要镜像的图和过程,票据必须包含以下键
名称 | 类型 | 描述 |
---|---|---|
|
字符串 |
图目录中的图名称。 |
|
字符串 |
与图关联的数据库。 |
|
字符串 |
镜像的属性流过程。 |
|
地图 |
过程特定的配置。 |
以下图像显示了使用节点属性流作为示例导出数据的客户端-服务器交互。

流所有节点标签
要流式传输图中每个节点的节点标签,客户端需要提供以下票据
{ name: "GET_COMMAND", version: "v1", body: { graph_name: "my_graph", database_name: "database_name", procedure_name: "gds.graph.nodeLabels.stream", configuration: { consecutive_ids: false } } }
特定命令配置支持以下键
名称 | 类型 | 描述 |
---|---|---|
|
布尔值 |
返回映射到连续 ID 空间的节点 ID,即 |
结果记录的模式如下所示
名称 | 类型 | 描述 |
---|---|---|
|
nodeId |
整数 |
|
false |
labels |
|
节点的标签。 |
false |
流单个节点属性
要流式传输单个节点属性,客户端需要在票据中对该信息进行编码,如下所示
{ name: "GET_COMMAND", version: "v1", body: { graph_name: "my_graph", database_name: "database_name", procedure_name: "gds.graph.nodeProperty.stream", configuration: { node_labels: ["*"], node_property: "foo", list_node_labels: true, consecutive_ids: false } } }
procedure_name
指示我们镜像现有 过程 的行为。特定配置需要包含以下键
名称 | 类型 | 描述 |
---|---|---|
|
字符串或字符串列表 |
仅流式传输具有给定标签的节点的属性。 |
|
字符串 |
要流式传输的图中的节点属性。 |
|
布尔值 |
是否在结果中包含相应节点的节点标签。 |
|
布尔值 |
返回映射到连续 ID 空间的节点 ID,即 |
结果记录的模式与相应过程相同
名称 | 类型 | 描述 | 可选 |
---|---|---|---|
nodeId |
整数 |
节点的 ID。 |
false |
propertyValue |
|
存储的属性值。 |
false |
labels |
字符串列表 |
节点的标签。如果设置了 |
true |
流式传输多个节点属性
要流式传输多个节点属性,客户端需要按如下方式在票证中编码该信息
{ name: "GET_COMMAND", version: "v1", body: { graph_name: "my_graph", database_name: "database_name", procedure_name: "gds.graph.nodeProperties.stream", configuration: { node_labels: ["*"], node_properties: ["foo", "bar", "baz"], list_node_labels: true, consecutive_ids: false } } }
procedure_name
指示我们镜像现有 过程 的行为。特定配置需要包含以下键
名称 | 类型 | 描述 |
---|---|---|
|
字符串或字符串列表 |
仅流式传输具有给定标签的节点的属性。 |
|
字符串或字符串列表 |
要流式传输的图中的节点属性。 |
|
布尔值 |
是否在结果中包含相应节点的节点标签。 |
|
布尔值 |
返回映射到连续 ID 空间的节点 ID,即 |
请注意,结果记录的模式与相应过程并不完全相同。并非使用单独的列包含属性键,而是每个属性都在其自己的列中返回。因此,每个节点只有一行,包含所有其属性值。
例如,给定节点 (a { foo: 42, bar: 1337, baz: [1,3,3,7] })
并假设节点 a
的 id 为 0
,则结果记录模式如下
nodeId | foo | bar | baz |
---|---|---|---|
0 |
42 |
1337 |
[1,3,3,7] |
流式传输单个关系属性
要流式传输单个关系属性,客户端需要按如下方式在票证中编码该信息
{ name: "GET_COMMAND", version: "v1", body: { graph_name: "my_graph", database_name: "database_name", procedure_name: "gds.graph.relationshipProperty.stream", configuration: { relationship_types: "REL", relationship_property: "foo", consecutive_ids: false } } }
procedure_name
指示我们镜像现有 过程 的行为。特定配置需要包含以下键
名称 | 类型 | 描述 |
---|---|---|
|
字符串或字符串列表 |
仅流式传输具有给定类型的关系的属性。 |
|
字符串 |
要流式传输的图中的关系属性。 |
|
布尔值 |
返回映射到连续 ID 空间的节点 ID,即 |
结果记录的模式与相应过程相同
名称 | 类型 | 描述 |
---|---|---|
sourceNodeId |
整数 |
关系的源节点 id。 |
targetNodeId |
整数 |
关系的目标节点 id。 |
relationshipType |
整数 |
字典编码的关系类型。 |
propertyValue |
浮点数 |
存储的属性值。 |
请注意,关系类型列存储作为整数编码的关系类型。需要从相应的字典值向量中检索相应的字符串值。可以使用类型的编码 id 从字典提供程序加载该向量。
流式传输多个关系属性
要流式传输多个关系属性,客户端需要按如下方式在票证中编码该信息
{ name: "GET_COMMAND", version: "v1", body: { graph_name: "my_graph", database_name: "database_name", procedure_name: "gds.graph.relationshipProperties.stream", configuration: { relationship_types: "REL", relationship_property: ["foo", "bar"], consecutive_ids: false } } }
procedure_name
指示我们镜像现有 过程 的行为。特定配置需要包含以下键
名称 | 类型 | 描述 |
---|---|---|
|
字符串或字符串列表 |
仅流式传输具有给定类型的关系的属性。 |
|
字符串或字符串列表 |
要流式传输的图中的关系属性。 |
|
布尔值 |
返回映射到连续 ID 空间的节点 ID,即 |
请注意,结果记录的模式与相应过程并不完全相同。并非使用单独的列包含属性键,而是每个属性都在其自己的列中返回。因此,每个关系只有一行,包含所有其属性值。
例如,给定关系 [:REL { foo: 42.0, bar: 13.37 }]
,它连接了 id 为 0
的源节点和 id 为 1
的目标节点,则结果记录模式如下
sourceNodeId | targetNodeId | relationshipType | foo | bar |
---|---|---|---|---|
0 |
1 |
0 |
42.0 |
13.37 |
请注意,关系类型列存储作为整数编码的关系类型。需要从相应的字典值向量中检索相应的字符串值。可以使用类型的编码 id 从字典提供程序加载该向量。
流式传输关系拓扑
要流式传输一种或多种关系类型的拓扑结构,客户端需要按如下方式在票证中编码该信息
{ name: "GET_COMMAND", version: "v1", body: { graph_name: "my_graph", database_name: "database_name", procedure_name: "gds.graph.relationships.stream", configuration: { relationship_types: "REL", consecutive_ids: false } } }
procedure_name
指示我们镜像现有 过程 的行为。特定配置需要包含以下键
名称 | 类型 | 描述 |
---|---|---|
|
字符串或字符串列表 |
仅流式传输具有给定类型的关系的属性。 |
|
布尔值 |
返回映射到连续 ID 空间的节点 ID,即 |
结果记录的模式与相应过程相同
sourceNodeId | targetNodeId | relationshipType |
---|---|---|
0 |
1 |
0 |
请注意,关系类型列存储作为整数编码的关系类型。需要从相应的字典值向量中检索相应的字符串值。可以使用类型的编码 id 从字典提供程序加载该向量。
对数据流进行分区
某些用例需要对数据流进行分区。例如,如果数据流由分布式系统使用,则需要将数据流均匀分布到分布式系统的成员。为了支持此用例,客户端可以通过将流请求发送到 GDS Flight Server 的 FlightInfo
端点来请求对数据流进行分区。然后,服务器将返回多个端点,其中每个端点及其伴随的票证都可以用于流式传输数据的一个分区。票证的 concurrency
设置可用于控制分区数量。
例如,要流式传输一种或多种关系类型的拓扑结构,客户端需要按如下方式在票证中编码该信息
{ name: "GET_COMMAND", version: "v1", body: { graph_name: "my_graph", database_name: "database_name", procedure_name: "gds.graph.relationships.stream", concurrency: 2, configuration: { relationship_types: "REL" } } }
这将创建最多 2 个数据流分区。服务器将以 2 个票证作为答复
[ { graph_name: "my_graph", database_name: "database_name", procedure_name: "gds.graph.relationships.stream", concurrency: 4, partition_offset: 0, partition_size: 100, configuration: { relationship_types: "REL" } }, { graph_name: "my_graph", database_name: "database_name", procedure_name: "gds.graph.relationships.stream", partition_offset: 100, partition_size: 100, concurrency: 4, configuration: { relationship_types: "REL" } } ]
现在可以使用每个票证通过 GDS Flight Server 的 GET
端点请求分区数据。