度中心性 (Degree Centrality)

术语表

有向

有向特征。该算法在有向图上定义良好。

有向

有向特征。该算法忽略图的方向。

有向

有向特征。该算法不能在有向图上运行。

无向

无向特征。该算法在无向图上定义良好。

无向

无向特征。该算法忽略图的无向性。

异构节点

异构节点完全支持。该算法有能力区分不同类型的节点。

异构节点

异构节点允许。该算法平等对待所有选定的节点,无论其标签如何。

异构关系

异构关系完全支持。该算法有能力区分不同类型的关系。

异构关系

异构关系允许。该算法平等对待所有选定的关系,无论其类型如何。

加权关系

加权特征。该算法支持将关系属性用作权重,通过 relationshipWeightProperty 配置参数指定。

加权关系

加权特征。该算法将每个关系视为同等重要,忽略任何关系权重值。

节点属性

节点属性特征。该算法使用节点属性。

简介

度中心性(Degree Centrality)算法可用于查找图中的热门节点。度中心性衡量的是节点的入度、出度(或两者之和),具体取决于关系投影的方向。如果投影包含有向关系,则仅计算节点的出度。有关关系方向如何影响算法结果的更多信息,请参阅设置方向章节。有关关系方向的更多常规信息,请参阅关系投影语法章节。

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

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

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

用例

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

  • 度中心性是确定社交网络中最重要人物的重要组成部分。例如,在 BrandWatch 的2017年 Twitter 上最具影响力的男女中,每个类别的前 5 名人物各自拥有超过 4000 万的关注者,这远高于平均度数。

  • 加权度中心性已被用于帮助将欺诈者与在线拍卖的合法用户区分开来。欺诈者的加权中心性显著更高,因为他们倾向于相互勾结以人为地提高物品价格。阅读更多内容:用于在线拍卖欺诈检测的两步图基半监督学习

语法

本节介绍用于在各种执行模式下执行度中心性算法的语法。我们描述的是命名图(named graph)变体的语法。要了解有关通用语法变体的更多信息,请参阅语法概述

各模式下的度中心性语法
在命名图上以流模式(stream mode)运行度中心性。
CALL gds.degree.stream(
  graphName: String,
  configuration: Map
) YIELD
  nodeId: Integer,
  score: Float
表 1. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

存储在目录中的图的名称。

配置

Map

{}

算法特定配置和/或图过滤配置。

表 2. 配置
名称 类型 默认 可选 描述

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。

concurrency

整数

4 [1]

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

方向 (orientation)

字符串

NATURAL

用于计算节点度的方向。支持的方向包括 NATURALREVERSEUNDIRECTED

relationshipWeightProperty

字符串

null

用于加权度计算的关系属性名称。如果未指定,算法将按非加权模式运行。

1. 在 GDS 会话中,默认值为可用处理器的数量。

表 3. 结果
名称 类型 描述

nodeId

整数

节点 ID。

score

浮点数

度中心性分数。

在命名图上以统计模式(stats mode)运行度中心性。
CALL gds.degree.stats(
  graphName: String,
  configuration: Map
) YIELD
  centralityDistribution: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  configuration: Map
表 4. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

存储在目录中的图的名称。

配置

Map

{}

算法特定配置和/或图过滤配置。

表 5. 配置
名称 类型 默认 可选 描述

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。

concurrency

整数

4 [2]

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

方向 (orientation)

字符串

NATURAL

用于计算节点度的方向。支持的方向包括 NATURALREVERSEUNDIRECTED

relationshipWeightProperty

字符串

null

用于加权度计算的关系属性名称。如果未指定,算法将按非加权模式运行。

2. 在 GDS 会话中,默认值为可用处理器的数量。

表 6. 结果
名称 类型 描述

centralityDistribution

Map

包含中心性分数的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。

preProcessingMillis

整数

预处理图的毫秒数。

computeMillis

整数

运行算法的毫秒数。

postProcessingMillis

整数

计算统计数据的毫秒数。

配置

Map

运行算法所使用的配置。

在命名图上以修改模式(mutate mode)运行度中心性。
CALL gds.degree.mutate(
  graphName: String,
  configuration: Map
) YIELD
  centralityDistribution: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  mutateMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 7. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

存储在目录中的图的名称。

配置

Map

{}

算法特定配置和/或图过滤配置。

表 8. 配置
名称 类型 默认 可选 描述

mutateProperty

字符串

不适用

GDS 图中写入度中心性的节点属性。

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。

concurrency

整数

4

用于运行算法的并发线程数。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

方向 (orientation)

字符串

NATURAL

用于计算节点度的方向。支持的方向包括 NATURALREVERSEUNDIRECTED

relationshipWeightProperty

字符串

null

用于加权度计算的关系属性名称。如果未指定,算法将按非加权模式运行。

表 9. 结果
名称 类型 描述

centralityDistribution

Map

包含中心性分数的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。

preProcessingMillis

整数

预处理图的毫秒数。

computeMillis

整数

运行算法的毫秒数。

postProcessingMillis

整数

计算统计数据的毫秒数。

mutateMillis

整数

向投影图添加属性的毫秒数。

nodePropertiesWritten

整数

添加到投影图中的属性数量。

配置

Map

运行算法所使用的配置。

在命名图上以写入模式(write mode)运行度中心性。
CALL gds.degree.write(
  graphName: String,
  configuration: Map
) YIELD
  centralityDistribution: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  writeMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 10. 参数
名称 类型 默认 可选 描述

graphName

字符串

不适用

存储在目录中的图的名称。

配置

Map

{}

算法特定配置和/或图过滤配置。

表 11. 配置
名称 类型 默认 可选 描述

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。

concurrency

整数

4 [3]

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供一个 ID 以更轻松地跟踪算法的进度。

logProgress

布尔值

true

如果禁用,进度百分比将不会被记录。

writeConcurrency

整数

'concurrency' 的值

用于将结果写入 Neo4j 的并发线程数。

writeProperty

字符串

不适用

Neo4j 数据库中写入度中心性的节点属性。

方向 (orientation)

字符串

NATURAL

用于计算节点度的方向。支持的方向包括 NATURALREVERSEUNDIRECTED

relationshipWeightProperty

字符串

null

用于加权度计算的关系属性名称。如果未指定,算法将按非加权模式运行。

3. 在 GDS 会话中,默认值为可用处理器的数量。

表 12. 结果
名称 类型 描述

centralityDistribution

Map

包含中心性分数的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。

preProcessingMillis

整数

预处理图的毫秒数。

computeMillis

整数

运行算法的毫秒数。

postProcessingMillis

整数

计算统计数据的毫秒数。

writeMillis

整数

将结果数据写回的毫秒数。

nodePropertiesWritten

整数

写入 Neo4j 的属性数量。

配置

Map

用于运行算法的配置。

示例

以下所有示例应在空数据库中运行。

这些示例将 Cypher 投影作为规范。原生投影将在未来版本中弃用。

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

Visualization of the example graph
以下 Cypher 语句将在 Neo4j 数据库中创建示例图:
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 投影来完成此操作。

以下语句将使用反向投影(reverse projection)来投影图,并将其以名称“myGraph”存储在图目录中。
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
表 13. 结果
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
表 14. 结果
名称 (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
表 15. 结果
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
表 16. 结果
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
表 17. 结果
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
表 18. 结果
名称 (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
表 19. 结果
名称 (name) followees (被关注者)

"Alice"

3.0

“Mark”

2.0

“Michael”

1.0

“Charles”

1.0

“Bridget”

1.0

“Doug”

0.0

该示例表明,在观察反向方向时,Alice 在网络中的中心地位比 Doug 更高。