度中心性
简介
度中心性算法可用于查找图中的热门节点。度中心性衡量一个节点传入或传出(或两者兼有)关系的數量,这可以通过关系投影的方向来定义。如果投影包含有向关系,则仅计算节点的传出关系(出度)。有关关系方向如何影响算法结果的更多信息,请参阅设置方向部分。
它既可以应用于加权图,也可以应用于无权图。在加权情况下,算法计算图中每个节点的所有相邻关系的权重之和。非正权重将被忽略。
它可以应用于异构图,但算法不会根据每种关系类型计算度中心性。相反,它将把图视为同构图,正如算法特性所表明的那样。
有关此算法的更多信息,请参阅
用例
度中心性算法已被证明在许多不同应用中非常有用。例如:
-
度中心性是任何试图确定社交网络中最重要的个体的重要组成部分。例如,在 BrandWatch 的《2017 年 Twitter 上最具影响力的男性和女性》中,每个类别的前 5 名人物各自拥有超过 4000 万粉丝,这远高于平均度数。
-
加权度中心性已被用于帮助区分在线拍卖中的欺诈者和合法用户。欺诈者的加权中心性显著更高,因为他们倾向于相互勾结以人为抬高物品价格。更多内容请参阅《用于在线拍卖欺诈检测的两步基于图的半监督学习》。
语法
本节介绍执行度中心性算法所使用的语法。
CALL Neo4j_Graph_Analytics.graph.degree(
'CPU_X64_XS', (1)
{
['defaultTablePrefix': '...',] (2)
'project': {...}, (3)
'compute': {...}, (4)
'write': {...} (5)
}
);
1 | 计算池选择器。 |
2 | 表引用的可选前缀。 |
3 | 项目配置。 |
4 | 计算配置。 |
5 | 写入配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
computePoolSelector |
字符串 |
|
否 |
用于运行度中心性任务的计算池选择器。 |
configuration |
映射 |
|
否 |
用于图项目、算法计算和结果回写的配置。 |
配置映射包含以下三个条目。
有关以下项目配置的更多详细信息,请参阅项目文档。 |
名称 | 类型 |
---|---|
nodeTables |
节点表列表。 |
relationshipTables |
关系类型到关系表的映射。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
mutateProperty |
字符串 |
|
是 |
将回写到 Snowflake 数据库的节点属性。 |
relationshipWeightProperty |
字符串 |
|
是 |
用作权重的关系属性名称。如果未指定,算法将运行无权重。 |
orientation |
字符串 |
|
是 |
关系的方向。可以是“NATURAL”、“REVERSE”或“UNDIRECTED”。 |
有关以下写入配置的更多详细信息,请参阅写入文档。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
nodeProperty |
字符串 |
|
是 |
将回写到 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.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'
}]
});
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;
这将显示存储在数据库中的计算结果:
节点ID | 分数 |
---|---|
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;
节点ID | 分数 |
---|---|
Alice |
0.0 |
Bridget |
1.0 |
Charles |
1.0 |
Doug |
5.0 |
Mark |
0.0 |
Michael |
1.0 |
这里我们可以看到 Doug
节点具有最高的入度,这意味着它被其他五个用户关注。Alice
节点具有最低的入度,这意味着它没有被任何其他用户关注。