调和中心性 (Harmonic Centrality)
术语表
- 有向
-
有向特征。该算法在有向图上定义良好。
- 有向
-
有向特征。该算法忽略图的方向。
- 有向
-
有向特征。该算法不能在有向图上运行。
- 无向
-
无向特征。该算法在无向图上定义良好。
- 无向
-
无向特征。该算法忽略图的无向性。
- 异构节点
-
异构节点完全支持。该算法有能力区分不同类型的节点。
- 异构节点
-
异构节点允许。该算法平等对待所有选定的节点,无论其标签如何。
- 异构关系
-
异构关系完全支持。该算法有能力区分不同类型的关系。
- 异构关系
-
异构关系允许。该算法平等对待所有选定的关系,无论其类型如何。
- 加权关系
-
加权特征。该算法支持将关系属性用作权重,通过 relationshipWeightProperty 配置参数指定。
- 加权关系
-
加权特征。该算法将每个关系视为同等重要,忽略任何关系权重值。
- 节点属性
-
节点属性特征。该算法使用节点属性。
调和中心性(也称为有值中心性)是紧密中心性(closeness centrality)的一种变体,其发明旨在解决原始公式在处理非连通图时遇到的问题。与许多中心性算法一样,它起源于社交网络分析领域。
历史与解释
调和中心性由 Marchiori 和 Latora 在《小世界中的和谐》(Harmony in the Small World) 一文中提出,当时他们试图寻找一种合理的“平均最短路径”概念。
他们提出了一种与紧密中心性算法所使用的计算平均距离不同的方法。调和中心性算法不是将节点到所有其他节点的距离求和,而是将这些距离的倒数求和。这使得它能够处理无限大的距离值。
节点 u 的原始调和中心性使用以下公式计算:
即,对于每一个节点 j(不包括 u),我们计算它与 u 的最小距离并将该距离的倒数求和。如果从 u 到 j 没有路径,则 1/d(u,v) 被视为 0。
与紧密中心性类似,我们也可以使用以下公式为节点计算归一化调和中心性值:
在此,我们将原始值除以节点总数减一,以归一化返回的结果。在该公式中,∞ 值得到了妥善处理。Neo4j GDS 库计算的是归一化调和中心性值。
用例 - 何时使用调和中心性算法
调和中心性被提议作为紧密中心性的替代方案,因此具有类似的用例。
例如,如果我们试图确定在城市中的什么位置放置公共服务设施,以便居民能轻松访问,我们可能会使用它。如果我们试图在社交媒体上传播信息,我们可以利用该算法找到能帮助我们实现目标的关键影响者。
语法
本节涵盖在各种执行模式下执行调和中心性算法的语法。我们描述的是命名图变体的语法。要了解有关通用语法变体的更多信息,请参阅语法概述。
CALL gds.closeness.harmonic.stream(
graphName: String,
configuration: Map
)
YIELD
nodeId: Integer,
score: Float
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
字符串列表 |
['*'] |
是 |
使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。 |
|
字符串列表 |
['*'] |
是 |
使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。 |
|
整数 |
4 [1] |
是 |
用于运行算法的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
true |
是 |
如果禁用,进度百分比将不会被记录。 |
|
| 名称 | 类型 | 描述 |
|---|---|---|
nodeId |
整数 |
节点 ID。 |
score |
浮点数 |
调和中心性评分。 |
CALL gds.closeness.harmonic.stats(
graphName: String,
configuration: Map
)
YIELD
centralityDistribution: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
整数 |
4 [2] |
是 |
用于运行算法的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
true |
是 |
如果禁用,进度百分比将不会被记录。 |
|
| 名称 | 类型 | 描述 |
|---|---|---|
centralityDistribution |
Map |
包含中心性分数的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
预处理图的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
postProcessingMillis |
整数 |
计算统计数据的毫秒数。 |
配置 |
Map |
用于运行算法的配置。 |
CALL gds.closeness.harmonic.mutate(
graphName: String,
configuration: Map
)
YIELD
centralityDistribution: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
mutateMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
整数 |
4 [3] |
是 |
用于运行算法的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
true |
是 |
如果禁用,进度百分比将不会被记录。 |
|
mutateProperty |
字符串 |
不适用 |
否 |
GDS 图中写入得分的节点属性。 |
字符串列表 |
['*'] |
是 |
使用给定的节点标签过滤命名图。 |
|
字符串列表 |
['*'] |
是 |
使用给定的关系类型过滤命名图。 |
|
整数 |
4 |
是 |
用于运行算法的并发线程数。 |
|
布尔值 |
true |
是 |
如果禁用,进度百分比将不会被记录。 |
|
字符串 |
内部生成 |
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
| 名称 | 类型 | 描述 |
|---|---|---|
centralityDistribution |
Map |
包含中心性分数的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
预处理图的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
mutateMillis |
整数 |
向投影图添加属性的毫秒数。 |
nodePropertiesWritten |
整数 |
写入投影图的属性数量。 |
配置 |
Map |
用于运行算法的配置。 |
CALL gds.closeness.harmonic.write(
graphName: String,
configuration: Map
)
YIELD
centralityDistribution: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
writeMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
Map |
|
是 |
算法特定配置和/或图过滤配置。 |
| 名称 | 类型 | 默认 | 可选 | 描述 |
|---|---|---|---|---|
整数 |
4 [4] |
是 |
用于运行算法的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
true |
是 |
如果禁用,进度百分比将不会被记录。 |
|
字符串列表 |
['*'] |
是 |
使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。 |
|
字符串列表 |
['*'] |
是 |
使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。 |
|
整数 |
4 [4] |
是 |
用于运行算法的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供一个 ID 以更轻松地跟踪算法的进度。 |
|
布尔值 |
true |
是 |
如果禁用,进度百分比将不会被记录。 |
|
整数 |
'concurrency' 的值 |
是 |
用于将结果写入 Neo4j 的并发线程数。 |
|
字符串 |
不适用 |
否 |
Neo4j 数据库中写入得分的节点属性。 |
|
| 名称 | 类型 | 描述 |
|---|---|---|
centralityDistribution |
Map |
包含中心性分数的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
预处理图的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
postProcessingMillis |
整数 |
计算统计数据的毫秒数。 |
writeMillis |
整数 |
将结果数据写回的毫秒数。 |
nodePropertiesWritten |
整数 |
写入 Neo4j 的属性数量。 |
配置 |
Map |
用于运行算法的配置。 |
示例
|
以下所有示例应在空数据库中运行。 这些示例将 Cypher 投影作为规范。原生投影将在未来版本中弃用。 |
在本节中,我们将展示在具体图上运行调和中心性算法的示例。目的是说明结果的样子,并为如何在实际场景中使用该算法提供指导。我们将使用一个由少量节点按特定模式连接的用户网络图来进行演示。示例图如下所示:
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: ['*'] }
)
在接下来的示例中,我们将演示如何在这一图上使用调和中心性算法。
内存估算
首先,我们将使用 estimate 过程来估算运行该算法的成本。这可以在任何执行模式下完成。在本示例中,我们将使用 stream 模式。估算算法有助于了解在图上运行算法对内存的影响。当您稍后在其中一种执行模式下实际运行算法时,系统将执行一次估算。如果估算显示执行超出内存限制的可能性非常高,则禁止执行。要了解更多信息,请参阅自动估算与执行阻塞。
有关 estimate 的更多详细信息,请参阅 内存估算。
CALL gds.closeness.harmonic.stream.estimate('graph', {})
YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory
| nodeCount | relationshipCount | bytesMin | bytesMax | requiredMemory |
|---|---|---|---|---|
5 |
6 |
1368 |
1368 |
"1368 字节" |
流式传输 (Stream)
CALL gds.closeness.harmonic.stream('graph', {})
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS user, score
ORDER BY score DESC
| user(用户) | score |
|---|---|
"Bob" |
0.5 |
"Alice" |
0.375 |
“Charles” |
0.375 |
“Doug” |
0.25 |
"Ethan" |
0.25 |
统计 (Stats)
CALL gds.closeness.harmonic.stats('graph', {})
YIELD centralityDistribution
| centralityDistribution |
|---|
{max=0.5000038147, mean=0.3500003815, min=0.25, p50=0.375, p75=0.375, p90=0.5000019073, p95=0.5000019073, p99=0.5000019073, p999=0.5000019073} |
变异 (Mutate)
CALL gds.closeness.harmonic.mutate('graph', {mutateProperty: 'harmonicScore'})
YIELD nodePropertiesWritten, centralityDistribution
| nodePropertiesWritten | centralityDistribution |
|---|---|
5 |
{max=0.5000038147, mean=0.3500003815, min=0.25, p50=0.375, p75=0.375, p90=0.5000019073, p95=0.5000019073, p99=0.5000019073, p999=0.5000019073} |