度中心性

术语表

有向

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

有向

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

有向

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

无向

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

无向

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

异构节点

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

异构节点

允许异构节点。该算法对所有选定的节点一视同仁,无论其标签如何。

异构关系

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

异构关系

允许异构关系。该算法对所有选定的关系一视同仁,无论其类型如何。

加权关系

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

加权关系

加权特性。该算法将每个关系视为同等重要,并丢弃任何关系权重的值。

简介

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

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

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

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

用例

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

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

  • 加权度中心性已用于帮助区分在线拍卖中的欺诈者和合法用户。欺诈者的加权中心性显著更高,因为他们倾向于相互串通以人为地提高物品价格。在基于两步图的在线拍卖欺诈检测半监督学习中了解更多信息。

语法

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

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

graphName

字符串

不适用

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [1]

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

jobId

字符串

内部生成

一个可用于更轻松地跟踪算法进度的 ID。

logProgress

布尔

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

orientation

字符串

NATURAL

用于计算节点度数的关系方向。支持的方向有 NATURALREVERSEUNDIRECTED

relationshipWeightProperty

字符串

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

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

表 3. 结果
名称 类型 描述

nodeId

整数

节点 ID。

score

浮点数

度中心性分数。

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

graphName

字符串

不适用

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [2]

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

jobId

字符串

内部生成

一个可用于更轻松地跟踪算法进度的 ID。

logProgress

布尔

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

orientation

字符串

NATURAL

用于计算节点度数的关系方向。支持的方向有 NATURALREVERSEUNDIRECTED

relationshipWeightProperty

字符串

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

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

表 6. 结果
名称 类型 描述

centralityDistribution

映射

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

preProcessingMillis

整数

图预处理所需毫秒数。

computeMillis

整数

运行算法所需毫秒数。

postProcessingMillis

整数

计算统计数据所需毫秒数。

configuration

映射

用于运行算法的配置。

在命名图上以变异模式运行度中心性。
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

字符串

不适用

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

configuration

映射

{}

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

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

mutateProperty

字符串

不适用

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

内部生成

一个可用于更轻松地跟踪算法进度的 ID。

orientation

字符串

NATURAL

用于计算节点度数的关系方向。支持的方向有 NATURALREVERSEUNDIRECTED

relationshipWeightProperty

字符串

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

表 9. 结果
名称 类型 描述

centralityDistribution

映射

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

preProcessingMillis

整数

图预处理所需毫秒数。

computeMillis

整数

运行算法所需毫秒数。

postProcessingMillis

整数

计算统计数据所需毫秒数。

mutateMillis

整数

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

nodePropertiesWritten

整数

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

configuration

映射

用于运行算法的配置。

在命名图上以写入模式运行度中心性。
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

字符串

不适用

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [3]

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

jobId

字符串

内部生成

一个可用于更轻松地跟踪算法进度的 ID。

logProgress

布尔

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

writeConcurrency

整数

'concurrency' 的值

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

writeProperty

字符串

不适用

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

orientation

字符串

NATURAL

用于计算节点度数的关系方向。支持的方向有 NATURALREVERSEUNDIRECTED

relationshipWeightProperty

字符串

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

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

表 12. 结果
名称 类型 描述

centralityDistribution

映射

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

preProcessingMillis

整数

图预处理所需毫秒数。

computeMillis

整数

运行算法所需毫秒数。

postProcessingMillis

整数

计算统计数据所需毫秒数。

writeMillis

整数

写回结果数据所需毫秒数。

nodePropertiesWritten

整数

写入 Neo4j 的属性数量。

configuration

映射

用于运行算法的配置。

示例

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

示例使用 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 后,我们现在可以将其投影到图目录中,以准备执行算法。我们使用 Cypher 投影,以 User 节点和 FOLLOWS 关系为目标。

以下语句将使用反向投影来投影图,并将其存储在图目录中,名称为“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 执行模式中,算法返回每个节点的度中心性。这使我们能够直接检查结果或在 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 关注者

"Doug"

5.0

"Michael"

1.0

"Charles"

1.0

"Bridget"

1.0

"Mark"

0.0

"Alice"

0.0

我们可以看到 Doug 是我们想象中的社交网络图中最受欢迎的用户,拥有 5 个关注者——所有其他用户都关注他们,但他们不回关任何人。在真实的社交网络中,名人的关注者数量非常高,但他们通常只关注很少的人。因此,我们可以认为 Doug 相当有名!

统计模式

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 执行模式扩展了 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 执行模式扩展了 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 示例相同。此外,七个节点中的每个节点现在都拥有一个新属性 degree 在 Neo4j 数据库中,包含该节点的度中心性分数。

加权度中心性示例

本示例将解释加权度中心性算法。该算法是度中心性算法的一个变体,用于测量传入和传出关系的正权重之和。

以下将以 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 加权关注者

"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 被关注者

"Alice"

3.0

"Mark"

2.0

"Michael"

1.0

"Charles"

1.0

"Bridget"

1.0

"Doug"

0.0

示例显示,当查看反向方向时,Alice 在网络中比 Doug 更具中心性。

© . All rights reserved.