Leiden

词汇表

有向

有向特性。该算法在有向图上定义良好。

有向

有向特性。该算法忽略图的方向。

有向

有向特性。该算法不在有向图上运行。

无向

无向特性。该算法在无向图上定义良好。

无向

无向特性。该算法忽略图的无向性。

异构节点

异构节点 完全支持。该算法能够区分不同类型的节点。

异构节点

异构节点 允许。该算法对所有选定的节点进行类似处理,而不管其标签如何。

异构关系

异构关系 完全支持。该算法能够区分不同类型的关系。

异构关系

异构关系 允许。该算法对所有选定的关系进行类似处理,而不管其类型如何。

加权关系

加权特性。该算法支持使用关系属性作为权重,通过 relationshipWeightProperty 配置参数指定。

加权关系

加权特征。该算法将每种关系视为同等重要,丢弃任何关系权重的值。

简介

Leiden 算法是一种用于检测大型网络中社区的算法。该算法将节点分成不相交的社区,以便最大化每个社区的模块化得分。模块化量化了节点分配到社区的质量,即社区中节点的连接密度,相比于它们在随机网络中的连接密度。

Leiden 算法是一种分层聚类算法,它通过贪婪地优化模块化将社区递归地合并成单个节点,并在浓缩图中重复此过程。它修改了 Louvain 算法以解决其一些缺点,即 Louvain 找到的一些社区连接不佳的情况。这是通过定期随机地将社区分解成更小的、连接良好的社区来实现的。

有关此算法的更多信息,请参阅

运行此算法需要足够的内存可用性。在运行此算法之前,我们建议您阅读 内存估算

语法

本节介绍在每种执行模式下用于执行 Leiden 算法的语法。我们正在描述语法的命名图变体。要了解有关通用语法变体的更多信息,请参阅 语法概述

每种模式下的 Leiden 语法
在命名图上以流模式运行 Leiden。
CALL gds.leiden.stream(
  graphName: String,
  configuration: Map
)
YIELD
  nodeId: Integer,
  communityId: Integer,
  intermediateCommunityIds: List of Integer
表 1. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

存储在目录中的图的名称。

configuration

映射

{}

算法特定和/或图过滤的配置。

表 2. 配置
名称 类型 默认值 可选 描述

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。将包含具有任何给定标签的节点。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。将包含具有任何给定类型的关系。

concurrency

整数

4

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供的 ID,以便更轻松地跟踪算法的进度。

logProgress

布尔值

如果禁用,则不会记录进度百分比。

relationshipWeightProperty

字符串

用作权重的关系属性的名称。如果未指定,则算法以未加权方式运行。

maxLevels

整数

10

图中聚类然后浓缩的最大级别数。

gamma

浮点数

1.0

计算模块化时使用的分辨率参数。在内部,该值除以未加权图的关系数,或所有关系权重的总和。 [1]

theta

浮点数

0.01

控制将社区分解成更小的社区时的随机性。

tolerance

浮点数

0.0001

迭代之间模块化的最小变化。如果模块化的变化小于容差值,则结果被认为是稳定的,算法返回。

includeIntermediateCommunities

布尔值

指示是否写入中间社区。如果设置为 false,则仅持久化最终社区。

seedProperty

字符串

n/a

用于设置节点的初始社区。属性值需要是非负数。

minCommunitySize

整数

0

仅返回社区大小大于或等于给定值的社区内的节点。

1. 较高的分辨率会导致更多社区,而较低的分辨率会导致较少的社区。

表 3. 结果
名称 类型 描述

nodeId

整数

节点 ID。

communityId

整数

最终级别的社区 ID。

intermediateCommunityIds

整数列表

每个级别的社区 ID。如果 includeIntermediateCommunities 设置为 false,则为 Null

在命名图上以统计模式运行 Leiden。
CALL gds.leiden.stats(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  postProcessingMillis: Integer,
  communityCount: Integer,
  ranLevels: Integer,
  modularity: Float,
  modularities: List of Float,
  nodeCount: Integer,
  didConverge: Boolean,
  communityDistribution: Map,
  configuration: Map
表 4. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

存储在目录中的图的名称。

configuration

映射

{}

算法特定和/或图过滤的配置。

表 5. 配置
名称 类型 默认值 可选 描述

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。将包含具有任何给定标签的节点。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。将包含具有任何给定类型的关系。

concurrency

整数

4

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供的 ID,以便更轻松地跟踪算法的进度。

logProgress

布尔值

如果禁用,则不会记录进度百分比。

relationshipWeightProperty

字符串

用作权重的关系属性的名称。如果未指定,则算法以未加权方式运行。

maxLevels

整数

10

图中聚类然后浓缩的最大级别数。

gamma

浮点数

1.0

计算模块化时使用的分辨率参数。在内部,该值除以未加权图的关系数,或所有关系权重的总和。 [2]

theta

浮点数

0.01

控制将社区分解成更小的社区时的随机性。

tolerance

浮点数

0.0001

迭代之间模块化的最小变化。如果模块化的变化小于容差值,则结果被认为是稳定的,算法返回。

includeIntermediateCommunities

布尔值

指示是否写入中间社区。如果设置为 false,则仅持久化最终社区。

seedProperty

字符串

n/a

用于设置节点的初始社区。属性值需要是非负数。

2. 较高的分辨率会导致更多社区,而较低的分辨率会导致较少的社区。

表 6. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

postProcessingMillis

整数

计算百分位数和社区计数所用的毫秒数。

communityCount

整数

找到的社区数量。

ranLevels

整数

算法实际运行的级别数。

modularity

浮点数

最终的模块化得分。

modularities

浮点数列表

每个级别的模块化得分。

nodeCount

整数

图中节点的数量。

didConverge

布尔值

指示算法是否收敛。

communityDistribution

映射

包含最小值、最大值、平均值以及最后一级社区大小的 p1、p5、p10、p25、p50、p75、p90、p95、p99 和 p999 百分位数值的映射。

configuration

映射

用于运行算法的配置。

在命名图上以变异模式运行 Leiden。
CALL gds.leiden.mutate(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  mutateMillis: Integer,
  postProcessingMillis: Integer,
  communityCount: Integer,
  ranLevels: Integer,
  modularity: Float,
  modularities: List of Float,
  nodeCount: Integer,
  didConverge: Boolean,
  nodePropertiesWritten: Integer,
  communityDistribution: Map,
  configuration: Map
表 7. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

存储在目录中的图的名称。

configuration

映射

{}

算法特定和/或图过滤的配置。

表 8. 配置
名称 类型 默认值 可选 描述

mutateProperty

字符串

n/a

将社区 ID 写入的 GDS 图中的节点属性。

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。

concurrency

整数

4

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供的 ID,以便更轻松地跟踪算法的进度。

relationshipWeightProperty

字符串

用作权重的关系属性的名称。如果未指定,则算法以未加权方式运行。

maxLevels

整数

10

图中聚类然后浓缩的最大级别数。

gamma

浮点数

1.0

计算模块化时使用的分辨率参数。在内部,该值除以未加权图的关系数,或所有关系权重的总和。 [3]

theta

浮点数

0.01

控制将社区分解成更小的社区时的随机性。

tolerance

浮点数

0.0001

迭代之间模块化的最小变化。如果模块化的变化小于容差值,则结果被认为是稳定的,算法返回。

includeIntermediateCommunities

布尔值

指示是否写入中间社区。如果设置为 false,则仅持久化最终社区。

seedProperty

字符串

n/a

用于设置节点的初始社区。属性值需要是非负数。

3. 较高的分辨率会导致更多社区,而较低的分辨率会导致较少的社区。

表 9. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

mutateMillis

整数

向投影图添加属性所用的毫秒数。

postProcessingMillis

整数

计算百分位数和社区计数所用的毫秒数。

communityCount

整数

找到的社区数量。

ranLevels

整数

算法实际运行的级别数。

modularity

浮点数

最终的模块化得分。

modularities

浮点数列表

每个级别的模块化得分。

nodeCount

整数

图中节点的数量。

didConverge

布尔值

指示算法是否收敛。

nodePropertiesWritten

整数

添加到投影图中的属性数量。

communityDistribution

映射

包含最小值、最大值、平均值以及最后一级社区大小的 p1、p5、p10、p25、p50、p75、p90、p95、p99 和 p999 百分位数值的映射。

configuration

映射

用于运行算法的配置。

在命名图上以写入模式运行 Leiden。
CALL gds.leiden.write(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  writeMillis: Integer,
  postProcessingMillis: Integer,
  communityCount: Integer,
  ranLevels: Integer,
  modularity: Float,
  modularities: List of Float,
  nodeCount: Integer,
  didConverge: Boolean,
  nodePropertiesWritten: Integer,
  communityDistribution: Map,
  configuration: Map
表 10. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

存储在目录中的图的名称。

configuration

映射

{}

算法特定和/或图过滤的配置。

表 11. 配置
名称 类型 默认值 可选 描述

nodeLabels

字符串列表

['*']

使用给定的节点标签过滤命名图。将包含具有任何给定标签的节点。

relationshipTypes

字符串列表

['*']

使用给定的关系类型过滤命名图。将包含具有任何给定类型的关系。

concurrency

整数

4

用于运行算法的并发线程数。

jobId

字符串

内部生成

可以提供的 ID,以便更轻松地跟踪算法的进度。

logProgress

布尔值

如果禁用,则不会记录进度百分比。

writeConcurrency

整数

'concurrency' 的值

用于将结果写入 Neo4j 的并发线程数。

writeProperty

字符串

n/a

将社区 ID 写入的 Neo4j 数据库中的节点属性。

relationshipWeightProperty

字符串

用作权重的关系属性的名称。如果未指定,则算法以未加权方式运行。

maxLevels

整数

10

图中聚类然后浓缩的最大级别数。

gamma

浮点数

1.0

计算模块化时使用的分辨率参数。在内部,该值除以未加权图的关系数,或所有关系权重的总和。 [4]

theta

浮点数

0.01

控制将社区分解成更小的社区时的随机性。

tolerance

浮点数

0.0001

迭代之间模块化的最小变化。如果模块化的变化小于容差值,则结果被认为是稳定的,算法返回。

includeIntermediateCommunities

布尔值

指示是否写入中间社区。如果设置为 false,则仅持久化最终社区。

seedProperty

字符串

n/a

用于设置节点的初始社区。属性值需要是非负数。

minCommunitySize

整数

0

仅将大小大于或等于给定值的社区的社区 ID 写入 Neo4j。

4. 较高的分辨率会导致更多社区,而较低的分辨率会导致较少的社区。

表 12. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据所用的毫秒数。

computeMillis

整数

运行算法所用的毫秒数。

writeMillis

整数

向投影图添加属性所用的毫秒数。

postProcessingMillis

整数

计算百分位数和社区计数所用的毫秒数。

communityCount

整数

找到的社区数量。

ranLevels

整数

算法实际运行的级别数。

modularity

浮点数

最终的模块化得分。

modularities

浮点数列表

每个级别的模块化得分。

nodeCount

整数

图中节点的数量。

didConverge

布尔值

指示算法是否收敛。

nodePropertiesWritten

整数

添加到 Neo4j 数据库中的属性数量。

communityDistribution

映射

包含最小值、最大值、平均值以及最后一级社区大小的 p1、p5、p10、p25、p50、p75、p90、p95、p99 和 p999 百分位数值的映射。

configuration

映射

用于运行算法的配置。

示例

以下所有示例都应在空数据库中运行。

这些示例使用 Cypher 投影 作为规范。原生投影将在将来的版本中弃用。

在本节中,我们将展示在具体图上运行 Leiden 社区检测算法的示例。目的是说明结果是什么样子,并提供有关如何在实际环境中使用该算法的指南。我们将在少数几个节点以特定模式连接的小型社交网络图上进行此操作。示例图如下所示

Visualization of the example graph
以下 Cypher 语句将在 Neo4j 数据库中创建示例图
CREATE
  (nAlice:User {name: 'Alice', seed: 42}),
  (nBridget:User {name: 'Bridget', seed: 42}),
  (nCharles:User {name: 'Charles', seed: 42}),
  (nDoug:User {name: 'Doug'}),
  (nMark:User {name: 'Mark'}),
  (nMichael:User {name: 'Michael'}),

  (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);

此图有两个紧密连接的用户集群。这些集群通过一条边连接。关系属性weight确定节点之间每个关系的强度。

现在,我们可以投影图并将其存储在图目录中。我们将LINK关系加载,并将方向设置为UNDIRECTED,因为这最适合 Leiden 算法。

以下语句将投影图并将其存储在图目录中。
MATCH (source:User)-[r:LINK]->(target:User)
RETURN gds.graph.project(
  'myGraph',
  source,
  target,
  {
    sourceNodeProperties: source { .seed },
    targetNodeProperties: target { .seed },
    relationshipProperties: r { .weight }
  },
  { undirectedRelationshipTypes: ['*'] }
)

在以下示例中,我们将演示在此图上使用 Leiden 算法。

内存估算

首先,我们将使用estimate过程估算运行算法的成本。这可以通过任何执行模式完成。在本例中,我们将使用write模式。估算算法有助于了解在您的图上运行算法将产生的内存影响。当您稍后在其中一种执行模式下实际运行算法时,系统将执行估算。如果估算表明执行很有可能超出其内存限制,则会禁止执行。要详细了解此内容,请参阅 自动估算和执行阻止

有关estimate的更多详细信息,请参阅 内存估算

以下将估算以写入模式运行算法所需的内存
CALL gds.leiden.write.estimate('myGraph', {writeProperty: 'communityId', randomSeed: 19})
YIELD nodeCount, relationshipCount, requiredMemory
表 13. 结果
nodeCount relationshipCount requiredMemory

6

14

"[551 KiB ... 551 KiB]"

stream执行模式下,算法返回每个节点的社区 ID。这使我们能够直接检查结果或在 Cypher 中对其进行后处理,而不会产生任何副作用。

有关stream模式的更多详细信息,请参阅

以下将运行算法并流式传输结果
CALL gds.leiden.stream('myGraph', { randomSeed: 19 })
YIELD nodeId, communityId
RETURN gds.util.asNode(nodeId).name AS name, communityId
ORDER BY name ASC
表 14. 结果
name communityId

"Alice"

1

"Bridget"

1

"Charles"

1

"Doug"

5

"Mark"

5

"Michael"

5

我们对过程配置参数使用默认值。maxLevels设置为 10,gammatheta参数分别设置为 1.0 和 0.01。

统计

stats执行模式下,算法返回包含算法结果摘要的一行。此执行模式没有任何副作用。它可以通过检查computeMillis返回值来评估算法性能,这很有用。在以下示例中,我们将省略返回计时。可以在 语法部分中找到该过程的完整签名。

有关stats模式的更多详细信息,请参阅 统计

以下将运行算法并以统计和测量值的形式返回结果
CALL gds.leiden.stats('myGraph', { randomSeed: 19 })
YIELD communityCount
表 15. 结果
communityCount

2

变异

mutate 执行模式扩展了 stats 模式,并增加了一个重要的副作用:使用包含节点社区 ID 的新节点属性更新命名图。新属性的名称使用强制配置参数 mutateProperty 指定。结果是一个类似于 stats 的单个摘要行,但包含一些额外的指标。当多个算法一起使用时,mutate 模式特别有用。

有关 mutate 模式的更多详细信息,请参阅 Mutate

以下将运行算法并将结果存储在 myGraph
CALL gds.leiden.mutate('myGraph', { mutateProperty: 'communityId', randomSeed: 19 })
YIELD communityCount
表 16. 结果
communityCount

2

mutate 模式下,过程只返回一行。结果包含元信息,例如识别出的社区数量。结果写入 GDS 内存图而不是 Neo4j 数据库。

写入

write 执行模式扩展了 stats 模式,并增加了一个重要的副作用:将每个节点的社区 ID 作为属性写入 Neo4j 数据库。新属性的名称使用强制配置参数 writeProperty 指定。结果是一个类似于 stats 的单个摘要行,但包含一些额外的指标。write 模式可以将结果直接持久化到数据库。

有关 write 模式的更多详细信息,请参阅 Write

以下将运行算法并将结果存储在 Neo4j 数据库中
CALL gds.leiden.write('myGraph', { writeProperty: 'communityId', randomSeed: 19 })
YIELD communityCount, nodePropertiesWritten
表 17. 结果
communityCount nodePropertiesWritten

2

6

write 模式下,过程只返回一行。结果包含元信息,例如识别出的社区数量。结果写入 Neo4j 数据库而不是 GDS 内存图。

加权

Leiden 算法也可以在加权图上运行,在计算模块化时考虑给定的关系权重。

以下将在加权图上运行算法并流式传输结果
CALL gds.leiden.stream('myGraph', { relationshipWeightProperty: 'weight', randomSeed: 19 })
YIELD nodeId, communityId
RETURN gds.util.asNode(nodeId).name AS name, communityId
ORDER BY name ASC
表 18. 结果
name communityId

"Alice"

4

"Bridget"

1

"Charles"

1

"Doug"

4

"Mark"

5

"Michael"

5

使用加权关系,我们看到 AliceDoug 形成了自己的社区,因为它们的链接比所有其他链接都强得多。

使用中间社区

如前所述,Leiden 是一种分层聚类算法。这意味着在每个聚类步骤之后,属于同一簇的所有节点都将简化为一个节点。同一簇中的节点之间的关系成为自关系,与其他簇中的节点的关系连接到簇的代表。然后使用此压缩图来运行下一级聚类。重复此过程,直到簇稳定。

为了演示这种迭代行为,我们需要构建一个更复杂的图。

CREATE (a:Node {name: 'a'})
CREATE (b:Node {name: 'b'})
CREATE (c:Node {name: 'c'})
CREATE (d:Node {name: 'd'})
CREATE (e:Node {name: 'e'})
CREATE (f:Node {name: 'f'})
CREATE (g:Node {name: 'g'})
CREATE (h:Node {name: 'h'})
CREATE (i:Node {name: 'i'})
CREATE (j:Node {name: 'j'})
CREATE (k:Node {name: 'k'})
CREATE (l:Node {name: 'l'})
CREATE (m:Node {name: 'm'})
CREATE (n:Node {name: 'n'})
CREATE (x:Node {name: 'x'})

CREATE (a)-[:TYPE]->(b)
CREATE (a)-[:TYPE]->(d)
CREATE (a)-[:TYPE]->(f)
CREATE (b)-[:TYPE]->(d)
CREATE (b)-[:TYPE]->(x)
CREATE (b)-[:TYPE]->(g)
CREATE (b)-[:TYPE]->(e)
CREATE (c)-[:TYPE]->(x)
CREATE (c)-[:TYPE]->(f)
CREATE (d)-[:TYPE]->(k)
CREATE (e)-[:TYPE]->(x)
CREATE (e)-[:TYPE]->(f)
CREATE (e)-[:TYPE]->(h)
CREATE (f)-[:TYPE]->(g)
CREATE (g)-[:TYPE]->(h)
CREATE (h)-[:TYPE]->(i)
CREATE (h)-[:TYPE]->(j)
CREATE (i)-[:TYPE]->(k)
CREATE (j)-[:TYPE]->(k)
CREATE (j)-[:TYPE]->(m)
CREATE (j)-[:TYPE]->(n)
CREATE (k)-[:TYPE]->(m)
CREATE (k)-[:TYPE]->(l)
CREATE (l)-[:TYPE]->(n)
CREATE (m)-[:TYPE]->(n);
以下语句将投影图并将其存储在图目录中。
MATCH (source:Node)
OPTIONAL MATCH (source)-[r:TYPE]->(target:Node)
RETURN gds.graph.project(
  'myGraph2',
  source,
  target,
  {},
  { undirectedRelationshipTypes: ['*'] }
)

流式传输中间社区

以下将运行算法并流式传输结果,包括中间社区
CALL gds.leiden.stream('myGraph2', {
  randomSeed: 23,
  includeIntermediateCommunities: true,
  concurrency: 1
})
YIELD nodeId, communityId, intermediateCommunityIds
RETURN gds.util.asNode(nodeId).name AS name, communityId, intermediateCommunityIds
ORDER BY name ASC
表 19. 结果
name communityId intermediateCommunityIds

"a"

4

[2, 4]

"b"

4

[2, 4]

"c"

5

[7, 5]

"d"

4

[2, 4]

"e"

5

[6, 5]

"f"

5

[7, 5]

"g"

5

[7, 5]

"h"

5

[11, 5]

"i"

5

[11, 5]

"j"

1

[12, 1]

"k"

1

[12, 1]

"l"

1

[12, 1]

"m"

1

[12, 1]

"n"

1

[12, 1]

"x"

5

[6, 5]

种子

可以增量运行 Louvain 算法,方法是提供一个种子属性。如果指定,种子属性将为加载节点的子集提供初始社区映射。算法将尝试保留种子社区 ID。

以下将运行算法并为种子图流式传输结果
CALL gds.leiden.stream('myGraph', { seedProperty: 'seed' })
YIELD nodeId, communityId, intermediateCommunityIds
RETURN gds.util.asNode(nodeId).name AS name, communityId, intermediateCommunityIds
ORDER BY name ASC
表 20. 结果
name communityId intermediateCommunityIds

"Alice"

42

"Bridget"

42

"Charles"

42

"Doug"

45

"Mark"

45

"Michael"

45

可以看出,使用种子图,节点 Alice 保留了其初始社区 ID 42。另一个社区已分配了一个新的社区 ID,该 ID 保证大于最大的种子社区 ID。请注意,为了保留种子值,不能将 consecutiveIds 配置选项与种子一起使用。

变异中间社区

以下将运行算法并使用中间社区变异内存图
CALL gds.leiden.mutate('myGraph2', {
  mutateProperty: 'intermediateCommunities',
  randomSeed: 23,
  includeIntermediateCommunities: true,
  concurrency: 1
})
YIELD communityCount, modularity, modularities
表 21. 结果
communityCount modularity modularities

3

0.3624

[0.3296, 0.3624]

以下从内存图中流式传输变异属性
CALL gds.graph.nodeProperty.stream('myGraph2', 'intermediateCommunities')
YIELD nodeId, propertyValue
RETURN
  gds.util.asNode(nodeId).name AS name,
  toIntegerList(propertyValue) AS intermediateCommunities
ORDER BY name ASC
表 22. 结果
name intermediateCommunities

"a"

[2, 4]

"b"

[2, 4]

"c"

[7, 5]

"d"

[2, 4]

"e"

[6, 5]

"f"

[7, 5]

"g"

[7, 5]

"h"

[11, 5]

"i"

[11, 5]

"j"

[12, 1]

"k"

[12, 1]

"l"

[12, 1]

"m"

[12, 1]

"n"

[12, 1]

"x"

[6, 5]

写入中间社区

以下将运行算法并将中间社区写入 Neo4j 数据库
CALL gds.leiden.write('myGraph2', {
  writeProperty: 'intermediateCommunities',
  randomSeed: 19,
  includeIntermediateCommunities: true,
  concurrency: 1
})
YIELD communityCount, modularity, modularities
表 23. 结果
communityCount modularity modularities

3

0.3624

[0.3296, 0.3624]

以下从 Neo4j 数据库中流式传输写入的属性
MATCH (n:Node) RETURN n.name AS name, toIntegerList(n.intermediateCommunities) AS intermediateCommunities
ORDER BY name ASC
表 24. 结果
name intermediateCommunities

"a"

[2, 4]

"b"

[2, 4]

"c"

[7, 5]

"d"

[2, 4]

"e"

[6, 5]

"f"

[7, 5]

"g"

[7, 5]

"h"

[11, 5]

"i"

[11, 5]

"j"

[12, 1]

"k"

[12, 1]

"l"

[12, 1]

"m"

[12, 1]

"n"

[12, 1]

"x"

[6, 5]