谐波中心性

词汇表

有向

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

有向

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

有向

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

无向

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

无向

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

异构节点

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

异构节点

异构节点 允许。该算法对所有选定的节点进行相同处理,而不管其标签如何。

异构关系

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

异构关系

异构关系 允许。该算法对所有选定的关系进行相同处理,而不管其类型如何。

加权关系

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

加权关系

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

调和中心性(也称为加权中心性)是接近中心性的一个变体,它被发明出来是为了解决原始公式在处理非连通图时遇到的问题。与许多中心性算法一样,它起源于社会网络分析领域。

此功能处于 Alpha 阶段。有关功能阶段的更多信息,请参阅 API 阶段

历史和解释

调和中心性由 Marchiori 和 Latora 在 小世界中的和谐 中提出,当时他们试图提出一个合理的“平均最短路径”概念。

他们建议了一种与接近中心性算法中使用的不同的计算平均距离的方法。调和中心性算法不是将节点到所有其他节点的距离求和,而是将这些距离的倒数求和。这使其能够处理无穷大的值。

节点的**原始调和中心性**使用以下公式计算

原始调和中心性(节点) = sum(1 / 节点到每个其他节点(不包括自身)的距离)

与接近中心性一样,我们还可以使用以下公式计算**归一化调和中心性**

归一化调和中心性(节点) = sum(1 / 节点到每个其他节点(不包括自身)的距离) / (节点数 - 1)

在此公式中,∞ 值可以被干净地处理。

用例 - 何时使用调和中心性算法

调和中心性被提议作为接近中心性的替代方案,因此具有类似的用例。

例如,如果我们试图确定在城市中放置新的公共服务的位置,以便居民能够轻松访问,我们可以使用它。如果我们试图在社交媒体上传播信息,我们可以使用该算法来找到可以帮助我们实现目标的关键影响者。

语法

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

每种模式下的调和中心性语法
以下将运行算法并写回结果
CALL gds.closeness.harmonic.write(
  graphName: String,
  configuration: Map
)
YIELD
  centralityDistribution: Map,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  writeMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 1. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

configuration

映射

{}

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

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

concurrency

整数

4

用于运行算法的并发线程数。还提供“readConcurrency”和“writeConcurrency”的默认值。

readConcurrency

整数

'concurrency'的值

用于读取图形的并发线程数。

writeConcurrency

整数

'concurrency'的值

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

writeProperty

字符串

N/A

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

表 3. 结果
名称 类型 描述

centralityDistribution

映射

包含中心性值的最小值、最大值、平均值以及第 50、75、90、95、99 和 999 百分位数的映射。

preProcessingMillis

整数

预处理图所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

postProcessingMillis

整数

计算统计信息所用的毫秒数。

writeMillis

整数

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

nodePropertiesWritten

整数

写入 Neo4j 的属性数。

configuration

映射

用于运行算法的配置。

以下将运行算法并流式传输结果
CALL gds.closeness.harmonic.stream(
  graphName: String,
  configuration: Map
)
YIELD
  nodeId: Integer,
  score: Float
表 4. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

内部生成

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

logProgress

布尔值

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

表 6. 结果
名称 类型 描述

nodeId

整数

节点 ID。

score

浮点数

调和中心性分数。

Alpha 语法

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

concurrency

整数

4

用于运行算法的并发线程数。还提供“readConcurrency”和“writeConcurrency”的默认值。

readConcurrency

整数

'concurrency'的值

用于读取图形的并发线程数。

writeConcurrency

整数

'concurrency'的值

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

writeProperty

字符串

'centrality'

写回的属性名称。

表 8. 结果
名称 类型 描述

nodes

整数

考虑的节点数。

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

writeMillis

整数

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

writeProperty

字符串

写回的属性名称。

centralityDistribution

映射

包含中心性值的最小值、最大值、平均值以及第 50、75、90、95、99 和 999 百分位数的映射。

以下将运行算法并流式传输结果
CALL gds.alpha.closeness.harmonic.stream(configuration: Map)
YIELD nodeId, centrality
表 9. 参数
名称 类型 默认值 可选 描述

concurrency

整数

4

用于运行算法的并发线程数。还提供“readConcurrency”和“writeConcurrency”的默认值。

readConcurrency

整数

'concurrency'的值

用于读取图形的并发线程数。

表 10. 结果
名称 类型 描述

node

长整数

节点 ID

centrality

浮点数

调和中心性分数

调和中心性算法示例

以下将创建一个示例图
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)
以下将投影并存储命名图
MATCH (source:User)-[r:LINK]->(target:User)
RETURN gds.graph.project(
  'graph',
  source,
  target,
  {},
  { undirectedRelationshipTypes: ['*'] }
)
以下将运行算法并流式传输结果
CALL gds.closeness.harmonic.stream('graph', {})
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS user, score
ORDER BY score DESC
表 11. 结果
user score

"Bob"

0.5

"Alice"

0.375

"Charles"

0.375

"Doug"

0.25

"Ethan"

0.25

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

5