度中心性 (Degree Centrality)
术语表
- 有向
-
有向特征。该算法在有向图上定义良好。
- 有向
-
有向特征。该算法忽略图的方向。
- 有向
-
有向特征。该算法不能在有向图上运行。
- 无向
-
无向特征。该算法在无向图上定义良好。
- 无向
-
无向特征。该算法忽略图的无向性。
- 异构节点
-
异构节点完全支持。该算法有能力区分不同类型的节点。
- 异构节点
-
异构节点允许。该算法平等对待所有选定的节点,无论其标签如何。
- 异构关系
-
异构关系完全支持。该算法有能力区分不同类型的关系。
- 异构关系
-
异构关系允许。该算法平等对待所有选定的关系,无论其类型如何。
- 加权关系
-
加权特征。该算法支持将关系属性用作权重,通过 relationshipWeightProperty 配置参数指定。
- 加权关系
-
加权特征。该算法将每个关系视为同等重要,忽略任何关系权重值。
- 节点属性
-
节点属性特征。该算法使用节点属性。
简介
用例
度中心性算法已被证明在许多不同的应用中非常有用。例如:
-
度中心性是确定社交网络中最重要人物的重要组成部分。例如,在 BrandWatch 的2017年 Twitter 上最具影响力的男女中,每个类别的前 5 名人物各自拥有超过 4000 万的关注者,这远高于平均度数。
-
加权度中心性已被用于帮助将欺诈者与在线拍卖的合法用户区分开来。欺诈者的加权中心性显著更高,因为他们倾向于相互勾结以人为地提高物品价格。阅读更多内容:用于在线拍卖欺诈检测的两步图基半监督学习
语法
本节介绍用于在各种执行模式下执行度中心性算法的语法。我们描述的是命名图(named graph)变体的语法。要了解有关通用语法变体的更多信息,请参阅语法概述。
CALL gds.degree.stream(
graphName: String,
configuration: Map
) YIELD
nodeId: Integer,
score: Float
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
方向 (orientation) |
字符串 |
|
是 |
用于计算节点度的方向。支持的方向包括 |
字符串 |
|
是 |
用于加权度计算的关系属性名称。如果未指定,算法将按非加权模式运行。 |
|
| 名称 | 类型 | 描述 |
|---|---|---|
nodeId |
整数 |
节点 ID。 |
score |
浮点数 |
度中心性分数。 |
CALL gds.degree.stats(
graphName: String,
configuration: Map
) YIELD
centralityDistribution: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
方向 (orientation) |
字符串 |
|
是 |
用于计算节点度的方向。支持的方向包括 |
字符串 |
|
是 |
用于加权度计算的关系属性名称。如果未指定,算法将按非加权模式运行。 |
|
| 名称 | 类型 | 描述 |
|---|---|---|
centralityDistribution |
Map |
包含中心性分数的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
预处理图的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
postProcessingMillis |
整数 |
计算统计数据的毫秒数。 |
配置 |
Map |
运行算法所使用的配置。 |
CALL gds.degree.mutate(
graphName: String,
configuration: Map
) YIELD
centralityDistribution: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
mutateMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
mutateProperty |
字符串 |
|
否 |
GDS 图中写入度中心性的节点属性。 |
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
方向 (orientation) |
字符串 |
|
是 |
用于计算节点度的方向。支持的方向包括 |
字符串 |
|
是 |
用于加权度计算的关系属性名称。如果未指定,算法将按非加权模式运行。 |
| 名称 | 类型 | 描述 |
|---|---|---|
centralityDistribution |
Map |
包含中心性分数的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
预处理图的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
postProcessingMillis |
整数 |
计算统计数据的毫秒数。 |
mutateMillis |
整数 |
向投影图添加属性的毫秒数。 |
nodePropertiesWritten |
整数 |
添加到投影图中的属性数量。 |
配置 |
Map |
运行算法所使用的配置。 |
CALL gds.degree.write(
graphName: String,
configuration: Map
) YIELD
centralityDistribution: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
writeMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
|
是 |
如果禁用,进度百分比将不会被记录。 |
|
整数 |
|
是 |
用于将结果写入 Neo4j 的并发线程数。 |
|
字符串 |
|
否 |
Neo4j 数据库中写入度中心性的节点属性。 |
|
方向 (orientation) |
字符串 |
|
是 |
用于计算节点度的方向。支持的方向包括 |
字符串 |
|
是 |
用于加权度计算的关系属性名称。如果未指定,算法将按非加权模式运行。 |
|
| 名称 | 类型 | 描述 |
|---|---|---|
centralityDistribution |
Map |
包含中心性分数的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
预处理图的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
postProcessingMillis |
整数 |
计算统计数据的毫秒数。 |
writeMillis |
整数 |
将结果数据写回的毫秒数。 |
nodePropertiesWritten |
整数 |
写入 Neo4j 的属性数量。 |
配置 |
Map |
用于运行算法的配置。 |
示例
|
以下所有示例应在空数据库中运行。 这些示例将 Cypher 投影作为规范。原生投影将在未来版本中弃用。 |
在本节中,我们将展示在具体图上运行度中心性算法的示例。目的是说明结果的样子,并为如何在实际环境中使用该算法提供指南。我们将在一个由少数节点以特定模式连接而成的小型社交网络图中进行演示。示例图如下所示:
CREATE
(alice:User {name: 'Alice'}),
(bridget:User {name: 'Bridget'}),
(charles:User {name: 'Charles'}),
(doug:User {name: 'Doug'}),
(mark:User {name: 'Mark'}),
(michael:User {name: 'Michael'}),
(alice)-[:FOLLOWS {score: 1}]->(doug),
(alice)-[:FOLLOWS {score: -2}]->(bridget),
(alice)-[:FOLLOWS {score: 5}]->(charles),
(mark)-[:FOLLOWS {score: 1.5}]->(doug),
(mark)-[:FOLLOWS {score: 4.5}]->(michael),
(bridget)-[:FOLLOWS {score: 1.5}]->(doug),
(charles)-[:FOLLOWS {score: 2}]->(doug),
(michael)-[:FOLLOWS {score: 1.5}]->(doug)
在 Neo4j 中拥有图后,我们现在可以将其投影到图目录中,以便为算法执行做准备。我们使用针对 User 节点和 FOLLOWS 关系的 Cypher 投影来完成此操作。
MATCH (source:User)-[r:FOLLOWS]->(target:User)
RETURN gds.graph.project(
'myGraph',
target,
source,
{ relationshipProperties: r { .score } }
)
对于有向关系,度中心性算法计算每个节点的出度。为了检索拥有最多关注者的人,在以下示例中,图以 REVERSE 方向进行投影。这将通过在该图上使用度中心性算法进行演示。
内存估算
首先,我们将使用 estimate 过程估算运行算法的成本。这可以在任何执行模式下完成。在这个例子中我们将使用 write 模式。估算算法有助于了解在您的图上运行该算法将产生的内存影响。当您随后在其中一种执行模式下真正运行算法时,系统将执行一次估算。如果估算显示执行超出其内存限制的可能性非常高,则禁止执行。要阅读更多关于此的内容,请参阅 自动估算和执行阻塞。
有关 estimate 的更多详细信息,请参阅 内存估算。
CALL gds.degree.write.estimate('myGraph', { writeProperty: 'degree' })
YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory
| nodeCount | relationshipCount | bytesMin | bytesMax | requiredMemory |
|---|---|---|---|---|
6 |
8 |
48 |
48 |
"48 字节" |
流 (Stream)
在 stream 执行模式下,算法会返回每个节点的度中心性。这使我们能够直接查看结果,或在 Cypher 中进行后处理,而不会产生任何副作用。例如,我们可以对结果进行排序,以找到度中心性最高的节点。
有关 stream 模式的更多详细信息,请参阅 流式读取。
stream 模式运行该算法:CALL gds.degree.stream('myGraph')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score AS followers
ORDER BY followers DESC, name DESC
| 名称 (name) | followers (关注者) |
|---|---|
“Doug” |
5.0 |
“Michael” |
1.0 |
“Charles” |
1.0 |
“Bridget” |
1.0 |
“Mark” |
0.0 |
"Alice" |
0.0 |
我们可以看到 Doug 是我们虚构的社交网络图中目前最受欢迎的用户,拥有 5 个关注者——所有其他用户都关注他,但他不关注任何人。在真实的社交网络中,名人的关注者数量非常高,但往往只关注极少数人。因此,我们可以认为 Doug 是个名人!
统计 (Stats)
在 stats 执行模式下,算法返回包含算法结果摘要的单行数据。此执行模式没有任何副作用。它通过检查 computeMillis 返回项来评估算法性能非常有用。在下面的示例中,我们将省略返回时间。过程的完整签名可以在语法章节中找到。
有关 stats 模式的更多详细信息,请参阅 统计。
stats 模式运行该算法:CALL gds.degree.stats('myGraph')
YIELD centralityDistribution
RETURN centralityDistribution.min AS minimumScore, centralityDistribution.mean AS meanScore
| minimumScore | meanScore |
|---|---|
0.0 |
1.3333358764648438 |
将其与我们在流示例中看到的结果进行比较,我们可以从表中找到最小值和平均值。
修改 (Mutate)
mutate 执行模式扩展了 stats 模式,具有一个重要的副作用:使用包含该节点度中心性的新节点属性来更新命名图。新属性的名称使用强制配置参数 mutateProperty 指定。结果是类似于 stats 的单行摘要,但包含一些额外的指标。当结合使用多种算法时,mutate 模式特别有用。
有关 mutate 模式的更多详细信息,请参阅 变更。
mutate 模式运行该算法:CALL gds.degree.mutate('myGraph', { mutateProperty: 'degree' })
YIELD centralityDistribution, nodePropertiesWritten
RETURN centralityDistribution.min AS minimumScore, centralityDistribution.mean AS meanScore, nodePropertiesWritten
| minimumScore | meanScore | nodePropertiesWritten |
|---|---|---|
0.0 |
1.3333358764648438 |
6 |
返回的结果与 stats 示例中的相同。此外,图“myGraph”现在拥有一个节点属性 degree,其中存储了每个节点的度中心性分数。要了解如何检查内存中图的新架构,请参阅列出目录中的图。
写入 (Write)
write 执行模式扩展了 stats 模式,具有一个重要的副作用:将每个节点的度中心性作为属性写入 Neo4j 数据库。新属性的名称使用强制配置参数 writeProperty 指定。结果是类似于 stats 的单行摘要,但包含一些额外的指标。write 模式可以直接将结果持久化到数据库中。
有关 write 模式的更多详细信息,请参阅 写入。
write 模式运行该算法:CALL gds.degree.write('myGraph', { writeProperty: 'degree' })
YIELD centralityDistribution, nodePropertiesWritten
RETURN centralityDistribution.min AS minimumScore, centralityDistribution.mean AS meanScore, nodePropertiesWritten
| minimumScore | meanScore | nodePropertiesWritten |
|---|---|---|
0.0 |
1.3333358764648438 |
6 |
返回的结果与 stats 示例中的相同。此外,七个节点中的每一个现在在 Neo4j 数据库中都有一个新的属性 degree,其中包含该节点的度中心性分数。
加权度中心性示例
本示例将说明加权度中心性算法。该算法是度中心性算法的一个变体,用于衡量入度和出度的正权重之和。
stream 模式运行算法,显示哪些用户拥有最高的加权度中心性:CALL gds.degree.stream(
'myGraph',
{ relationshipWeightProperty: 'score' }
)
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score AS weightedFollowers
ORDER BY weightedFollowers DESC, name DESC
| 名称 (name) | weightedFollowers (加权关注者) |
|---|---|
“Doug” |
7.5 |
“Charles” |
5.0 |
“Michael” |
4.5 |
“Mark” |
0.0 |
“Bridget” |
0.0 |
"Alice" |
0.0 |
Doug 仍然是我们最受欢迎的用户,但与下一个人之间的差距并没有那么大。Charles 和 Michael 都只有一个关注者,但这些关系具有很高的关系权重。请注意,尽管 Bridget 有来自 Alice 的连接,但她的加权分数为 0.0。这是因为 Bridget 和 Alice 之间的 score 属性值为负,算法会忽略该值。
设置方向
默认情况下,节点中心性使用 NATURAL 方向来计算度数。对于某些用例,分析不同的方向是有意义的,例如,如果我们想找出有多少用户关注了另一个用户。为了改变方向,我们可以使用 orientation 配置键。支持三个值:
-
NATURAL(默认)对应于计算每个节点的出度。 -
REVERSE对应于计算每个节点的入度。 -
UNDIRECTED计算并汇总每个节点的出度和入度。
stream 模式运行算法,显示哪些用户使用关系的反向方向拥有最高的入度中心性:CALL gds.degree.stream(
'myGraph',
{ orientation: 'REVERSE' }
)
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score AS followees
ORDER BY followees DESC, name DESC
| 名称 (name) | followees (被关注者) |
|---|---|
"Alice" |
3.0 |
“Mark” |
2.0 |
“Michael” |
1.0 |
“Charles” |
1.0 |
“Bridget” |
1.0 |
“Doug” |
0.0 |
该示例表明,在观察反向方向时,Alice 在网络中的中心地位比 Doug 更高。