我有两个不同的父节点,它们都具有特定关系类型的特定关系(指向各种第三和第四个子节点)。只有一个父节点具有不同关系类型的另一种关系(指向各种第五和第六子节点)。我想编写一个使用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;
答案 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