如何从任何深度的关系中获取节点,包括关系过滤器

时间:2013-10-01 07:49:47

标签: neo4j cypher

我正在使用与此类似的查询:

(n)-[*]->(m)
Any depth.

但我不能在这样的查询中过滤关系名称:

(n)-[*:DOES]->(m)
Any depth.

我需要过滤关系名称,因为相关路径上存在不同的关系。如果有帮助,这是我的图表:

CREATE (Computer { name:'Computer' }),(Programming { name:'Programming' }),(Java { name:'Java' }),(GUI { name:'GUI' }),(Button { name:'Button' }), Computer<-[:IS]-Programming, Programming<-[:IS]-Java, Java<-[:IS]-GUI, GUI<-[:IS]-Button, (Ekin { name:'Ekin' }), (Gunes { name:'Gunes' }), (Ilker {name:'Ilker'}), Ekin-[:DOES]->Programming, Ilker-[:DOES]->Java, Ilker-[:DOES]->Button, Gunes-[:DOES]->Java

我想得到任何深度与“编程”相关的“DOES”关系的名字(Ekin,Ilker和Gunes)。

修改

我可以通过合并两个不同的查询结果来获取我想要的值(想想13是我想要达到的顶级节点):

START n=node(13) 
MATCH p-[:DOES]->()-[*]->(n) 
RETURN DISTINCT p

START n=node(13) 
MATCH p-[:DOES]->(n) 
RETURN DISTINCT p

我想在一个查询中执行此操作。

2 个答案:

答案 0 :(得分:1)

将匹配模式更改为“p - [:DOES] - &gt;() - [* 0 ..] - &gt; n”,

Match p-[:DOES]->()-[*0..]->n
Return distinct p.name

可变长度关系“[*]”表示1 .. *。路径上需要0 .. *长度关系。

答案 1 :(得分:1)

只是用Neo4j 3.0更新答案。

MATCH p-[:DOES*0..]->(n)
RETURN DISTINCT(p.name)

它返回与接受的答案相同的结果。