最大流 (Max Flow)
给定源节点、目标节点以及带有容量约束的关系,最大流算法会为每条关系分配流量,以实现从源到目标的最大化传输。
流量是每条关系的标量属性,且必须满足以下条件:
-
流入某节点的流量等于流出该节点的流量(守恒性)
-
流量受限于关系的容量
语法
本节介绍执行最大流算法所使用的语法。
CALL Neo4j_Graph_Analytics.graph.maxflow(
'CPU_X64_XS', (1)
{
['defaultTablePrefix': '...',] (2)
'project': {...}, (3)
'compute': {...}, (4)
'write': {...} (5)
}
);
| 1 | 计算池选择器。 |
| 2 | 表引用的可选前缀。 |
| 3 | 项目配置。 |
| 4 | 计算配置。 |
| 5 | 写入配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
computePoolSelector |
字符串 |
|
否 |
用于运行最大流作业的计算池选择器。 |
配置 |
Map |
|
否 |
用于图项目、算法计算和结果回写的配置。 |
配置映射由以下三个条目组成。
| 有关以下项目配置的更多详细信息,请参阅 项目文档。 |
| 名称 | 类型 |
|---|---|
nodeTables |
节点表列表。 |
relationshipTables |
关系类型到关系表的映射。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
sourceNodes |
字符串/整数列表,字符串,或整数 |
|
否 |
作为节点或节点 ID 提供的源节点,流量从这些节点流入网络。 |
sourceNodesTable |
字符串 |
|
否 |
包含源节点的表名。 |
targetNodes |
字符串/整数列表,字符串,或整数 |
|
否 |
作为节点或节点 ID 提供的目标节点,流量存入这些节点。 |
targetNodesTable |
字符串 |
|
否 |
用于映射目标节点标识符的表。 |
nodeCapacityProperty |
字符串 |
|
是 |
如果定义了该参数,则具有给定属性的节点将根据其属性值限制其可处理的总流量。对于没有限制的节点,请留空。 |
capacityProperty |
字符串 |
|
否 |
用作容量的关系属性名称。 |
resultRelationshipType |
字符串 |
|
是 |
用于回写到 Snowflake 数据库的关系类型。 |
resultProperty |
字符串 |
|
是 |
将回写到 Snowflake 数据库的关系属性。 |
| 关于下文写入配置的更多详细信息,请参考 写入文档。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
sourceLabel |
字符串 |
|
否 |
内存图中待回写关系起始节点的节点标签。 |
targetLabel |
字符串 |
|
否 |
内存图中待回写关系结束节点的节点标签。 |
outputTable |
字符串 |
|
否 |
关系写入的 Snowflake 数据库表。 |
关系类型 (relationshipType) |
字符串 |
|
是 |
将回写到 Snowflake 数据库的关系类型。 |
relationshipProperty |
字符串 |
|
是 |
将回写到 Snowflake 数据库的关系属性。 |
示例
在本节中,我们将展示在具体图上运行最大流算法的示例。旨在说明结果的样子,并为如何在实际环境中使用该算法提供指南。我们将使用一个包含少量节点并以特定模式连接的供应图来进行演示。示例图如下所示:
CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.LOCATIONS (NODEID VARCHAR, STORAGE FLOAT);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.LOCATIONS VALUES
('A', 3),
('B', 5),
('C', NULL),
('D', 50),
('E', 10),
('F', NULL);
CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.ROUTES (SOURCENODEID VARCHAR, TARGETNODEID VARCHAR, CAPACITY FLOAT);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.ROUTES VALUES
('A', 'F', 10),
('A', 'B', 3),
('A', 'E', 7),
('B', 'C', 1),
('C', 'D', 4),
('C', 'E', 6),
('F', 'D', 3);
该图存储了一组位置以及连接它们的路线。
运行作业
要运行查询,需要为应用程序、您的消费者角色和您的环境设置必要的权限。请参阅 入门 页面以了解更多信息。
我们还假设应用程序名称为默认的 Neo4j_Graph_Analytics。如果您在安装过程中选择了不同的应用程序名称,请将其替换为该名称。
CALL Neo4j_Graph_Analytics.graph.maxflow('CPU_X64_XS', {
'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
'project': {
'nodeTables': [ 'LOCATIONS' ],
'relationshipTables': {
'ROUTES': {
'sourceTable': 'LOCATIONS',
'targetTable': 'LOCATIONS'
}
}
},
'compute': {
'sourceNodesTable': 'LOCATIONS', 'sourceNodes': 'A',
'targetNodesTable': 'LOCATIONS', 'targetNodes': 'D'
},
'write': [{
'sourceLabel': 'LOCATIONS',
'targetLabel': 'LOCATIONS',
'outputTable': 'FLOWS'
}]
});
| JOB_ID | JOB_STATUS | JOB_START | JOB_END | JOB_RESULT |
|---|---|---|---|---|
job_cec5b6b71a2d4d8dad94f4a553422d69 |
SUCCESS |
2026-01-15 12:58:36 |
2026-01-15 12:58:44 |
{
"maxflow_1": {
"computeMillis": 75,
"configuration": {
"concurrency": 6,
"resultRelationshipType":"FLOW_RELATIONSHIP",
"resultProperty":"flow",
"nodeLabels": [
"*"
],
"relationshipTypes": [
"*"
],
"capacityProperty":"CAPACITY",
"sourceNode": "A",
"sourceNodesTable": "EXAMPLE_DB.DATA_SCHEMA.LOCATIONS",
"targetNodes": "D",
"targetNodesTable": "EXAMPLE_DB.DATA_SCHEMA.LOCATIONS",
"totalFlow":4.0,
}
},
"project_1": {
"graphName": "snowgraph",
"nodeCount": 6,
"nodeLabels": ...,
"nodeMillis": 270,
"relationshipCount": 7,
"relationshipMillis": 153,
"relationshipTypes": ...,
"totalMillis": 423
},
"write_relationship_type_1": {
"outputTable": "EXAMPLE_DB.DATA_SCHEMA.FLOWS",
"relationshipProperty": "flow",
"relationshipType": "FLOW_RELATIONSHIP",
"rowsWritten": 5,
"writeMillis": 1303
}
} |
返回的结果包含有关作业执行和结果分布的信息。我们可以这样查询它:
SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.FLOWS;
| SOURCENODEID | TARGETNODEID | FLOW |
|---|---|---|
A |
B |
1.0 |
A |
F |
3.0 |
B |
C |
1.0 |
C |
D |
1.0 |
F |
D |
3.0 |
使用节点容量约束
如果对特定节点的输出/输入量有限制,可以使用 nodeCapacityProperty 参数属性进行建模。例如,源设施可能对它们能生产的产品数量有限制,同样,目标设施也可能对它们能存储的产品数量有限制。在下面的示例中,我们将 "constraint" 节点属性作为 nodeCapacityProperty 参数的值传入,以模拟这些额外的需求。
CALL Neo4j_Graph_Analytics.graph.maxflow('CPU_X64_XS', {
'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
'project': {
'nodeTables': [ 'LOCATIONS' ],
'relationshipTables': {
'ROUTES': {
'sourceTable': 'LOCATIONS',
'targetTable': 'LOCATIONS'
}
}
},
'compute': {
'sourceNodesTable': 'LOCATIONS', 'sourceNodes': 'A',
'targetNodesTable': 'LOCATIONS', 'targetNodes': 'D'
'nodeCapacityProperty': 'STORAGE'
},
'write': [{
'sourceLabel': 'LOCATIONS',
'targetLabel': 'LOCATIONS',
'outputTable': 'RESTRICTED_FLOWS'
}]
});
| JOB_ID | JOB_STATUS | JOB_START | JOB_END | JOB_RESULT |
|---|---|---|---|---|
job_fyi5b6b81a2d4d8dad94f4a553433d69 |
SUCCESS |
2026-01-15 13:04:28 |
2026-01-15 13:04:36 |
{
"maxflow_1": {
"computeMillis": 68,
"configuration": {
"concurrency": 6,
"resultRelationshipType":"FLOW_RELATIONSHIP",
"resultProperty":"flow",
"nodeLabels": [
"*"
],
"relationshipTypes": [
"*"
],
"capacityProperty":"CAPACITY",
"nodeCapacityProperty":"STORAGE",
"sourceNode": "A",
"sourceNodesTable": "EXAMPLE_DB.DATA_SCHEMA.LOCATIONS",
"targetNodes": "D",
"targetNodesTable": "EXAMPLE_DB.DATA_SCHEMA.LOCATIONS",
"totalFlow":3.0,
}
},
"project_1": {
"graphName": "snowgraph",
"nodeCount": 6,
"nodeLabels": ...,
"nodeMillis": 274,
"relationshipCount": 7,
"relationshipMillis": 152,
"relationshipTypes": ...,
"totalMillis": 449
},
"write_relationship_type_1": {
"outputTable": "EXAMPLE_DB.DATA_SCHEMA.RESTRICTED_FLOWS",
"relationshipProperty": "flow",
"relationshipType": "FLOW_RELATIONSHIP",
"rowsWritten": 5,
"writeMillis": 1319
}
} |