模块化度量
词汇表
- 定向
-
定向特征。该算法在有向图上定义良好。
- 定向
-
定向特征。该算法忽略图的方向。
- 定向
-
定向特征。该算法不能在有向图上运行。
- 无向
-
无向特征。该算法在无向图上定义良好。
- 无向
-
无向特征。该算法忽略图的无向性。
- 异构节点
-
异构节点 完全支持。该算法能够区分不同类型的节点。
- 异构节点
-
异构节点 允许。该算法将所有选定节点视为相同,无论其标签如何。
- 异构关系
-
异构关系 完全支持。该算法能够区分不同类型的关系。
- 异构关系
-
异构关系 允许。该算法将所有选定关系视为相同,无论其类型如何。
- 加权关系
-
加权特征。该算法支持使用关系属性作为权重,通过 relationshipWeightProperty 配置参数指定。
- 加权关系
-
加权特征。该算法将每个关系视为同等重要,忽略任何关系权重的值。
介绍
模块化 是一种度量标准,可用于评估社区检测的质量。社区 C
中节点的关系连接到 C
内或 C
外的节点。模块化度高的图在社区内的节点之间具有密集的连接,但在不同社区的节点之间具有稀疏的连接。
语法
本节介绍在每种执行模式下执行模块化度量算法时使用的语法。我们正在描述命名图变体的语法。要了解有关一般语法变体的更多信息,请参阅 语法概述。
CALL gds.modularity.stream(
graphName: String,
configuration: Map
) YIELD
communityId: Integer,
modularity: Float
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
映射 |
|
是 |
针对算法特定内容和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可用于更轻松地跟踪算法进度的 ID。 |
|
布尔值 |
|
是 |
如果禁用,则不会记录进度百分比。 |
|
字符串 |
|
是 |
用作权重的关系属性的名称。如果未指定,则算法将不加权运行。 |
|
communityProperty |
字符串 |
|
否 |
保存每个节点社区 ID(作为整数)的节点属性。请注意,只有非负社区 ID 被视为有效,并且将计算其模块化得分。 |
名称 | 类型 | 描述 |
---|---|---|
communityId |
整数 |
社区 ID。 |
modularity |
浮点数 |
社区的模块化。 |
CALL gds.modularity.stats(
graphName: String,
configuration: Map
) YIELD
nodeCount: Integer,
relationshipCount: Integer,
communityCount: Integer,
modularity: Float,
postProcessingMillis: Integer,
preProcessingMillis: Integer,
computeMillis: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
配置 |
映射 |
|
是 |
针对算法特定内容和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。具有任何给定标签的节点都将被包含。 |
|
字符串列表 |
|
是 |
使用给定的关系类型过滤命名图。具有任何给定类型的关系都将被包含。 |
|
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
字符串 |
|
是 |
可用于更轻松地跟踪算法进度的 ID。 |
|
布尔值 |
|
是 |
如果禁用,则不会记录进度百分比。 |
|
字符串 |
|
是 |
用作权重的关系属性的名称。如果未指定,则算法将不加权运行。 |
|
communityProperty |
字符串 |
|
否 |
保存每个节点社区 ID(作为整数)的节点属性。请注意,只有非负社区 ID 被视为有效,并且将计算其模块化得分。 |
名称 | 类型 | 描述 |
---|---|---|
nodeCount |
整数 |
图中的节点数量。 |
relationshipCount |
整数 |
图中关系的数量。 |
communityCount |
整数 |
社区的数量。 |
modularity |
浮点数 |
总模块化分数。 |
preProcessingMillis |
整数 |
预处理数据所花费的毫秒数。 |
computeMillis |
整数 |
运行算法所花费的毫秒数。 |
postProcessingMillis |
整数 |
计算百分位数和社区数量所花费的毫秒数。 |
配置 |
映射 |
用于运行算法的配置。 |
示例
以下所有示例都应在空数据库中运行。 这些示例使用 Cypher 投影 作为规范。本机投影将在未来版本中弃用。 |
在本节中,我们将展示在具体图上运行模块化算法的示例。目的是说明结果的样子,并提供在真实环境中使用该算法的指南。我们将在一个小型社交网络图上进行操作,该图包含少量以特定模式连接的节点。示例图如下所示
CREATE
(nAlice:User {name: 'Alice', community: 3}),
(nBridget:User {name: 'Bridget', community: 2}),
(nCharles:User {name: 'Charles', community: 2}),
(nDoug:User {name: 'Doug', community: 3}),
(nMark:User {name: 'Mark', community: 5}),
(nMichael:User {name: 'Michael', community: 5}),
(nAlice)-[:LINK {weight: 1}]->(nBridget),
(nAlice)-[:LINK {weight: 1}]->(nCharles),
(nCharles)-[:LINK {weight: 1}]->(nBridget),
(nAlice)-[:LINK {weight: 5}]->(nDoug),
(nMark)-[:LINK {weight: 1}]->(nDoug),
(nMark)-[:LINK {weight: 1}]->(nMichael),
(nMichael)-[:LINK {weight: 1}]->(nMark);
此图包含三个预先计算好的 用户 社区,它们紧密连接。有关可用社区检测算法的更多详细信息,请参阅文档中的 社区算法 部分。社区由每个节点上的 community
节点属性指示。连接每个组件中节点的关系具有一个属性 weight
,它决定关系的强度。
我们现在可以投影该图并将其存储在图目录中。我们将 LINK
关系加载为 UNDIRECTED
方向。
MATCH (source:User)-[r:LINK]->(target:User)
RETURN gds.graph.project(
'myGraph',
source,
target,
{
sourceNodeProperties: source { .community },
targetNodeProperties: target { .community },
relationshipProperties: r { .weight }
},
{ undirectedRelationshipTypes: ['*'] }
)
内存估计
首先,我们将使用 estimate
过程估计运行算法的成本。这可以通过任何执行模式来完成。在本例中,我们将使用 stats
模式。估计算法有助于了解在您的图上运行算法会产生的内存影响。当您稍后实际以其中一种执行模式运行算法时,系统将执行估计。如果估计表明执行很可能超出其内存限制,则会禁止执行。有关更多信息,请参阅 自动估计和执行阻塞。
有关 estimate
的更多详细信息,请参阅 内存估计。
CALL gds.modularity.stats.estimate('myGraph', {
communityProperty: 'community',
relationshipWeightProperty: 'weight'
})
YIELD nodeCount, relationshipCount, bytesMin, bytesMax, requiredMemory
nodeCount | relationshipCount | bytesMin | bytesMax | requiredMemory |
---|---|---|---|---|
6 |
14 |
968 |
968 |
"968 字节" |
流
由于我们在每个节点上都有社区信息,因此我们可以评估它在模块化指标下的效果。请注意,在这种情况下,我们使用了关系由关系属性加权的功能。
模块化流过程会为每个社区返回模块化。这使我们能够直接检查结果或在 Cypher 中对它们进行后处理,而不会产生任何副作用。
有关流模式的更多详细信息,请参阅 流。
stream
模式运行模块化算法CALL gds.modularity.stream('myGraph', {
communityProperty: 'community',
relationshipWeightProperty: 'weight'
})
YIELD communityId, modularity
RETURN communityId, modularity
ORDER BY communityId ASC
communityId | modularity |
---|---|
2 |
0.057851239669421 |
3 |
0.105371900826446 |
5 |
0.130165289256198 |
我们可以看到,加权图中模块化最高的社区是社区 5。这意味着 5 是最“紧密”的社区,因为大多数关系权重都位于社区内部。
统计
有关流模式的更多详细信息,请参阅 统计。
stats
模式运行模块化算法CALL gds.modularity.stats('myGraph', {
communityProperty: 'community',
relationshipWeightProperty: 'weight'
})
YIELD nodeCount, relationshipCount, communityCount, modularity
nodeCount | relationshipCount | communityCount | modularity |
---|---|---|---|
6 |
14 |
3 |
0.293388429752066 |