弱连接组件

简介

弱连接组件 (WCC) 算法用于在有向图和无向图中查找连接的节点集合。如果两个节点之间存在路径,则它们是连接的。所有相互连接的节点集合形成一个组件。与强连接组件 (SCC) 不同,WCC 不考虑两个节点之间路径上关系的方向。例如,在有向图 (a)→(b) 中,即使没有有向关系 (b)→(a)ab 也会在同一个组件中。

WCC 通常在分析初期用于理解图的结构。通过 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 写入配置。
表 1. 参数
名称 类型 默认值 可选 描述

computePoolSelector

字符串

不适用

用于运行 WCC 作业的计算池选择器。

configuration

映射

{}

图项目、算法计算和结果回写的配置。

配置映射包含以下三个条目。

有关以下项目配置的更多详细信息,请参阅项目文档
表 2. 项目配置
名称 类型

nodeTables

节点表列表。

relationshipTables

关系类型到关系表的映射。

表 3. 计算配置
名称 类型 默认值 可选 描述

mutateProperty

字符串

'component'

将写回 Snowflake 数据库的节点属性。

relationshipWeightProperty

字符串

null

用作权重的关系属性名称。如果未指定,算法将运行无权重计算。

seedProperty

字符串

不适用

用于设置节点的初始组件。属性值必须是数字。

threshold

浮点数

null

计算中考虑关系的权重阈值。

consecutiveIds

布尔值

false

标志,用于决定组件标识符是否映射到连续的 ID 空间(需要额外内存)。

minComponentSize

整数

0

只返回大小大于或等于给定值的社区内部的节点。

有关以下写入配置的更多详细信息,请参阅写入文档
表 4. 写入配置
名称 类型 默认值 可选 描述

nodeLabel

字符串

不适用

内存中图的节点标签,用于写入节点属性。

nodeProperty

字符串

'component'

将写回 Snowflake 数据库的节点属性。

outputTable

字符串

不适用

Snowflake 数据库中用于写入节点属性的表。

示例

在本节中,我们将展示在具体图上运行弱连接组件算法的示例。目的是说明结果的外观,并提供在实际设置中如何使用该算法的指南。我们将在一个小型的用户网络图上进行演示,该图包含少量按特定模式连接的节点。示例图如下所示

Visualization of the example graph
以下 SQL 语句将在 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'
    }
  ]
});
表 5. 结果
作业 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;
表 6. 结果
节点 ID 组件

Alice

0

Bridget

0

Charles

0

Doug

3

Mark

3

Michael

3

结果显示算法识别出两个组件。这可以在示例图中进行验证。

实际的组件 ID 可能会有所不同,因为内存图中投影节点的顺序不确定。在这种情况下,获得相反的解决方案也同样合理,例如当我们的社区 0 节点被映射到社区 3 时,反之亦然。

© . All rights reserved.