单Cypher查询可在2种不同路径之间进行选择

时间:2014-06-30 15:24:45

标签: neo4j cypher

我有以下情况: 在我的路径中的某个点(在距离我的起始节点几个链接的节点中), 我有可能沿着一条或另一条路走下去,例如: 如果S是我的startnode,

S-[]->..->(B)-[first:FIRST_WAY]->(...) ,

S-[]->..->(B)-[second:SECOND_WAY]->(...) 

在交接点,我只需要沿着一条路走下去(第一个第二个) 理想情况下,我希望关注并包含来自第二关系的结果,仅当 第一个不存在时(无论之后是什么) )。 这可以通过Cypher 1.9.7在单个查询中实现吗?

1 个答案:

答案 0 :(得分:1)

一种方法是使用可选匹配来分别匹配模式。例如:

MATCH (n:Object) OPTIONAL MATCH (n)-[r1:FIRST_WAY]->(:Object)-->(f1:Object) OPTIONAL MATCH (n)-[r2:SECOND_WAY]->()-->(f2:Object) RETURN coalesce(f2, f1)

此查询将有条件地匹配,coalesce函数将返回第一个非空的结果。

AFAIK,OPTIONAL_MATCH是在2.0中引入的,所以你不能在1.9中使用该子句,但是有另一种语法:

CYPHER 1.9 START n=node(*) MATCH (n)-[r1?:FIRST_WAY]->()-->(f1), (n)-[r2?:SECOND_WAY]->()-->(f2) RETURN coalesce(f2, f1)

我确定还有其他方法可以做到这一点,可能使用OR运算符进行关系匹配,即()-[r:FIRST_WAY|SECOND_WAY]->(),然后检查匹配的模式,根据关系丢弃一些结果路径类型。