度中心性
术语表
- 有向
-
有向特性。该算法在有向图上定义良好。
- 有向
-
有向特性。该算法忽略图的方向。
- 有向
-
有向特性。该算法不在有向图上运行。
- 无向
-
无向特性。该算法在无向图上定义良好。
- 无向
-
无向特性。该算法忽略图的无向性。
- 异构节点
-
完全支持异构节点。该算法能够区分不同类型的节点。
- 异构节点
-
允许异构节点。该算法对所有选定的节点一视同仁,无论其标签如何。
- 异构关系
-
完全支持异构关系。该算法能够区分不同类型的关系。
- 异构关系
-
允许异构关系。该算法对所有选定的关系一视同仁,无论其类型如何。
- 加权关系
-
加权特性。该算法支持将关系属性用作权重,通过 relationshipWeightProperty 配置参数指定。
- 加权关系
-
加权特性。该算法将每个关系视为同等重要,并丢弃任何关系权重的值。
简介
用例
度中心性算法已被证明在许多不同应用中很有用。例如
-
度中心性是任何尝试确定社交网络中最重要人物的重要组成部分。例如,在 BrandWatch 的2017 年 Twitter 上最具影响力男性和女性中,每个类别的前 5 名人物各有超过 4000 万粉丝,这远高于平均度数。
-
加权度中心性已用于帮助区分在线拍卖中的欺诈者和合法用户。欺诈者的加权中心性显著更高,因为他们倾向于相互串通以人为地提高物品价格。在基于两步图的在线拍卖欺诈检测半监督学习中了解更多信息。
语法
本节介绍在每种执行模式下执行度中心性算法所使用的语法。我们描述的是命名图语法的变体。要了解有关通用语法变体的更多信息,请参阅语法概览。
CALL gds.degree.stream(
graphName: String,
configuration: Map
) YIELD
nodeId: Integer,
score: Float
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定配置和/或图过滤。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。将包含具有任何给定类型的关系。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
一个可用于更轻松地跟踪算法进度的 ID。 |
|
布尔 |
|
是 |
如果禁用,则不会记录进度百分比。 |
|
orientation |
字符串 |
|
是 |
用于计算节点度数的关系方向。支持的方向有 |
字符串 |
|
是 |
用于加权度计算的关系属性名称。如果未指定,算法将以无权方式运行。 |
|
名称 | 类型 | 描述 |
---|---|---|
nodeId |
整数 |
节点 ID。 |
score |
浮点数 |
度中心性分数。 |
CALL gds.degree.stats(
graphName: String,
configuration: Map
) YIELD
centralityDistribution: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定配置和/或图过滤。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。将包含具有任何给定类型的关系。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
一个可用于更轻松地跟踪算法进度的 ID。 |
|
布尔 |
|
是 |
如果禁用,则不会记录进度百分比。 |
|
orientation |
字符串 |
|
是 |
用于计算节点度数的关系方向。支持的方向有 |
字符串 |
|
是 |
用于加权度计算的关系属性名称。如果未指定,算法将以无权方式运行。 |
|
名称 | 类型 | 描述 |
---|---|---|
centralityDistribution |
映射 |
包含中心性值的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
图预处理所需毫秒数。 |
computeMillis |
整数 |
运行算法所需毫秒数。 |
postProcessingMillis |
整数 |
计算统计数据所需毫秒数。 |
configuration |
映射 |
用于运行算法的配置。 |
CALL gds.degree.mutate(
graphName: String,
configuration: Map
) YIELD
centralityDistribution: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
mutateMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定配置和/或图过滤。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
mutateProperty |
字符串 |
|
否 |
度中心性写入的 GDS 图中的节点属性。 |
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
一个可用于更轻松地跟踪算法进度的 ID。 |
|
orientation |
字符串 |
|
是 |
用于计算节点度数的关系方向。支持的方向有 |
字符串 |
|
是 |
用于加权度计算的关系属性名称。如果未指定,算法将以无权方式运行。 |
名称 | 类型 | 描述 |
---|---|---|
centralityDistribution |
映射 |
包含中心性值的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
图预处理所需毫秒数。 |
computeMillis |
整数 |
运行算法所需毫秒数。 |
postProcessingMillis |
整数 |
计算统计数据所需毫秒数。 |
mutateMillis |
整数 |
向投影图添加属性所需毫秒数。 |
nodePropertiesWritten |
整数 |
添加到投影图的属性数量。 |
configuration |
映射 |
用于运行算法的配置。 |
CALL gds.degree.write(
graphName: String,
configuration: Map
) YIELD
centralityDistribution: Map,
preProcessingMillis: Integer,
computeMillis: Integer,
postProcessingMillis: Integer,
writeMillis: Integer,
nodePropertiesWritten: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定配置和/或图过滤。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。将包含具有任何给定标签的节点。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。将包含具有任何给定类型的关系。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
一个可用于更轻松地跟踪算法进度的 ID。 |
|
布尔 |
|
是 |
如果禁用,则不会记录进度百分比。 |
|
整数 |
|
是 |
用于将结果写入 Neo4j 的并发线程数。 |
|
字符串 |
|
否 |
度中心性写入的 Neo4j 数据库中的节点属性。 |
|
orientation |
字符串 |
|
是 |
用于计算节点度数的关系方向。支持的方向有 |
字符串 |
|
是 |
用于加权度计算的关系属性名称。如果未指定,算法将以无权方式运行。 |
|
名称 | 类型 | 描述 |
---|---|---|
centralityDistribution |
映射 |
包含中心性值的最小值、最大值、平均值以及 p50、p75、p90、p95、p99 和 p999 百分位值的映射。 |
preProcessingMillis |
整数 |
图预处理所需毫秒数。 |
computeMillis |
整数 |
运行算法所需毫秒数。 |
postProcessingMillis |
整数 |
计算统计数据所需毫秒数。 |
writeMillis |
整数 |
写回结果数据所需毫秒数。 |
nodePropertiesWritten |
整数 |
写入 Neo4j 的属性数量。 |
configuration |
映射 |
用于运行算法的配置。 |
示例
以下所有示例都应在空数据库中运行。 示例使用 Cypher 投影作为规范。原生投影将在未来的版本中弃用。 |
在本节中,我们将展示在具体图上运行度中心性算法的示例。目的是说明结果是什么样子,并提供在实际设置中如何使用该算法的指南。我们将在一个由少量节点以特定模式连接的小型社交网络图上进行此操作。示例图如下所示:
CREATE
(alice:User {name: 'Alice'}),
(bridget:User {name: 'Bridget'}),
(charles:User {name: 'Charles'}),
(doug:User {name: 'Doug'}),
(mark:User {name: 'Mark'}),
(michael:User {name: 'Michael'}),
(alice)-[:FOLLOWS {score: 1}]->(doug),
(alice)-[:FOLLOWS {score: -2}]->(bridget),
(alice)-[:FOLLOWS {score: 5}]->(charles),
(mark)-[:FOLLOWS {score: 1.5}]->(doug),
(mark)-[:FOLLOWS {score: 4.5}]->(michael),
(bridget)-[:FOLLOWS {score: 1.5}]->(doug),
(charles)-[:FOLLOWS {score: 2}]->(doug),
(michael)-[:FOLLOWS {score: 1.5}]->(doug)
将图导入 Neo4j 后,我们现在可以将其投影到图目录中,以准备执行算法。我们使用 Cypher 投影,以 User
节点和 FOLLOWS
关系为目标。
MATCH (source:User)-[r:FOLLOWS]->(target:User)
RETURN gds.graph.project(
'myGraph',
target,
source,
{ relationshipProperties: r { .score } }
)
对于有向关系,度中心性算法计算每个节点的出度。为了检索拥有最多关注者的人,以下示例中图以 REVERSE
方向投影。这将通过在该图上使用度中心性算法进行演示。
内存估算
首先,我们将使用 estimate
过程估算运行算法的成本。这可以通过任何执行模式完成。我们将在此示例中使用 write
模式。估算算法有助于了解在图上运行算法对内存的影响。当您稍后实际以某种执行模式运行算法时,系统将执行估算。如果估算显示执行超出内存限制的可能性非常高,则禁止执行。要了解更多信息,请参阅自动估算和执行阻止。
有关 estimate
的更多详细信息,请参阅内存估算。
CALL gds.degree.write.estimate('myGraph', { writeProperty: 'degree' })
YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory
nodeCount | relationshipCount | bytesMin | bytesMax | requiredMemory |
---|---|---|---|---|
6 |
8 |
48 |
48 |
"48 字节" |
流模式
在 stream
执行模式中,算法返回每个节点的度中心性。这使我们能够直接检查结果或在 Cypher 中进行后处理,而不会产生任何副作用。例如,我们可以对结果进行排序以找到具有最高度中心性的节点。
有关 stream
模式的更多详细信息,请参阅流模式。
stream
模式运行算法:CALL gds.degree.stream('myGraph')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score AS followers
ORDER BY followers DESC, name DESC
name | 关注者 |
---|---|
"Doug" |
5.0 |
"Michael" |
1.0 |
"Charles" |
1.0 |
"Bridget" |
1.0 |
"Mark" |
0.0 |
"Alice" |
0.0 |
我们可以看到 Doug 是我们想象中的社交网络图中最受欢迎的用户,拥有 5 个关注者——所有其他用户都关注他们,但他们不回关任何人。在真实的社交网络中,名人的关注者数量非常高,但他们通常只关注很少的人。因此,我们可以认为 Doug 相当有名!
统计模式
在 stats
执行模式中,算法返回包含算法结果摘要的单行。此执行模式没有任何副作用。通过检查 computeMillis
返回项,这有助于评估算法性能。在下面的示例中,我们将省略返回时间。该过程的完整签名可在语法部分找到。
有关 stats
模式的更多详细信息,请参阅统计模式。
stats
模式运行算法:CALL gds.degree.stats('myGraph')
YIELD centralityDistribution
RETURN centralityDistribution.min AS minimumScore, centralityDistribution.mean AS meanScore
minimumScore | meanScore |
---|---|
0.0 |
1.3333358764648438 |
将此与我们在流模式示例中看到的结果进行比较,我们可以从表中找到最小值和平均值。
变异模式
mutate
执行模式扩展了 stats
模式,并带有一个重要的副作用:用包含该节点度中心性的新节点属性更新命名图。新属性的名称使用强制配置参数 mutateProperty
指定。结果是一个单一的摘要行,类似于 stats
,但带有一些额外的指标。mutate
模式在多个算法结合使用时特别有用。
有关 mutate
模式的更多详细信息,请参阅变异模式。
mutate
模式运行算法:CALL gds.degree.mutate('myGraph', { mutateProperty: 'degree' })
YIELD centralityDistribution, nodePropertiesWritten
RETURN centralityDistribution.min AS minimumScore, centralityDistribution.mean AS meanScore, nodePropertiesWritten
minimumScore | meanScore | nodePropertiesWritten |
---|---|---|
0.0 |
1.3333358764648438 |
6 |
返回结果与 stats
示例相同。此外,图“myGraph”现在具有一个节点属性 degree
,存储每个节点的度中心性分数。要了解如何检查内存中图的新模式,请参阅列出目录中的图。
写入模式
write
执行模式扩展了 stats
模式,并带有一个重要的副作用:将每个节点的度中心性作为属性写入 Neo4j 数据库。新属性的名称使用强制配置参数 writeProperty
指定。结果是一个单一的摘要行,类似于 stats
,但带有一些额外的指标。write
模式允许将结果直接持久化到数据库。
有关 write
模式的更多详细信息,请参阅写入模式。
write
模式运行算法:CALL gds.degree.write('myGraph', { writeProperty: 'degree' })
YIELD centralityDistribution, nodePropertiesWritten
RETURN centralityDistribution.min AS minimumScore, centralityDistribution.mean AS meanScore, nodePropertiesWritten
minimumScore | meanScore | nodePropertiesWritten |
---|---|---|
0.0 |
1.3333358764648438 |
6 |
返回结果与 stats
示例相同。此外,七个节点中的每个节点现在都拥有一个新属性 degree
在 Neo4j 数据库中,包含该节点的度中心性分数。
加权度中心性示例
本示例将解释加权度中心性算法。该算法是度中心性算法的一个变体,用于测量传入和传出关系的正权重之和。
stream
模式运行算法,显示哪些用户具有最高的加权度中心性:CALL gds.degree.stream(
'myGraph',
{ relationshipWeightProperty: 'score' }
)
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score AS weightedFollowers
ORDER BY weightedFollowers DESC, name DESC
name | 加权关注者 |
---|---|
"Doug" |
7.5 |
"Charles" |
5.0 |
"Michael" |
4.5 |
"Mark" |
0.0 |
"Bridget" |
0.0 |
"Alice" |
0.0 |
Doug 仍然是我们最受欢迎的用户,但与下一个人之间没有那么大的差距。Charles 和 Michael 都只有一个关注者,但这些关系的权重很高。请注意,尽管 Bridget 与 Alice 有连接,但其加权分数也为 0.0。这是因为 Bridget 和 Alice 之间的 score
属性值为负,将被算法忽略。
设置方向
默认情况下,节点中心性使用 NATURAL
方向计算度数。对于某些用例,分析不同的方向是有意义的,例如,如果我们想找出有多少用户关注另一个用户。为了改变方向,我们可以使用 orientation
配置键。有三个支持的值:
-
NATURAL
(默认)对应于计算每个节点的出度。 -
REVERSE
对应于计算每个节点的入度。 -
UNDIRECTED
计算并汇总每个节点的出度和入度。
stream
模式运行算法,显示哪些用户使用关系的反向方向具有最高的入度中心性:CALL gds.degree.stream(
'myGraph',
{ orientation: 'REVERSE' }
)
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score AS followees
ORDER BY followees DESC, name DESC
name | 被关注者 |
---|---|
"Alice" |
3.0 |
"Mark" |
2.0 |
"Michael" |
1.0 |
"Charles" |
1.0 |
"Bridget" |
1.0 |
"Doug" |
0.0 |
示例显示,当查看反向方向时,Alice
在网络中比 Doug
更具中心性。