谐波中心性

术语表

有向

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

有向

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

有向

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

无向

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

无向

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

异构节点

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

异构节点

异构节点允许。该算法无论节点的标签如何,都以相似方式处理所有选定的节点。

异构关系

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

异构关系

异构关系允许。该算法无论关系的类型如何,都以相似方式处理所有选定的关系。

加权关系

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

加权关系

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

谐波中心性(也称为赋值中心性)是接近中心性的一种变体,其发明旨在解决原始公式在处理非连通图时遇到的问题。与许多中心性算法一样,它起源于社交网络分析领域。

历史与解释

谐波中心性由 Marchiori 和 Latora 在 Harmony in the Small World 中提出,旨在提出一个合理的“平均最短路径”概念。

他们提出了一种不同于接近中心性算法中使用的平均距离计算方法。谐波中心性算法不是将一个节点到所有其他节点的距离求和,而是将这些距离的倒数求和。这使其能够处理无限值。

节点 u原始谐波中心性使用以下公式计算

raw harmonic
图 1. 节点 u 的原始谐波公式

也就是说,对于每个节点 j(不包括 u),我们计算它到 u 的最小距离并将其倒数相加。如果从 uj 没有路径,则 1/d(u,v) 被视为 0

与接近中心性类似,我们也可以使用以下公式计算节点的归一化谐波中心性

norm harmonic
图 2. 节点 u 的归一化谐波公式

在这里,我们将原始值除以节点数减一,以使返回的值归一化。在此公式中,无穷大值可以被干净地处理。Neo4j GDS 库计算归一化谐波中心性值。

用例 - 何时使用谐波中心性算法

谐波中心性被提出作为接近中心性的替代方案,因此具有相似的用例。

例如,如果我们试图确定在城市何处设立新的公共服务以方便居民使用,我们可能会使用它。如果我们要通过社交媒体传播信息,我们可以使用该算法找到能够帮助我们实现目标的关键影响者。

语法

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

每种模式的谐波中心性语法
以下将运行算法并流式传输结果
CALL gds.closeness.harmonic.stream(
  graphName: String,
  configuration: Map
)
YIELD
  nodeId: Integer,
  score: Float
表 1. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

目录中存储的图的名称。

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [1]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

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

表 3. 结果
名称 类型 描述

nodeId

整数

节点 ID。

score

浮点数

谐波中心性得分。

以下将运行算法并返回统计信息
CALL gds.closeness.harmonic.stats(
  graphName: String,
  configuration: Map
)
YIELD
  centralityDistribution: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  configuration: Map
表 4. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

目录中存储的图的名称。

configuration

映射

{}

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

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

concurrency

整数

4 [2]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

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

表 6. 结果
名称 类型 描述

centralityDistribution

映射

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

preProcessingMillis

整数

预处理图的毫秒数。

computeMillis

整数

运行算法的毫秒数。

postProcessingMillis

整数

计算统计信息的毫秒数。

configuration

映射

用于运行算法的配置。

以下将运行算法并更新图
CALL gds.closeness.harmonic.mutate(
  graphName: String,
  configuration: Map
)
YIELD
  centralityDistribution: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  mutateMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 7. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

目录中存储的图的名称。

configuration

映射

{}

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

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

concurrency

整数

4 [3]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

mutateProperty

字符串

不适用

GDS 图中写入分数的节点属性。

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

内部生成

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

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

表 9. 结果
名称 类型 描述

centralityDistribution

映射

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

preProcessingMillis

整数

预处理图的毫秒数。

computeMillis

整数

运行算法的毫秒数。

mutateMillis

整数

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

nodePropertiesWritten

整数

写入投影图的属性数量。

configuration

映射

用于运行算法的配置。

以下将运行算法并写回结果
CALL gds.closeness.harmonic.write(
  graphName: String,
  configuration: Map
)
YIELD
  centralityDistribution: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  writeMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 10. 参数
名称 类型 默认值 可选 描述

graphName

字符串

不适用

目录中存储的图的名称。

configuration

映射

{}

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

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

concurrency

整数

4 [4]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4 [4]

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

jobId

字符串

内部生成

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

logProgress

布尔值

true

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

writeConcurrency

整数

'concurrency' 的值

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

writeProperty

字符串

不适用

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

4. 在 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 (a:User {name: "Alice"}),
       (b:User {name: "Bob"}),
       (c:User {name: "Charles"}),
       (d:User {name: "Doug"}),
       (e:User {name: "Ethan"}),
       (a)-[:LINK]->(b),
       (b)-[:LINK]->(c),
       (d)-[:LINK]->(e)
以下语句将使用 Cypher 投影来投影图,并将其以名称“graph”存储在图目录中。
MATCH (source:User)-[r:LINK]->(target:User)
RETURN gds.graph.project(
  'graph',
  source,
  target,
  {},
  { undirectedRelationshipTypes: ['*'] }
)

在以下示例中,我们将演示在此图上使用谐波中心性算法。

内存估算

首先,我们将使用 estimate 过程估算运行算法的成本。这可以在任何执行模式下完成。在此示例中,我们将使用 stream 模式。估算算法有助于了解在图上运行算法对内存的影响。当您稍后实际在一种执行模式下运行算法时,系统将执行估算。如果估算显示执行超出内存限制的可能性非常高,则禁止执行。要了解更多信息,请参见自动估算和执行阻止

有关 estimate 的更多详细信息,请参见内存估算

以下将估算在流模式下运行算法的内存要求
CALL gds.closeness.harmonic.stream.estimate('graph', {})
YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory
表 13. 结果
nodeCount relationshipCount bytesMin bytesMax requiredMemory

5

6

1368

1368

"1368 字节"

流式

以下将运行算法并流式传输结果
CALL gds.closeness.harmonic.stream('graph', {})
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS user, score
ORDER BY score DESC
表 14. 结果
用户 score

"Bob"

0.5

"Alice"

0.375

"Charles"

0.375

"Doug"

0.25

"Ethan"

0.25

统计信息

以下将运行算法并返回统计信息
CALL gds.closeness.harmonic.stats('graph', {})
YIELD centralityDistribution
表 15. 结果
centralityDistribution

{最大值=0.5000038147, 平均值=0.3500003815, 最小值=0.25, p50=0.375, p75=0.375, p90=0.5000019073, p95=0.5000019073, p99=0.5000019073, p999=0.5000019073}

变异

以下将在变异模式下运行算法并更新内存图
CALL gds.closeness.harmonic.mutate('graph', {mutateProperty: 'harmonicScore'})
YIELD nodePropertiesWritten, centralityDistribution
表 16. 结果
nodePropertiesWritten centralityDistribution

5

{最大值=0.5000038147, 平均值=0.3500003815, 最小值=0.25, p50=0.375, p75=0.375, p90=0.5000019073, p95=0.5000019073, p99=0.5000019073, p999=0.5000019073}

写入

以下将运行算法并将结果写回 Neo4j 数据库
CALL gds.closeness.harmonic.write('graph', {writeProperty: 'score'})
YIELD nodePropertiesWritten
表 17. 结果
nodePropertiesWritten

5

© . All rights reserved.