谐波中心性
词汇表
- 有向
-
有向特征。该算法在有向图上定义良好。
- 有向
-
有向特征。该算法忽略图的方向。
- 有向
-
有向特征。该算法不能在有向图上运行。
- 无向
-
无向特征。该算法在无向图上定义良好。
- 无向
-
无向特征。该算法忽略图的无向性。
- 异构节点
-
异构节点 完全支持。该算法能够区分不同类型的节点。
- 异构节点
-
异构节点 允许。该算法对所有选定的节点进行相同处理,而不管其标签如何。
- 异构关系
-
异构关系 完全支持。该算法能够区分不同类型的关系。
- 异构关系
-
异构关系 允许。该算法对所有选定的关系进行相同处理,而不管其类型如何。
- 加权关系
-
加权特征。该算法支持使用关系属性作为权重,通过 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
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定和/或图形过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
concurrency |
整数 |
4 |
是 |
用于运行算法的并发线程数。还提供“readConcurrency”和“writeConcurrency”的默认值。 |
readConcurrency |
整数 |
'concurrency'的值 |
是 |
用于读取图形的并发线程数。 |
writeConcurrency |
整数 |
'concurrency'的值 |
是 |
用于写入结果的并发线程数。 |
writeProperty |
字符串 |
N/A |
否 |
Neo4j 数据库中写入中心性分数的节点属性。 |
名称 | 类型 | 描述 |
---|---|---|
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
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定和/或图形过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
['*'] |
是 |
使用给定的节点标签过滤命名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
['*'] |
是 |
使用给定的关系类型过滤命名图。将包含具有任何给定类型的关系。 |
|
整数 |
4 |
是 |
用于运行算法的并发线程数。 |
|
字符串 |
内部生成 |
是 |
可以提供的 ID,以便更轻松地跟踪算法的进度。 |
|
布尔值 |
真 |
是 |
如果禁用,则不会记录进度百分比。 |
名称 | 类型 | 描述 |
---|---|---|
nodeId |
整数 |
节点 ID。 |
score |
浮点数 |
调和中心性分数。 |
Alpha 语法
CALL gds.alpha.closeness.harmonic.write(configuration: Map)
YIELD nodes, preProcessingMillis, computeMillis, writeMillis, centralityDistribution
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
concurrency |
整数 |
4 |
是 |
用于运行算法的并发线程数。还提供“readConcurrency”和“writeConcurrency”的默认值。 |
readConcurrency |
整数 |
'concurrency'的值 |
是 |
用于读取图形的并发线程数。 |
writeConcurrency |
整数 |
'concurrency'的值 |
是 |
用于写入结果的并发线程数。 |
writeProperty |
字符串 |
'centrality' |
是 |
写回的属性名称。 |
名称 | 类型 | 描述 |
---|---|---|
nodes |
整数 |
考虑的节点数。 |
preProcessingMillis |
整数 |
预处理数据所用的毫秒数。 |
computeMillis |
整数 |
运行算法所用的毫秒数。 |
writeMillis |
整数 |
将结果数据写回所用的毫秒数。 |
writeProperty |
字符串 |
写回的属性名称。 |
centralityDistribution |
映射 |
包含中心性值的最小值、最大值、平均值以及第 50、75、90、95、99 和 999 百分位数的映射。 |
CALL gds.alpha.closeness.harmonic.stream(configuration: Map)
YIELD nodeId, centrality
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
concurrency |
整数 |
4 |
是 |
用于运行算法的并发线程数。还提供“readConcurrency”和“writeConcurrency”的默认值。 |
readConcurrency |
整数 |
'concurrency'的值 |
是 |
用于读取图形的并发线程数。 |
名称 | 类型 | 描述 |
---|---|---|
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
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
nodePropertiesWritten |
---|
5 |