谐波中心性
术语表
- 有向
-
有向特性。该算法在有向图上定义良好。
- 有向
-
有向特性。该算法忽略图的方向。
- 有向
-
有向特性。该算法不在有向图上运行。
- 无向
-
无向特性。该算法在无向图上定义良好。
- 无向
-
无向特性。该算法忽略图的无向性。
- 异构节点
-
异构节点完全支持。该算法能够区分不同类型的节点。
- 异构节点
-
异构节点允许。该算法无论节点的标签如何,都以相似方式处理所有选定的节点。
- 异构关系
-
异构关系完全支持。该算法能够区分不同类型的关系。
- 异构关系
-
异构关系允许。该算法无论关系的类型如何,都以相似方式处理所有选定的关系。
- 加权关系
-
加权特性。该算法支持将关系属性用作权重,通过 relationshipWeightProperty 配置参数指定。
- 加权关系
-
加权特性。该算法将每个关系视为同等重要,并丢弃任何关系权重的数值。
谐波中心性(也称为赋值中心性)是接近中心性的一种变体,其发明旨在解决原始公式在处理非连通图时遇到的问题。与许多中心性算法一样,它起源于社交网络分析领域。
历史与解释
谐波中心性由 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 |
字符串 |
|
否 |
目录中存储的图的名称。 |
configuration |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
['*'] |
是 |
使用给定节点标签过滤命名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
['*'] |
是 |
使用给定关系类型过滤命名图。将包含具有任何给定类型的关系。 |
|
整数 |
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 |
字符串 |
|
否 |
目录中存储的图的名称。 |
configuration |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
整数 |
4 [2] |
是 |
运行算法所用的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供的 ID,以便更轻松地跟踪算法的进度。 |
|
布尔值 |
true |
是 |
如果禁用,则不会记录进度百分比。 |
|
名称 | 类型 | 描述 |
---|---|---|
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
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
目录中存储的图的名称。 |
configuration |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
整数 |
4 [3] |
是 |
运行算法所用的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供的 ID,以便更轻松地跟踪算法的进度。 |
|
布尔值 |
true |
是 |
如果禁用,则不会记录进度百分比。 |
|
mutateProperty |
字符串 |
不适用 |
否 |
GDS 图中写入分数的节点属性。 |
字符串列表 |
['*'] |
是 |
使用给定节点标签过滤命名图。 |
|
字符串列表 |
['*'] |
是 |
使用给定关系类型过滤命名图。 |
|
整数 |
4 |
是 |
运行算法所用的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供的 ID,以便更轻松地跟踪算法的进度。 |
|
名称 | 类型 | 描述 |
---|---|---|
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
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
目录中存储的图的名称。 |
configuration |
映射 |
|
是 |
算法特定和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
整数 |
4 [4] |
是 |
运行算法所用的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供的 ID,以便更轻松地跟踪算法的进度。 |
|
布尔值 |
true |
是 |
如果禁用,则不会记录进度百分比。 |
|
字符串列表 |
['*'] |
是 |
使用给定节点标签过滤命名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
['*'] |
是 |
使用给定关系类型过滤命名图。将包含具有任何给定类型的关系。 |
|
整数 |
4 [4] |
是 |
运行算法所用的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供的 ID,以便更轻松地跟踪算法的进度。 |
|
布尔值 |
true |
是 |
如果禁用,则不会记录进度百分比。 |
|
整数 |
'concurrency' 的值 |
是 |
用于将结果写入 Neo4j 的并发线程数。 |
|
字符串 |
不适用 |
否 |
写入分数的 Neo4j 数据库中的节点属性。 |
|
名称 | 类型 | 描述 |
---|---|---|
centralityDistribution |
映射 |
包含中心性值的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
预处理图的毫秒数。 |
computeMillis |
整数 |
运行算法的毫秒数。 |
postProcessingMillis |
整数 |
计算统计信息的毫秒数。 |
writeMillis |
整数 |
写回结果数据的毫秒数。 |
nodePropertiesWritten |
整数 |
写入 Neo4j 的属性数量。 |
configuration |
映射 |
用于运行算法的配置。 |
示例
以下所有示例都应在一个空数据库中运行。 这些示例使用 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 字节" |
流式
CALL gds.closeness.harmonic.stream('graph', {})
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS user, score
ORDER BY score DESC
用户 | score |
---|---|
"Bob" |
0.5 |
"Alice" |
0.375 |
"Charles" |
0.375 |
"Doug" |
0.25 |
"Ethan" |
0.25 |
统计信息
CALL gds.closeness.harmonic.stats('graph', {})
YIELD centralityDistribution
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
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} |