路径合并
此功能处于 Beta 阶段。有关功能分层的更多信息,请参阅API 层级。
简介
路径合并算法是一种遍历算法,能够创建遍历的起始节点和结束节点之间的关系。换句话说,起始节点和结束节点之间的路径被合并成一个单一的关系(一条直接路径)。该算法旨在支持创建许多图算法所需的单方图。
该算法的主要输入是路径模板列表。从指定图中的每个节点开始,按照配置中指定的顺序,依次遍历每个模板的关系。只有在遍历完整路径后到达的节点才用作结束节点。对于存在至少一条从起始节点到结束节点路径的每对节点,将精确创建一个有向关系。
语法
CALL gds.collapsePath.mutate(
graphName: String,
configuration: Map
)
YIELD
preProcessingMillis: Integer,
computeMillis: Integer,
mutateMillis: Integer,
relationshipsWritten: Integer,
configuration: Map
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
graphName |
字符串 |
|
否 |
存储在目录中的图的名称。 |
configuration |
映射 |
|
是 |
算法特定配置和/或图过滤配置。 |
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
nodeLabels |
字符串列表 |
|
是 |
使用给定的节点标签过滤命名图。 |
整数 |
|
是 |
用于运行算法的并发线程数。 |
|
名称 | 类型 | 默认值 | 可选 | 描述 |
---|---|---|---|---|
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)