使用 Apache Arrow 导出

Neo4j 图数据科学库中的图支持节点和关系的属性。导出这些属性的一种方法是使用 Cypher 过程,如 流节点流关系 中所述。与过程类似,GDS 还支持通过 Arrow Flight 导出属性。

在本章中,我们假设已设置并配置了 Flight 服务器。要详细了解安装,请参阅 安装章节

Arrow 导出功能经过版本控制,以允许将来进行更改。请参阅 相应部分配置 Apache Arrow 服务器 文档中,了解有关版本控制命令的更多详细信息。

Arrow 票据格式

通过调用 GET 函数并提供 Flight 票据,Arrow 客户端启动从内存中图读取属性的 Flight 流。总体思路是镜像从内存中图流属性的过程的行为。为了识别我们要镜像的图和过程,票据必须包含以下键

名称 类型 描述

graph_name

字符串

图目录中的图名称。

database_name

字符串

与图关联的数据库。

procedure_name

字符串

镜像的属性流过程。

configuration

地图

过程特定的配置。

以下图像显示了使用节点属性流作为示例导出数据的客户端-服务器交互。

Client-server protocol for Arrow export in GDS

流所有节点标签

要流式传输图中每个节点的节点标签,客户端需要提供以下票据

{
    name: "GET_COMMAND",
    version: "v1",
    body: {
        graph_name: "my_graph",
        database_name: "database_name",
        procedure_name: "gds.graph.nodeLabels.stream",
        configuration: {
            consecutive_ids: false
        }
    }
}

特定命令配置支持以下键

名称 类型 描述

consecutive_ids

布尔值

返回映射到连续 ID 空间的节点 ID,即 [0..nodeCount)(默认值:false)。

结果记录的模式如下所示

表 1. 结果
名称 类型 描述

可选

nodeId

整数

节点的 ID。

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 指示我们镜像现有 过程 的行为。特定配置需要包含以下键

名称 类型 描述

node_labels

字符串或字符串列表

仅流式传输具有给定标签的节点的属性。

node_property

字符串

要流式传输的图中的节点属性。

list_node_labels

布尔值

是否在结果中包含相应节点的节点标签。

consecutive_ids

布尔值

返回映射到连续 ID 空间的节点 ID,即 [0..nodeCount)(默认值:false)。

结果记录的模式与相应过程相同

表 2. 结果
名称 类型 描述 可选

nodeId

整数

节点的 ID。

false

propertyValue

  • 整数

  • 浮点数

  • 整数列表

  • 浮点数列表

存储的属性值。

false

labels

字符串列表

节点的标签。如果设置了 list_node_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 指示我们镜像现有 过程 的行为。特定配置需要包含以下键

名称 类型 描述

node_labels

字符串或字符串列表

仅流式传输具有给定标签的节点的属性。

node_properties

字符串或字符串列表

要流式传输的图中的节点属性。

list_node_labels

布尔值

是否在结果中包含相应节点的节点标签。

consecutive_ids

布尔值

返回映射到连续 ID 空间的节点 ID,即 [0..nodeCount)(默认值:false)。

请注意,结果记录的模式与相应过程并不完全相同。并非使用单独的列包含属性键,而是每个属性都在其自己的列中返回。因此,每个节点只有一行,包含所有其属性值。

例如,给定节点 (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 指示我们镜像现有 过程 的行为。特定配置需要包含以下键

名称 类型 描述

relationship_types

字符串或字符串列表

仅流式传输具有给定类型的关系的属性。

relationship_property

字符串

要流式传输的图中的关系属性。

consecutive_ids

布尔值

返回映射到连续 ID 空间的节点 ID,即 [0..nodeCount)(默认值:false)。

结果记录的模式与相应过程相同

表 3. 结果
名称 类型 描述

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 指示我们镜像现有 过程 的行为。特定配置需要包含以下键

名称 类型 描述

relationship_types

字符串或字符串列表

仅流式传输具有给定类型的关系的属性。

relationship_properties

字符串或字符串列表

要流式传输的图中的关系属性。

consecutive_ids

布尔值

返回映射到连续 ID 空间的节点 ID,即 [0..nodeCount)(默认值:false)。

请注意,结果记录的模式与相应过程并不完全相同。并非使用单独的列包含属性键,而是每个属性都在其自己的列中返回。因此,每个关系只有一行,包含所有其属性值。

例如,给定关系 [:REL { foo: 42.0, bar: 13.37 }],它连接了 id 为 0 的源节点和 id 为 1 的目标节点,则结果记录模式如下

表 4. 结果
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 指示我们镜像现有 过程 的行为。特定配置需要包含以下键

名称 类型 描述

relationship_types

字符串或字符串列表

仅流式传输具有给定类型的关系的属性。

consecutive_ids

布尔值

返回映射到连续 ID 空间的节点 ID,即 [0..nodeCount)(默认值:false)。

结果记录的模式与相应过程相同

表 5. 结果
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 端点请求分区数据。