我有一个由两种节点类型组成的图模型。每个用户通过 DEPDATA 节点(保存有关关系的重要信息)依赖于一个或多个用户。
(:USER)-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER)
这条链可以有无限长,所以零件
-[:DEPENDS_ON]->(:DEPDATA)-[:FOR]->(:USER)
可以重复n次。用户也可能没有关系,所以这一切都是有效的
(: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次?
您使用
n
作为上限,但您说链可以是无限长的。在这种情况下,如果您不应用上限,则不需要为其提供变量。
我认为您正在寻找的是这样的东西(使用 ID 属性作为占位符,但是您唯一地标识依赖的 User 节点):
MATCH (dep:User{ID:123})<-[:DEPENDS_ON|FOR*0..]-(u:User)
RETURN DISTINCT u
这将匹配零个或多个 :DEPENDS_ON 或 :FOR 关系链,找到所有不同的依赖用户。
如果您想要在单独的集合中从“根”节点开始的每个“完整”路径的结果,则以下内容应该有效。 (“完整”路径是一端具有根节点,另一端具有“叶”节点的路径。)
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;