我有一个起始节点,我应该找到可以使用 3 种不同关系类型找到的所有匹配节点。
例如:
(n1:NodeType1)-[:Use|Realisation|Aggregation]-(n2:NodeType2)
我将如何编写一个查询,仅在一个方向上使用
n2
和 Use
关系搜索 Realisation
,而在另一个方向上仅使用 Aggregation
?它可以是三者的任意组合,20 跳以内。
它应该能够涵盖所有组合。例子:
(n1)<-[:Use]-()-[:Aggregation]->()<-[:Use]-()<-[:Realisation]-()-[:Aggregation]->(n2)
(n1)-[:Aggregation]->()-[:Aggregation]->()<-[:Use]-(n2)
我目前写的是:
MATCH (n1:`NodeType1`)<-[:`Use`|`Realisation`*0..20]-()-[`Aggregation`*0..20]->(n2:`NodeType2`)
我遇到一个问题,在使用“聚合”关系后,它不再检查其他两个关系。另一个问题是,理论上可以达到 40 跳,尽管我希望将其限制为最大 20。
对我如何实现这一目标有任何帮助吗?
注意:由于您的最大路径长度为 20,因此任何查询都可能需要很长时间或耗尽内存,具体取决于您的数据特征。
此查询使用这 3 种关系类型在任何方向上查找长度不超过 20 的每条路径,然后过滤出每种类型都指向所需方向的路径(
Aggregation
必须指向右侧,其他必须指向左侧)。
MATCH p=(:NodeType1)-[:Use|Realisation|Aggregation*..20]-(:NodeType2)
WHERE ALL(i IN RANGE(0, LENGTH(p)-1) WHERE NODES(p)[i] = CASE TYPE(RELATIONSHIPS(p)[i])
WHEN 'Aggregation' THEN
STARTNODE(RELATIONSHIPS(p)[i])
ELSE
ENDNODE(RELATIONSHIPS(p)[i]) END
)
RETURN p
这可能比方法 1 更快。
此查询使用 APOC 过程 apoc.path.expandConfig,它对像您这样的使用情况有特殊支持。
MATCH (n:NodeType1)
CALL apoc.path.expandConfig(n, {
relationshipFilter: "<Use|<Realisation|Aggregation>",
labelFilter: ">NodeType2",
minLevel: 1,
maxLevel: 20
}) YIELD path
RETURN path