度中心性 (Degree Centrality)

简介

度中心性算法可用于查找图中的热门节点。度中心性衡量的是节点的入度、出度(或两者之和),这可以通过关系投影的方向来定义。如果投影包含有向关系,则仅计算节点的出度。有关关系方向如何影响算法结果的更多信息,请参阅设置方向一节。

该算法可应用于加权或无权图。在加权情况下,算法会计算图中每个节点的所有相邻关系的正权重之和。非正权重将被忽略。

该算法可以应用于异构图,但它不会按关系类型计算度中心性。相反,正如算法特征所示,它会将图视为同构图。

有关此算法的更多信息,请参阅

用例

度中心性算法已被证明在许多不同的应用中非常有用。例如:

语法

本节涵盖执行度中心性算法所使用的语法。

运行度中心性。
CALL Neo4j_Graph_Analytics.graph.degree(
  'CPU_X64_XS',                    (1)
  {
    ['defaultTablePrefix': '...',] (2)
    'project': {...},              (3)
    'compute': {...},              (4)
    'write':   {...}               (5)
  }
);
1 计算池选择器。
2 表引用的可选前缀。
3 项目配置。
4 计算配置。
5 写入配置。
表 1. 参数
名称 类型 默认 可选 描述

computePoolSelector

字符串

不适用

用于运行度中心性作业的计算池选择器。

配置

Map

{}

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

配置映射由以下三个条目组成。

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

nodeTables

节点表列表。

relationshipTables

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

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

resultProperty

字符串

'degree'

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

relationshipWeightProperty

字符串

null

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

方向 (orientation)

字符串

'NATURAL'

关系的方向。可以是 'NATURAL'(自然)、'REVERSE'(反向)或 'UNDIRECTED'(无向)。

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

nodeProperty

字符串

'degree'

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

示例

在本节中,我们将展示在具体图上运行度中心性算法的示例。目的是说明结果的样子,并为如何在实际环境中使用该算法提供指南。我们将在一个由少量节点按特定模式连接而成的小型社交网络图上进行演示。示例图如下所示

Visualization of the example graph
以下 SQL 语句将为我们的示例图创建节点和关系数据
CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.USERS (NODEID VARCHAR);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.USERS VALUES
  ('Alice'),
  ('Bridget'),
  ('Charles'),
  ('Doug'),
  ('Mark'),
  ('Michael');

CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.FOLLOWS (SOURCENODEID VARCHAR, TARGETNODEID VARCHAR, SCORE FLOAT);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.FOLLOWS VALUES
  ('Alice', 'Doug', 1.0),
  ('Alice', 'Bridget', -2.0),
  ('Alice', 'Charles', 5.0),
  ('Mark', 'Doug', 1.5),
  ('Mark', 'Michael', 4.5),
  ('Bridget', 'Doug', 1.5),
  ('Charles', 'Doug', 2.0),
  ('Michael', 'Doug', 1.5);

在 Snowflake 中拥有节点和关系表后,我们现在可以将其作为算法作业的一部分进行投影。在以下示例中,我们将演示如何在图上使用度中心性算法。

要运行本节中的查询,需要对应用程序、您的消费者角色和您的环境进行必要的授权设置。请参阅入门页面了解更多信息。

我们还假设应用程序名称为默认的 Neo4j_Graph_Analytics。如果您在安装过程中选择了不同的应用程序名称,请将其替换为该名称。

运行作业

运行度中心性作业包含三个步骤:投影 (Project)、计算 (Compute) 和写入 (Write)。

以下代码将运行度中心性作业
CALL Neo4j_Graph_Analytics.graph.degree('CPU_X64_XS', {
    'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
    'project': {
        'nodeTables': [ 'USERS' ],
        'relationshipTables': {
            'FOLLOWS': {
                'sourceTable': 'USERS',
                'targetTable': 'USERS'
            }
        }
    },
    'compute': {
        'relationshipWeightProperty': 'SCORE'
    },
    'write': [{
        'nodeLabel': 'USERS',
        'outputTable': 'USERS_CENTRALITY'
    }]
});
表 5. 结果
JOB_ID JOB_STATUS JOB_START JOB_END JOB_RESULT

job_fbf4a243f3ed46c2895f5d1673911a4b

SUCCESS

2025-04-29 11:41:43.604000

2025-04-29 11:41:50.077000

 {
   "degree_1": {
     "centralityDistribution": {
       "max": 6.000030517578124,
       "mean": 2.8333396911621094,
       "min": 0,
       "p50": 1.5,
       "p75": 6.000022888183594,
       "p90": 6.000022888183594,
       "p95": 6.000022888183594,
       "p99": 6.000022888183594,
       "p999": 6.000022888183594
     },
     "computeMillis": 14,
     "configuration": {
       "concurrency": 2,
       "resultProperty": "degree",
       "nodeLabels": [
         "*"
       ],
       "orientation": "NATURAL",
       "relationshipTypes": [
         "*"
       ],
       "relationshipWeightProperty": "SCORE",
     }
   },
   "project_1": {
     "graphName": "snowgraph",
     "nodeCount": 6,
     "nodeLabels": ...,
     "nodeMillis": 334,
     "relationshipCount": 8,
     "relationshipMillis": 633,
     "relationshipTypes": ...,
     "totalMillis": 967
   },
   "write_node_property_1": {
     "nodeLabel": "USERS",
     "nodeProperty": "degree",
     "outputTable": "EXAMPLE_DB.DATA_SCHEMA.USERS_CENTRALITY",
     "rowsWritten": 6,
     "writeMillis": 2325
   }
 }

返回的结果包含有关作业执行和结果分布的信息。此外,七个节点中每个节点的中心性分数已被写回 Snowflake 数据库。我们可以像这样查询它

SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.USERS_CENTRALITY;

这显示了存储在数据库中的计算结果

表 6. 结果
NODEID SCORE

Alice

6.0

Bridget

1.5

Charles

2.0

Doug

0.0

Mark

6.0

Michael

1.5

在这里我们可以看到 AliceMark 节点的度中心性最高,这意味着这些节点发出的关系的总权重最高。

设置方向

默认情况下,节点中心性使用 NATURAL 方向来计算度数。对于某些用例,分析不同的方向是有意义的,例如,如果我们想找出有多少用户关注了另一个用户。为了改变方向,我们可以使用 orientation 配置键。支持三个值:

  • NATURAL(默认)对应于计算每个节点的出度。

  • REVERSE 对应于计算每个节点的入度。

  • UNDIRECTED 计算并汇总每个节点的出度和入度。

以下代码将以反向运行算法
CALL Neo4j_Graph_Analytics.graph.degree('CPU_X64_XS', {
    'defaultTablePrefix': 'EXAMPLE_DB.DATA_SCHEMA',
    'project': {
        'nodeTables': [ 'USERS' ],
        'relationshipTables': {
            'FOLLOWS': {
                'sourceTable': 'USERS',
                'targetTable': 'USERS'
            }
        }
    },
    'compute': {
        'orientation': 'REVERSE'
    },
    'write': [{
        'nodeLabel': 'USERS',
        'outputTable': 'USERS_CENTRALITY_REVERSE'
    }]
});
SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.USERS_CENTRALITY_REVERSE;
表 7. 结果
NODEID SCORE

Alice

0.0

Bridget

1.0

Charles

1.0

Doug

5.0

Mark

0.0

Michael

1.0

在这里我们可以看到 Doug 节点的入度最高,这意味着它被其他五个用户关注。Alice 节点的入度最低,这意味着它没有被任何其他用户关注。