电导率指标

词汇表

有向

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

有向

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

有向

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

无向

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

无向

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

异构节点

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

异构节点

异构节点 允许。该算法以相同的方式对待所有选定的节点,无论其标签如何。

异构关系

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

异构关系

异构关系 允许。该算法以相同的方式对待所有选定的关系,无论其类型如何。

加权关系

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

加权关系

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

介绍

电导率 是一种指标,可用于评估社区检测的质量。社区 C 中的节点关系连接到 C 内或 C 外的节点。电导率是指向 C 外的关系数量与 C 的总关系数量之比。电导率越低,社区的“凝聚力”就越强。

Yang 和 Leskovec 在论文 “基于真值的网络社区定义与评估” 中指出,电导率是评估真实世界图的实际社区的非常好的指标。

该算法在时间上与图中关系的数量呈线性关系。

语法

本节介绍在每种执行模式下执行电导率算法时使用的语法。我们正在描述命名的图变体语法。要详细了解一般语法变体,请参阅 语法概述

示例 1. 每种模式的电导率语法
在命名的图上以流模式运行电导率。
CALL gds.conductance.stream(
  graphName: String,
  configuration: Map
) YIELD
  community: Integer,
  conductance: Float
表 1. 参数
名称 类型 默认 可选 描述

graphName

字符串

n/a

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

configuration

映射

{}

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

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

nodeLabels

字符串列表

['*']

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

relationshipTypes

字符串列表

['*']

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

concurrency

整数

4

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

jobId

字符串

内部生成

一个 ID,可用于更轻松地跟踪算法的进度。

logProgress

布尔值

true

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

relationshipWeightProperty

字符串

null

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

communityProperty

字符串

n/a

保存社区 ID 的节点属性,每个节点的社区 ID 为整数。请注意,只有非负社区 ID 被视为有效,并且将计算其电导率。

表 3. 结果
名称 类型 描述

community

整数

社区 ID。

conductance

浮点数

社区的电导率。

只有非负社区 ID 有效用于识别社区。具有负社区 ID 的节点只会参与计算,只要它们与有效社区中的节点相连,从而有助于这些有效社区的外部关系计数。

示例

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

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

在本节中,我们将展示在具体图上运行电导率算法的示例。目的是说明结果是什么样的,并提供如何在实际环境中使用该算法的指南。我们将对一小部分节点以特定模式连接的社交网络图进行此操作。示例图如下所示

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,因为这最适合 Louvain 算法,我们将在该算法中创建社区,然后使用电导率对其进行评估。

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

现在,我们运行 Louvain 算法 以将节点划分为社区,然后我们可以对其进行评估。

以下将运行 Louvain 算法并将结果存储在myGraph
CALL gds.louvain.mutate('myGraph', { mutateProperty: 'community', relationshipWeightProperty: 'weight' })
YIELD communityCount
表 4. 结果
communityCount

3

现在,我们的内存图myGraph已填充了节点属性,这些属性位于community键下,我们可以将其设置为使用电导率进行评估的输入。现在,节点被分配到以下社区中

表 5. 社区分配
name community

"Alice"

1

"Bridget"

3

"Charles"

3

"Doug"

1

"Mark"

5

"Michael"

5

有关如何获取此分配表的更多信息,请参见 流节点属性 过程。

有关 Louvain 的更多信息,请参见其 算法页面

由于我们现在有了社区检测,因此我们可以使用电导率指标评估其好坏。请注意,在本例中,我们使用关系通过关系属性加权的功能。

电导率流过程返回每个社区的电导率。这使我们能够直接检查结果或在 Cypher 中对其进行后处理,而不会产生任何副作用。

有关一般流模式的更多详细信息,请参见

以下将在stream模式下运行电导率算法
CALL gds.conductance.stream('myGraph', { communityProperty: 'community', relationshipWeightProperty: 'weight' })
YIELD community, conductance
表 6. 结果
community conductance

1

0.23076923076923078

3

0.5

5

0.2

我们可以看到,权重图中电导率最低的社区是社区 5。这意味着 5 是最“紧密结合”的社区,因为其大多数关系权重都位于社区内部。