度中心性 (Degree Centrality)
简介
度中心性算法可用于查找图中的热门节点。度中心性衡量的是节点的入度、出度(或两者之和),这可以通过关系投影的方向来定义。如果投影包含有向关系,则仅计算节点的出度。有关关系方向如何影响算法结果的更多信息,请参阅设置方向一节。
该算法可应用于加权或无权图。在加权情况下,算法会计算图中每个节点的所有相邻关系的正权重之和。非正权重将被忽略。
该算法可以应用于异构图,但它不会按关系类型计算度中心性。相反,正如算法特征所示,它会将图视为同构图。
有关此算法的更多信息,请参阅
用例
度中心性算法已被证明在许多不同的应用中非常有用。例如:
-
度中心性是确定社交网络中最重要人物的重要组成部分。例如,在 BrandWatch 的2017 年 Twitter 上最有影响力的男女榜单中,每个类别的前 5 名每人都有超过 4000 万粉丝,这远高于平均度数。
-
加权度中心性已被用于帮助区分在线拍卖中的欺诈者与合法用户。欺诈者的加权中心性显著更高,因为他们倾向于相互勾结以人为地提高物品价格。阅读更多内容请见用于在线拍卖欺诈检测的两步基于图的半监督学习 (Two Step graph-based semi-supervised Learning for Online Auction Fraud Detection)
语法
本节涵盖执行度中心性算法所使用的语法。
CALL Neo4j_Graph_Analytics.graph.degree(
'CPU_X64_XS', (1)
{
['defaultTablePrefix': '...',] (2)
'project': {...}, (3)
'compute': {...}, (4)
'write': {...} (5)
}
);
| 1 | 计算池选择器。 |
| 2 | 表引用的可选前缀。 |
| 3 | 项目配置。 |
| 4 | 计算配置。 |
| 5 | 写入配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
computePoolSelector |
字符串 |
|
否 |
用于运行度中心性作业的计算池选择器。 |
配置 |
Map |
|
否 |
用于图项目、算法计算和结果回写的配置。 |
配置映射由以下三个条目组成。
| 有关以下项目配置的更多详细信息,请参阅 项目文档。 |
| 名称 | 类型 |
|---|---|
nodeTables |
节点表列表。 |
relationshipTables |
关系类型到关系表的映射。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
resultProperty |
字符串 |
|
是 |
将回写到 Snowflake 数据库的节点属性。 |
relationshipWeightProperty |
字符串 |
|
是 |
用作权重的关系属性名称。如果未指定,算法将作为无权重运行。 |
方向 (orientation) |
字符串 |
|
是 |
关系的方向。可以是 'NATURAL'(自然)、'REVERSE'(反向)或 'UNDIRECTED'(无向)。 |
| 有关以下写入配置的更多详细信息,请参阅写入文档。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
nodeProperty |
字符串 |
|
是 |
将回写到 Snowflake 数据库的节点属性。 |
示例
在本节中,我们将展示在具体图上运行度中心性算法的示例。目的是说明结果的样子,并为如何在实际环境中使用该算法提供指南。我们将在一个由少量节点按特定模式连接而成的小型社交网络图上进行演示。示例图如下所示
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'
}]
});
| 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;
这显示了存储在数据库中的计算结果
| NODEID | SCORE |
|---|---|
Alice |
6.0 |
Bridget |
1.5 |
Charles |
2.0 |
Doug |
0.0 |
Mark |
6.0 |
Michael |
1.5 |
在这里我们可以看到 Alice 和 Mark 节点的度中心性最高,这意味着这些节点发出的关系的总权重最高。
设置方向
默认情况下,节点中心性使用 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;
| NODEID | SCORE |
|---|---|
Alice |
0.0 |
Bridget |
1.0 |
Charles |
1.0 |
Doug |
5.0 |
Mark |
0.0 |
Michael |
1.0 |
在这里我们可以看到 Doug 节点的入度最高,这意味着它被其他五个用户关注。Alice 节点的入度最低,这意味着它没有被任何其他用户关注。