如何在后续调用过程无返回记录时保留首个MATCH的结果
解决办法
把第二个MATCH换成OPTIONAL MATCH,再用OPTIONAL CALL处理APOC的子图查询,就能保证即使目标节点不存在,a节点也能正常返回。
最终可用的查询语句:
MATCH (a:Person {name: "Stefan"}) OPTIONAL MATCH (p:Person {name: "not_a_real_name"}) OPTIONAL CALL apoc.path.subgraphNodes(p, { relationshipFilter: "KNOWS" }) YIELD node AS b RETURN a, collect(b) AS related_nodes
逻辑说明
OPTIONAL MATCH:和普通MATCH不同,就算找不到p节点,也不会直接让整个查询返回空,而是把p设为null继续执行后续逻辑。OPTIONAL CALL:对应OPTIONAL MATCH的逻辑,当p是null时,这个APOC调用不会产生任何结果,但不会中断查询,所以a节点依然能被返回。collect(b):如果p存在且有相连的KNOWS节点,会把这些节点收集成列表;如果p不存在,就返回空列表,结果更直观。
要是你不需要返回b相关的节点,也可以简化成下面这样,一样能保证a节点正常返回:
MATCH (a:Person {name: "Stefan"}) OPTIONAL MATCH (p:Person {name: "not_a_real_name"}) OPTIONAL CALL apoc.path.subgraphNodes(p, { relationshipFilter: "KNOWS" }) YIELD node AS b RETURN a
内容的提问来源于stack exchange,提问作者Tormod Kvitberg
相关产品推荐
相关产品推荐

