我有以下情况: 在我的路径中的某个点(在距离我的起始节点几个链接的节点中), 我有可能沿着一条或另一条路走下去,例如: 如果S是我的startnode,
S-[]->..->(B)-[first:FIRST_WAY]->(...) ,
和
S-[]->..->(B)-[second:SECOND_WAY]->(...)
在交接点,我只需要沿着一条路走下去(第一个或第二个) 理想情况下,我希望关注并包含来自第二关系的结果,仅当 第一个不存在时(无论之后是什么) )。 这可以通过Cypher 1.9.7在单个查询中实现吗?
答案 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]->()
,然后检查匹配的模式,根据关系丢弃一些结果路径类型。