结合多个MATCH密码查询的收集结果

时间:2016-12-30 11:00:16

标签: neo4j cypher

我有一个图表,其中(: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)

  4. 我正在提供(: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子句中逐个匹配每个模式,并使用(:destType)子句将MATCH的一个WITH输出提供给下一个destType。最后,我将返回所有WITH个。

    Q1。但这并没有执行。当我运行其中一个模式(单(:destType))时,它会正确返回与路径匹配的destType。但是使用上面的查询它返回0行。为什么会这样?

    Q2。此外,我想返回包含所有这些元素的单个集合,而不是返回所有+。知道可以使用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
    

    注意
    之后我需要为每个模式添加不同的过滤器。因此,未来的查询可能如下所示:

     Intent i = new Intent(MainActivity2.this, MainActivity8.class);
    

1 个答案:

答案 0 :(得分:2)

鉴于这些模式可能存在或者可能不存在,并且您希望最终收集所有结果,一个好的方法是首先匹配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