路径折叠

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

介绍

路径折叠算法是一种遍历算法,能够在遍历的起点和终点节点之间创建关系。换句话说,起点节点和终点节点之间的路径被折叠成单个关系(一条直接路径)。该算法旨在支持许多图算法所需的单部图的创建。

该算法的主要输入是路径模板列表。从指定图中的每个节点开始,使用配置中指定的顺序依次遍历每个模板的关系。仅使用遍历完整个路径后到达的节点作为终点节点。对于至少存在一条从起点到终点节点的路径的每对节点,仅创建一个有向关系。

语法

每个模式的路径折叠语法
在命名图上以 mutate 模式运行路径折叠。
CALL gds.collapsePath.mutate(
  graphName: String,
  configuration: Map
)
YIELD
  preProcessingMillis: Integer,
  computeMillis: Integer,
  mutateMillis: Integer,
  relationshipsWritten: Integer,
  configuration: Map
表 1. 参数
名称 类型 默认值 可选 描述

graphName

字符串

n/a

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

configuration

映射

{}

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

表 2. 在命名图上运行算法的通用配置。
名称 类型 默认值 可选 描述

nodeLabels

字符串列表

['*']

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

concurrency

整数

4

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

表 3. 算法特定配置
名称 类型 默认值 可选 描述

pathTemplates

字符串列表列表

n/a

路径模板是有序的关系类型列表,用于遍历。可以多次添加相同的类型,以按指示的方式遍历它们。此外,可以指定多个路径模板以一次性处理。

mutateRelationshipType

字符串

n/a

新创建关系的关系类型。

allowSelfLoops

布尔值

false

指示是否可以创建自引用关系,即起点和终点节点相同的关

表 4. 结果
名称 类型 描述

preProcessingMillis

整数

预处理数据的毫秒数。

computeMillis

整数

运行算法的毫秒数。

mutateMillis

整数

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

relationshipsWritten

整数

算法创建的关系数。

configuration

映射

用于运行算法的配置。

示例

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

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

考虑以下 Cypher 语句创建的图。

CREATE
  (Dan:Person),
  (Annie:Person),
  (Matt:Person),
  (Jeff:Person),

  (Guitar:Instrument),
  (Flute:Instrument),

  (Dan)-[:PLAYS]->(Guitar),
  (Annie)-[:PLAYS]->(Guitar),

  (Matt)-[:PLAYS]->(Flute),
  (Jeff)-[:PLAYS]->(Flute)

在这个例子中,我们想在演奏相同乐器的 `Person` 节点之间创建一个名为 `PLAYS_SAME_INSTRUMENT` 的关系。为了实现这一点,我们必须遍历以下 Cypher 模式指定的路径。

(p1:Person)-[:PLAYS]->(:Instrument)-[:PLAYED_BY]->(p2:Person)

在我们的源图中,只存在 `PLAYS` 关系类型。`PLAYED_BY` 关系类型可以通过以 `REVERSE` 方向加载 `PLAYS` 关系类型来创建。以下查询将投影这样的图。

MATCH (p:Person)-[:PLAYS]->(i:Instrument)
CALL {
  WITH p, i
  RETURN id(p) AS sourceId, id(i) AS targetId, 'PLAYS' AS rType
  UNION
  WITH p, i
  RETURN id(i) AS sourceId, id(p) AS targetId, 'PLAYED_BY' AS rType
}
RETURN gds.graph.project('persons', sourceId, targetId, { relationshipType: rType })

现在,我们可以在 `pathTemplates` 选项中指定遍历 `PLAYS, PLAYED_BY` 来运行算法。

CALL gds.collapsePath.mutate(
  'persons',
  {
    pathTemplates: [['PLAYS', 'PLAYED_BY']],
    allowSelfLoops: false,
    mutateRelationshipType: 'PLAYS_SAME_INSTRUMENT'
  }
) YIELD relationshipsWritten
表 5. 结果
relationshipsWritten

4

当按 `PLAYS_SAME_INSTRUMENT` 关系过滤时,突变后的图将看起来像以下图。
CREATE
  (Dan:Person),
  (Annie:Person),
  (Matt:Person),
  (Jeff:Person),

  (Guitar:Instrument),
  (Flute:Instrument),

  (Dan)-[:PLAYS_SAME_INSTRUMENT]->(Annie),
  (Annie)-[:PLAYS_SAME_INSTRUMENT]->(Dan),

  (Matt)-[:PLAYS_SAME_INSTRUMENT]->(Jeff),
  (Jeff)-[:PLAYS_SAME_INSTRUMENT]->(Matt)