将多个MATCH Cypher查询的集合结果合并

3

我有一个图表,其中可以存在三种路径模式,连接(:srcType)(:destType):

  1. 模式1
    (:srcType)<-[]-()<-[]-(srcParent)<-[]-(center)-[]->(destParent)-[]->()-[]->(:destType)
    请注意,这里关系的方向随着路径穿过(center)而反转:<-[]-(center)-[]->

  2. 模式2
    在这种模式下,(srcParent)本身就是中心。因此,关系的方向在(srcParent)处反转:
    (:srcType)<-[]-()<-[]-(srcParent)-[]->(destParent)-[]->()-[]->(:destType)

  3. 模式3
    在这种模式下,(destParent)本身就是中心。因此,关系的方向在(destParent)处反转:
    (:srcType)<-[]-()<-[]-(srcParent)<-[]-(destParent)-[]->()-[]->(:destType)

我正在给出(:srcType)的ID,并尝试获取所有(:destType)节点。请注意,给定一个(:srcType),它可以有一个遵循第一种模式的与之关联的一个(:destType)节点,另一个遵循第二种模式,以及几个遵循第三种模式。我正在尝试检索包含所有这些(:destType)节点的单个集合。因此,我将上述查询组合如下:

MATCH (src:srcType)<-[]-()<-[]-(srcParent)<-[]-(center)-[]->(destParent)-[]->()-[]->(dest1:destType)
WHERE id(src)=3
WITH dest1
MATCH (src:srcType)<-[]-()<-[]-(srcParent)-[]->(destParent)-[]->()-[]->(dest2:destType)
WHERE id(src)=3
WITH dest1, dest2
MATCH (src:srcType)<-[]-()<-[]-(srcParent)<-[]-(destParent)-[]->()-[]->(dest3:destType)
WHERE id(src)=3
RETURN dest1, dest2, dest3

在这里,我正在使用MATCH子句逐一匹配每个模式,并使用WITH子句将一个MATCH的输出(:destType)馈送到下一个中。最后,我返回所有的destType

Q1. 但是它没有执行。当我运行其中一个模式(单个WITH)时,它会正确地返回与路径匹配的任何(:destType)。但是对于上面的查询,它返回了0行。为什么会这样呢?

Q2. 另外,我想返回包含它们所有元素的单个集合而不是返回所有destType。知道可以使用+合并集合,是否可以返回如下内容?

RETURN destType1+destType2+destType2

注意
之后我需要为每个模式添加不同的过滤器。因此,未来的查询可能会像这样:

MATCH (src:srcType)<-[]-()<-[]-(srcParent)<-[]-(center)-[]->(destParent)-[]->()-[]->(dest1:destType)
WHERE id(src)=3 AND srcParent.prop1='a'
WITH dest1
MATCH (src:srcType)<-[]-()<-[]-(srcParent)-[]->(destParent)-[]->()-[]->(dest2:destType)
WHERE id(src)=3 AND destParent.prop2='b'
WITH dest1, dest2
MATCH (src:srcType)<-[]-()<-[]-(srcParent)<-[]-(destParent)-[]->()-[]->(dest3:destType)
WHERE id(src)=3 AND srcParent.prop3='c'
RETURN dest1, dest2, dest3
1个回答

3

鉴于这些模式可能存在也可能不存在,并且您希望在最后获得所有结果的集合,一个好的方法是先匹配 src 节点,然后使用 OPTIONAL MATCH 并在路上收集结果,并添加新的结果。

如果我们修改您的最后一个查询,则可能如下:

MATCH (src:srcType)
WHERE id(src) = 3
OPTIONAL MATCH (src)<-[]-()<-[]-(srcParent)<-[]-(center)-[]->(destParent)-[]->()-[]->(dest1:destType)
WHERE srcParent.prop1='a'
WITH src, COLLECT(dest1) as dests
OPTIONAL MATCH (src)<-[]-()<-[]-(srcParent)-[]->(destParent)-[]->()-[]->(dest2:destType)
WHERE destParent.prop2='b'
WITH src, dests + COLLECT(dest2) as dests
OPTIONAL MATCH (src)<-[]-()<-[]-(srcParent)<-[]-(destParent)-[]->()-[]->(dest3:destType)
WHERE srcParent.prop3='c'
RETURN dests + COLLECT(dest3) as dests

那么,使用逗号分隔的单个MATCH模式或没有OPTIONAL的多个MATCH实际上是AND匹配条件吗? - Mahesha999
出现意外错误:进行晚期语义检查时未定义变量 'dest@523'。 - Mahesha999
我添加了 as destsXas destsYas destsZ。没有行。现在正在调试它。 - Mahesha999
1
还将第一个MATCH变成可选的,同时在每个MATCH中添加了WHERE id(src)=?,这样如果第一个MATCH失败,第二个和第三个就不会得到有效的src。通过这些更改,它现在按预期工作。 - Mahesha999

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接