我有一个由两种节点类型组成的图模型。每个USER都通过DEPDATA节点(一个包含有关关系的重要信息)依赖于一个或多个USER。
(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER)
这条链可以有无限长度,所以部分
-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER)
可以重复n次。 USER也可能没有关系,所以这一切都是有效的
(:USER)
(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER)
我想要检索的是所有依赖于特定USER节点的USER节点,无论其深度如何。
我已经在这里阅读了http://graphaware.com/graphaware/2015/05/19/neo4j-cypher-variable-length-relationships-by-example.html变量关系长度,但它似乎只适用于直接关系。
如何让图形结构的整个部分匹配0..n次?
答案 0 :(得分:1)
您使用n
作为上限,但您说链可能是无限长。在这种情况下,如果您没有应用上限,则不需要为其设置变量。
我认为您正在寻找的是这样的(使用ID属性作为占位符,但是您唯一地标识了从属用户节点):
MATCH (dep:User{ID:123})<-[:DEPENDS_ON|FOR*0..]-(u:User)
RETURN DISTINCT u
这将匹配以下零个或多个链:DEPENDS_ON或:FOR关系,查找所有不同的依赖用户。
答案 1 :(得分:0)
如果您希望从单个集合中的“根”节点开始的每个“完整”路径的结果,则以下内容应该有效。 (“完整”路径是一端有根节点而另一端有“叶子”节点的路径。)
MATCH p=(u:USER)-[:DEPENDS_ON|FOR*0..]->(root:USER {id: 111})
WHERE NOT ()-[:FOR]->(u)
RETURN [n IN NODES(p) WHERE n:USER] AS path_nodes;