Neo4j 在组合不同方向的关系类型时搜索节点?

问题描述 投票:0回答:1

我有一个起始节点,我应该找到可以使用 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。

对我如何实现这一目标有任何帮助吗?

neo4j cypher
1个回答
0
投票

注意:由于您的最大路径长度为 20,因此任何查询都可能需要很长时间或耗尽内存,具体取决于您的数据特征。

方法1

此查询使用这 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

方法2

这可能比方法 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
© www.soinside.com 2019 - 2024. All rights reserved.