弱连接组件
简介
弱连接组件 (WCC) 算法用于在有向图和无向图中查找连接的节点集合。如果两个节点之间存在路径,则它们是连接的。所有相互连接的节点集合形成一个组件。与强连接组件 (SCC) 不同,WCC 不考虑两个节点之间路径上关系的方向。例如,在有向图 (a)→(b)
中,即使没有有向关系 (b)→(a)
,a
和 b
也会在同一个组件中。
WCC 通常在分析初期用于理解图的结构。通过 WCC 理解图结构,可以实现在已识别的集群上独立运行其他算法。
该算法的实现基于以下论文
语法
本节介绍执行弱连接组件算法所使用的语法。
CALL Neo4j_Graph_Analytics.graph.wcc(
'CPU_X64_XS', (1)
{
['defaultTablePrefix': '...',] (2)
'project': {...}, (3)
'compute': {...}, (4)
'write': {...} (5)
}
);
1 | 计算池选择器。 |
2 | 表引用的可选前缀。 |
3 | 项目配置。 |
4 | 计算配置。 |
5 | 写入配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
computePoolSelector |
字符串 |
|
否 |
用于运行 WCC 作业的计算池选择器。 |
configuration |
映射 |
|
否 |
图项目、算法计算和结果回写的配置。 |
配置映射包含以下三个条目。
有关以下项目配置的更多详细信息,请参阅项目文档。 |
名称 | 类型 |
---|---|
nodeTables |
节点表列表。 |
relationshipTables |
关系类型到关系表的映射。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
mutateProperty |
字符串 |
|
是 |
将写回 Snowflake 数据库的节点属性。 |
relationshipWeightProperty |
字符串 |
|
是 |
用作权重的关系属性名称。如果未指定,算法将运行无权重计算。 |
seedProperty |
字符串 |
|
是 |
用于设置节点的初始组件。属性值必须是数字。 |
threshold |
浮点数 |
|
是 |
计算中考虑关系的权重阈值。 |
consecutiveIds |
布尔值 |
|
是 |
标志,用于决定组件标识符是否映射到连续的 ID 空间(需要额外内存)。 |
minComponentSize |
整数 |
|
是 |
只返回大小大于或等于给定值的社区内部的节点。 |
有关以下写入配置的更多详细信息,请参阅写入文档。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
nodeLabel |
字符串 |
|
否 |
内存中图的节点标签,用于写入节点属性。 |
nodeProperty |
字符串 |
|
是 |
将写回 Snowflake 数据库的节点属性。 |
outputTable |
字符串 |
|
否 |
Snowflake 数据库中用于写入节点属性的表。 |
示例
在本节中,我们将展示在具体图上运行弱连接组件算法的示例。目的是说明结果的外观,并提供在实际设置中如何使用该算法的指南。我们将在一个小型的用户网络图上进行演示,该图包含少量按特定模式连接的节点。示例图如下所示
CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.USERS (NODEID STRING);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.USERS VALUES
('Alice'),
('Bridget'),
('Charles'),
('Doug'),
('Mark'),
('Michael');
CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.LINKS (SOURCENODEID STRING, TARGETNODEID STRING, WEIGHT FLOAT);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.LINKS VALUES
('Alice', 'Bridget', 0.5),
('Alice', 'Charles', 4),
('Mark', 'Doug', 1.1),
('Mark', 'Michael', 2);
此图有两个连接组件,每个组件包含三个节点。连接每个组件中节点的关系都有一个 weight
属性,它决定了关系的强度。
在以下示例中,我们将演示在此图上使用弱连接组件算法。
运行作业
运行 WCC 作业包括三个步骤:项目、计算和写入。
要运行查询,需要为应用程序、您的消费者角色和您的环境设置必要的授权。有关更多信息,请参阅开始入门页面。
我们还假设应用程序名称为默认的 Neo4j_Graph_Analytics。如果您在安装过程中选择了不同的应用程序名称,请将其替换为该名称。
CALL Neo4j_Graph_Analytics.graph.wcc('CPU_X64_XS', {
'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
'project': {
'nodeTables': ['USERS'],
'relationshipTables': {
'LINKS': {
'sourceTable': 'USERS',
'targetTable': 'USERS'
}
}
},
'compute': {},
'write': [
{
'nodeLabel': 'USERS',
'outputTable': 'USERS_COMPONENTS'
}
]
});
作业 ID | 作业开始 | 作业结束 | 作业结果 |
---|---|---|---|
job_492026bbeaa6422eb4502a18def04cd6 |
2025-04-30 13:53:53.702000 |
2025-04-30 13:54:00.716000 |
{ "project_1": { "graphName": "snowgraph", "nodeCount": 6, "nodeMillis": 212, "relationshipCount": 4, "relationshipMillis": 519, "totalMillis": 731 }, "wcc_1": { "componentCount": 2, "componentDistribution": { "max": 3, "mean": 3, "min": 3, "p1": 3, "p10": 3, "p25": 3, "p5": 3, "p50": 3, "p75": 3, "p90": 3, "p95": 3, "p99": 3, "p999": 3 }, "computeMillis": 9, "configuration": { "concurrency": 2, "consecutiveIds": false, "jobId": "582c3c87-66ed-421a-b800-74e6c15d9734", "logProgress": true, "mutateProperty": "component", "nodeLabels": [ "*" ], "relationshipTypes": [ "*" ], "seedProperty": null, "sudo": false, "threshold": 0 }, "mutateMillis": 2, "nodePropertiesWritten": 6, "postProcessingMillis": 20, "preProcessingMillis": 6 }, "write_node_property_1": { "exportMillis": 2532, "nodeLabel": "USERS", "nodeProperty": "component", "outputTable": "EXAMPLE_DB.DATA_SCHEMA.USERS_COMPONENTS", "propertiesExported": 6 } } |
返回的结果包含作业执行和结果分布的信息。此外,每个节点的组件 ID 已写回 Snowflake 数据库。我们可以这样查询它
SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.USERS_COMPONENTS;
节点 ID | 组件 |
---|---|
Alice |
0 |
Bridget |
0 |
Charles |
0 |
Doug |
3 |
Mark |
3 |
Michael |
3 |
结果显示算法识别出两个组件。这可以在示例图中进行验证。
实际的组件 ID 可能会有所不同,因为内存图中投影节点的顺序不确定。在这种情况下,获得相反的解决方案也同样合理,例如当我们的社区 |