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

Neo4j 如何从任何深度的关系(包括关系过滤器)中获取节点,neo4j,cypher,Neo4j,Cypher,我使用的查询与此类似: (n)-[*]->(m) Any depth. 但我无法在这样的查询中筛选关系名称: (n)-[*:DOES]->(m) Any depth. 我需要筛选关系名称,因为相关路径上存在不同的关系。如果有帮助,以下是我的图表: CREATE (Computer { name:'Computer' }),(Programming { name:'Programming' }),(Java { name:'Java' }),(GUI { name:'GUI' })

我使用的查询与此类似:

(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

我想在一个查询中完成它。

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


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

只是用Neo4j 3.0更新答案

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

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

尝试将星号移动到关系类型的另一侧,如:
(n)-[:DOES*]->(m)
。这就是您要查找的吗?它返回(n)-[:DOES]->(m)返回的值。没有更改。是的,有更改,您的匹配模式现在同时声明可变长度和关系类型。如果你得到相同的数据,那是因为在你的图中没有比一个更长的关系类型和方向。为你的模式创建一条路径,去掉方向性,你就会看到差异,即比较
匹配p=(n)-[:DOES*]-(m)返回p
匹配p=(n)-[:DOES]-(m)返回p
。我回答了你关于过滤类型上的可变长度关系的问题,但没有回答你关于如何获得所需的特定数据的问题。答案是,“Ekin、Iker和Gunes”都不是通过“DOES”类型的多个关系连接到“Programming”的,因此您也需要考虑“is”关系。除非你更明确地描述你的模型,否则很难回答,但你可能想要的是
MATCH(p)Brilliant之类的东西。谢谢你的回答!
Match p-[:DOES]->()-[*0..]->n
Return distinct p.name
MATCH p-[:DOES*0..]->(n)
RETURN DISTINCT(p.name)