说话者-监听者标签传播

此功能处于 Alpha 级别。有关功能级别的更多信息,请参见 API 级别.

词汇表

有向

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

有向

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

有向

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

无向

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

无向

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

异构节点

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

异构节点

异构节点 允许。该算法无论节点的标签如何,都将所有选定的节点视为相同。

异构关系

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

异构关系

异构关系 允许。该算法无论关系的类型如何,都将所有选定的关系视为相同。

加权关系

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

加权关系

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

简介

说话者-监听者标签传播算法 (SLLPA) 是标签传播算法的一种变体,它能够检测每个节点的多个社区。GDS 实现基于 Xie 等人发表的 SLPA:通过说话者-监听者交互动态过程在社交网络中发现重叠社区 论文。

该算法本质上是随机的,不会产生确定性结果。为了适应这一点,我们建议使用更多的迭代次数。

语法

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

每个模式的 SLLPA 语法
在命名的图上以流模式运行 SLLPA。
CALL gds.sllpa.stream(
  graphName: String,
  configuration: Map
)
YIELD
  nodeId: Integer,
  values: Map {
    communtiyIds: List of Integer
  }
表 1. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

配置

地图

{}

针对算法特性的配置和/或图过滤。

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

并发性

整数

4

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

jobId

字符串

内部生成

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

logProgress

布尔值

真的

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

maxIterations

整数

n/a

要运行的最大迭代次数。

minAssociationStrength

字符串

0.2

社区保留节点所需的最小影响力。

分区

字符串

"范围"

用于将工作分配到线程之间的分区方案。可用选项是 AUTORANGEDEGREE

表 3. 结果
名称 类型 描述

nodeId

整数

节点 ID。

地图

包含键 communityIds 的地图。

在命名图上以统计模式运行 SLLPA。
CALL gds.sllpa.stats(
  graphName: String,
  configuration: Map
)
YIELD
  ranIterations: Integer,
  didConverge: Boolean,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  configuration: Map
表 4. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

配置

地图

{}

针对算法特性的配置和/或图过滤。

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

并发性

整数

4

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

jobId

字符串

内部生成

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

logProgress

布尔值

真的

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

maxIterations

整数

n/a

要运行的最大迭代次数。

minAssociationStrength

字符串

0.2

社区保留节点所需的最小影响力。

分区

字符串

"范围"

用于将工作分配到线程之间的分区方案。可用选项是 AUTORANGEDEGREE

表 6. 结果
名称 类型 描述

ranIterations

整数

运行的迭代次数。

didConverge

布尔值

指示算法是否收敛。

preProcessingMillis

整数

预处理图的毫秒数。

computeMillis

整数

运行算法的毫秒数。

配置

地图

用于运行算法的配置。

在命名图上以变异模式运行 SLLPA。
CALL gds.sllpa.mutate(
  graphName: String,
  configuration: Map
)
YIELD
  ranIterations: Integer,
  didConverge: Boolean,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  mutateMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 7. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

配置

地图

{}

针对算法特性的配置和/或图过滤。

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

并发性

整数

4

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

mutateProperty

字符串

""

PregelSchema 中所有公共属性使用的前缀。

jobId

字符串

内部生成

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

maxIterations

整数

n/a

要运行的最大迭代次数。

minAssociationStrength

字符串

0.2

社区保留节点所需的最小影响力。

分区

字符串

"范围"

用于将工作分配到线程之间的分区方案。可用选项是 AUTORANGEDEGREE

表 9. 结果
名称 类型 描述

ranIterations

整数

运行的迭代次数。

didConverge

布尔值

指示算法是否收敛。

preProcessingMillis

整数

预处理图的毫秒数。

computeMillis

整数

运行算法的毫秒数。

mutateMillis

整数

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

nodePropertiesWritten

整数

写入 Neo4j 的属性数量。

配置

地图

用于运行算法的配置。

在命名图上以写入模式运行 SLLPA。
CALL gds.sllpa.write(
  graphName: String,
  configuration: Map
)
YIELD
  ranIterations: Integer,
  didConverge: Boolean,
  preProcessingMillis: Integer,
  computeMillis: Integer,
  writeMillis: Integer,
  nodePropertiesWritten: Integer,
  configuration: Map
表 10. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

配置

地图

{}

针对算法特性的配置和/或图过滤。

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

并发性

整数

4

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

jobId

字符串

内部生成

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

logProgress

布尔值

真的

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

writeConcurrency

整数

'并发性'的值

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

writeProperty

字符串

""

PregelSchema 中所有公共属性使用的前缀。

maxIterations

整数

n/a

要运行的最大迭代次数。

minAssociationStrength

字符串

0.2

社区保留节点所需的最小影响力。

分区

字符串

"范围"

用于将工作分配到线程之间的分区方案。可用选项是 AUTORANGEDEGREE

表 12. 结果
名称 类型 描述

ranIterations

整数

运行的迭代次数。

didConverge

布尔值

指示算法是否收敛。

preProcessingMillis

整数

预处理图的毫秒数。

computeMillis

整数

运行算法的毫秒数。

writeMillis

整数

将结果数据写回的毫秒数。

nodePropertiesWritten

整数

写入 Neo4j 的属性数量。

配置

地图

用于运行算法的配置。

例子

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

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

在本节中,我们将展示在具体图上运行 SLLPA 算法的示例。目的是说明结果的样子,并提供在实际设置中使用算法的指南。我们将在少量节点以特定模式连接的小型社交网络图上执行此操作。示例图如下所示

Visualization of the example graph
以下 Cypher 语句将在 Neo4j 数据库中创建示例图
CREATE
  (a:Person {name: 'Alice'}),
  (b:Person {name: 'Bob'}),
  (c:Person {name: 'Carol'}),
  (d:Person {name: 'Dave'}),
  (e:Person {name: 'Eve'}),
  (f:Person {name: 'Fredrick'}),
  (g:Person {name: 'Gary'}),
  (h:Person {name: 'Hilda'}),
  (i:Person {name: 'Ichabod'}),
  (j:Person {name: 'James'}),
  (k:Person {name: 'Khalid'}),

  (a)-[:KNOWS]->(b),
  (a)-[:KNOWS]->(c),
  (a)-[:KNOWS]->(d),
  (b)-[:KNOWS]->(c),
  (b)-[:KNOWS]->(d),
  (c)-[:KNOWS]->(d),

  (b)-[:KNOWS]->(e),
  (e)-[:KNOWS]->(f),
  (f)-[:KNOWS]->(g),
  (g)-[:KNOWS]->(h),

  (h)-[:KNOWS]->(i),
  (h)-[:KNOWS]->(j),
  (h)-[:KNOWS]->(k),
  (i)-[:KNOWS]->(j),
  (i)-[:KNOWS]->(k),
  (j)-[:KNOWS]->(k);

在示例中,我们将使用 SLLPA 算法来查找图中的社区。

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

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

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

有关 stream 模式的一般详细信息,请参阅 Stream

以下操作将运行算法并流式传输结果
CALL gds.sllpa.stream('myGraph', {maxIterations: 100, minAssociationStrength: 0.1})
YIELD nodeId, values
RETURN gds.util.asNode(nodeId).name AS Name, values.communityIds AS communityIds
  ORDER BY Name ASC
表 13. 结果
名称 communityIds

"爱丽丝"

[0]

"鲍勃"

[0]

"卡罗尔"

[0]

"戴夫"

[0]

"夏娃"

[0, 1]

"弗雷德里克"

[0, 1]

"加里"

[0, 1]

"希尔达"

[1]

"伊卡博德"

[1]

"詹姆斯"

[1]

"哈立德"

[1]

由于算法的随机性,结果在每次运行之间往往会发生变化。