与可选的图形部分匹配

时间:2016-11-08 15:46:57

标签: neo4j cypher

我有一个由两种节点类型组成的图模型。每个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次?

2 个答案:

答案 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;