度中心性
词汇表
- 有向
-
有向特征。该算法在有向图上定义良好。
- 有向
-
有向特征。该算法忽略图的方向。
- 有向
-
有向特征。该算法不在有向图上运行。
- 无向
-
无向特征。该算法在无向图上定义良好。
- 无向
-
无向特征。该算法忽略图的无向性。
- 异构节点
-
异构节点 完全支持。该算法能够区分不同类型的节点。
- 异构节点
-
异构节点 允许。该算法以相同的方式对待所有选定的节点,无论其标签如何。
- 异构关系
-
异构关系 完全支持。该算法能够区分不同类型的关系。
- 异构关系
-
异构关系 允许。该算法以相同的方式对待所有选定的关系,无论其类型如何。
- 加权关系
-
加权特征。该算法支持关系属性用作权重,通过 relationshipWeightProperty 配置参数指定。
- 加权关系
-
加权特征。该算法将每个关系视为同等重要,忽略任何关系权重的值。
介绍
度中心性算法可用于在图中查找流行的节点。度中心性衡量节点的传入或传出(或两者)关系的数量,具体取决于关系投影的方向。有关关系方向的更多信息,请参阅 关系投影语法部分。
它可以应用于加权或未加权图。在加权情况下,该算法计算图中每个节点的相邻关系的所有正权重的总和。忽略非正权重。
它可以应用于异构图,但是该算法不会按关系类型计算度中心性。相反,它将图视为同构,如算法特征所示。
有关此算法的更多信息,请参见
用例
度中心性算法已被证明在许多不同的应用中非常有用。例如
-
度中心性是确定社交网络中最重要的成员的任何尝试的重要组成部分。例如,在 BrandWatch 的 2017 年推特上最有影响力的人物 中,每个类别排名前 5 位的人都有超过 4000 万粉丝,这远高于平均度数。
-
加权度中心性已被用于帮助将欺诈者与在线拍卖的合法用户区分开来。欺诈者的加权中心性明显更高,因为他们往往相互勾结以人为抬高商品价格。阅读更多内容,请参阅 基于图的两步半监督学习,用于在线拍卖欺诈检测
语法
本节介绍了在每种执行模式下执行度中心性算法所使用的语法。我们正在描述命名的图变体语法。要了解有关一般语法变体的更多信息,请参见 语法概述。
- Stream mode
- Stats mode
- Mutate mode
- Write mode
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 |
地图 |
包含中心性值的最小值、最大值、平均值以及第 50、75、90、95、99 和 999 百分位数的映射。 |
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 |
地图 |
包含中心性值的最小值、最大值、平均值以及第 50、75、90、95、99 和 999 百分位数的映射。 |
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 |
地图 |
包含中心性值的最小值、最大值、平均值以及第 50、75、90、95、99 和 999 百分位数的映射。 |
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 后,我们现在可以将其投影到图目录中,以准备执行算法。我们使用针对 User
节点和 FOLLOWS
关系的 Cypher 投影来执行此操作。
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 | followers |
---|---|
"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
示例中相同。此外,七个节点中的每一个现在在 Neo4j 数据库中都拥有一个名为degree
的新属性,该属性包含该节点的度中心性得分。
加权度中心性示例
本示例将解释加权度中心性算法。该算法是度中心性算法的变体,它衡量传入和传出关系的正权重之和。
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
更中心化。