Cypher CASE WHEN / ELSE以及WITH - 有问题返回值

时间:2015-09-23 04:14:25

标签: neo4j cypher

我有两个不同的父节点,它们都具有特定关系类型的特定关系(指向各种第三和第四个子节点)。只有一个父节点具有不同关系类型的另一种关系(指向各种第五和第六子节点)。我想编写一个使用WITH运算符的cypher查询,以便我可以返回父项的node.id(对于RELATIONSHIP_ONE)和target.id的集合数组,用于由RELATIONSHIP_TWO生成的子节点。我遇到cypher查询的问题,返回没有关系类型为RELATIONSHIP_TWO的节点的任何内容

这将返回一个json对象作为数组的第一个索引:

MATCH (n)-[rel_one:RELATIONSHIP_ONE]-()
WHERE  n.id='EXAMPLE_ID_ONE'
WITH   n
MATCH (n)-[rel_two:RELATIONSHIP_TWO]->(target)
RETURN n.id                   AS id, 
       COLLECT(target.id) AS targetlist;")

[
  {
    "id": "EXAMPLE_ID_ONE",
    "targetlist": [
      "target_one_id",
      "target_two_id",
      "target_three_id",
      "target_four_id",
      "target_five_id"
    ]
  }
]

这将返回一个空数组:

MATCH (n)-[rel_one:RELATIONSHIP_ONE]-()
WHERE n.id='EXAMPLE_ID_TWO'
WITH n
MATCH (n)-[rel_two:RELATIONSHIP_TWO]->(target)
RETURN n.id AS id, 
       COLLECT(target.id) AS targetlist;")

[]

因为这个EXAMPLE_ID_TWO密码查询没有结果(其中n和target通过RELATIONSHIP_TWO的关系类型相关),所以它似乎取消了这个密码查询返回n.id值的能力。也许是这样:

[
  {
    "id": "EXAMPLE_ID_TWO",
    "targetlist": []          // or even null
  }
]

我尝试使用CASE WHEN / ELSE表达式,但无法返回值(即使使用EXAMPLE_ID_ONE)。以下示例。如果没有RELATIONSHIP_TW0连接n和目标节点,我想使用空数组作为targetlist的值。我非常感谢你的帮助。

MATCH (n)-[rel_one:RELATIONSHIP_ONE]-()
WHERE n.id='EXAMPLE_ID_ONE'
WITH n
MATCH (n)-[rel_two:RELATIONSHIP_TWO]->(target)
RETURN n.id AS id, 
       CASE WHEN target is NULL THEN []
            ELSE COLLECT(target.id) END AS targetlist;

MATCH (n)-[rel_one:RELATIONSHIP_ONE]-()
WHERE n.id='EXAMPLE_ID_TWO'
WITH n
MATCH (n)-[rel_two:RELATIONSHIP_TWO]->(target)
RETURN n.id AS id, 
       CASE WHEN target is NULL THEN [];
            ELSE COLLECT(target.id) END AS targetlist;

1 个答案:

答案 0 :(得分:1)

使你的第二场比赛成为可选比赛,就像外联赛一样,如果没有比赛也会产生至少一个结果

MATCH (n:Label)
WHERE n.id='EXAMPLE_ID_TWO' and exists((n)-[:RELATIONSHIP_ONE]-())
OPTIONAL MATCH (n)-[:RELATIONSHIP_TWO]->(target)
RETURN n.id AS id, 
       filter(x in COLLECT(target.id) where not x is null) AS targetlist