路径折叠
此功能处于 Beta 级别。有关功能级别的更多信息,请参见 API 级别.
介绍
路径折叠算法是一种遍历算法,能够在遍历的起点和终点节点之间创建关系。换句话说,起点节点和终点节点之间的路径被折叠成单个关系(一条直接路径)。该算法旨在支持许多图算法所需的单部图的创建。
该算法的主要输入是路径模板列表。从指定图中的每个节点开始,使用配置中指定的顺序依次遍历每个模板的关系。仅使用遍历完整个路径后到达的节点作为终点节点。对于至少存在一条从起点到终点节点的路径的每对节点,仅创建一个有向关系。
语法
CALL gds.collapsePath.mutate(
graphName: String,
configuration: Map
)
YIELD
preProcessingMillis: Integer,
computeMillis: Integer,
mutateMillis: Integer,
relationshipsWritten: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定配置和/或图过滤的配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
nodeLabels |
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。 |
concurrency |
整数 |
|
是 |
用于运行算法的并发线程数。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
pathTemplates |
字符串列表列表 |
|
否 |
路径模板是有序的关系类型列表,用于遍历。可以多次添加相同的类型,以按指示的方式遍历它们。此外,可以指定多个路径模板以一次性处理。 |
mutateRelationshipType |
字符串 |
|
否 |
新创建关系的关系类型。 |
allowSelfLoops |
布尔值 |
|
是 |
指示是否可以创建自引用关系,即起点和终点节点相同的关 |
名称 | 类型 | 描述 |
---|---|---|
|
整数 |
预处理数据的毫秒数。 |
|
整数 |
运行算法的毫秒数。 |
|
整数 |
将属性添加到投影图的毫秒数。 |
|
整数 |
算法创建的关系数。 |
|
映射 |
用于运行算法的配置。 |
示例
以下所有示例都应在空数据库中运行。 这些示例使用 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
relationshipsWritten |
---|
4 |
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)