2016-12-10 23 views
1

我想回到所有节点一个b,其中b不是通过与关系相对开始的任何路径一个下游。我不断发现自己不得不编写一个条件,其中一个通过相对,还有一个间接的情况下直接链接到b的情况下,导致了这样的事情:暗号:量化的零个以上的节点,然后-关系

//Semi-pseudo-code. 
match   (a)-[*]->(b) 
optional match dir=(a)-[:rel]->(b) 
optional match indir=(a)-[:rel]-()-[*]->(b) 
where   length(dir)=0 
and    length(indir)=0 
return   a,b 

有更简单的方法?真的,我想是这样的,在这里裸量词表示“零个或多个节点,然后-关系”:

match   (a)-[*]->(b) 
match not  (a)-[:rel]-*->(b) 
return   a,b 

注:我怀疑这可能从根本是一样的我的最后一个问题:Cypher: Matching nodes at arbitrary depth via a strictly alternating set of relations

回答

2

我们可以使用WHERE NOT制定负的条件下,以类似的方式,以你的第二个半伪代码:

MATCH  (a)-[*]->(b) 
WHERE NOT ((a)-[:rel]->()-[*1..]->(b)) 
RETURN a, b 

当然,这将是什么,但有效的,所以你至少应该尝试限制标签和b以及它们之间的关系,例如, (a:Label1)-[:rel1|rel2*]->(b:Label2)

一个例子:

CREATE 
    (n1:N {name: "n1"}), 
    (n2:N {name: "n2"}), 
    (n3:N {name: "n3"}), 
    (n4:N {name: "n4"}), 
    (n5:N {name: "n5"}), 
    (n1)-[:x]->(n2), 
    (n3)-[:rel]->(n4), 
    (n4)-[:x]->(n5) 

enter image description here

查询结果:

╒══════════╤══════════╕ 
│a   │b   │ 
╞══════════╪══════════╡ 
│{name: n1}│{name: n2}│ 
├──────────┼──────────┤ 
│{name: n4}│{name: n5}│ 
└──────────┴──────────┘ 

正如你所看到的,它不包括n3n5,因为它有一个开始:rel关系。

+0

感谢您的回复。但是,您的代码是否仍然与直接案例相匹配?: (a) - [:rel] - >(b) 我需要排除该情况。 (或者我误解了?) –

+0

好点 - [可变长度关系](https://neo4j.com/docs/developer-manual/current/cypher/#_variable_length_relationships)缺省为1的“minHops”值。I fixed该查询将在一分钟内添加一个示例。 –

1

这应该工作:

MATCH (a)-[rs*]->(b) 
WHERE TYPE(rs[0]) <> 'rel' 
RETURN a, b; 

但是,下面的查询应该是更高性能,因为它过滤掉所有不需要的路径开始它非常昂贵的可变长度路径搜索之前。 *0..语法使得可变长度搜索对长度使用下限0(因此x也将作为b返回)。

MATCH (a)-[r]->(x) 
WHERE TYPE(r) <> 'rel' 
MATCH (x)-[*0..]->(b) 
RETURN a, b; 
相关问题