度中心性

简介

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

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

它可以应用于异构图,但算法不会根据每种关系类型计算度中心性。相反,它将把图视为同构图,正如算法特性所表明的那样。

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

用例

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

语法

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

运行度中心性。
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

字符串

不适用

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

configuration

映射

{}

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

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

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

nodeTables

节点表列表。

relationshipTables

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

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

mutateProperty

字符串

'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 STRING);
INSERT INTO EXAMPLE_DB.DATA_SCHEMA.USERS VALUES
  ('Alice'),
  ('Bridget'),
  ('Charles'),
  ('Doug'),
  ('Mark'),
  ('Michael');

CREATE OR REPLACE TABLE EXAMPLE_DB.DATA_SCHEMA.FOLLOWS (SOURCENODEID STRING, TARGETNODEID STRING, SCORE DOUBLE);
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。如果您在安装过程中选择了不同的应用程序名称,请将其替换。

运行任务

运行度中心性任务涉及三个步骤:项目、计算和写入。

以下将运行一个度中心性任务:
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_START JOB_END JOB_RESULT

job_fbf4a243f3ed46c2895f5d1673911a4b

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,
       "jobId": "c70c50fd-6cb1-4c43-b92a-1ce283073aac",
       "logProgress": true,
       "mutateProperty": "degree",
       "nodeLabels": [
         "*"
       ],
       "orientation": "NATURAL",
       "relationshipTypes": [
         "*"
       ],
       "relationshipWeightProperty": "SCORE",
       "sudo": false
     },
     "mutateMillis": 2,
     "nodePropertiesWritten": 6,
     "postProcessingMillis": 75,
     "preProcessingMillis": 10
   },
   "project_1": {
     "graphName": "snowgraph",
     "nodeCount": 6,
     "nodeMillis": 334,
     "relationshipCount": 8,
     "relationshipMillis": 633,
     "totalMillis": 967
   },
   "write_node_property_1": {
     "exportMillis": 2325,
     "nodeLabel": "USERS",
     "nodeProperty": "degree",
     "outputTable": "EXAMPLE_DB.DATA_SCHEMA.USERS_CENTRALITY",
     "propertiesExported": 6
   }
 }

返回的结果包含任务执行和结果分发的信息。此外,七个节点中的每个节点的中心性分数都已回写到 Snowflake 数据库。我们可以这样查询:

SELECT * FROM EXAMPLE_DB.DATA_SCHEMA.USERS_CENTRALITY;

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

表 6. 结果
节点ID 分数

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. 结果
节点ID 分数

Alice

0.0

Bridget

1.0

Charles

1.0

Doug

5.0

Mark

0.0

Michael

1.0

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

© . All rights reserved.