与可选图形部分匹配

问题描述 投票:0回答:2

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

neo4j cypher
2个回答
1
投票

您使用

n
作为上限,但您说链可以是无限长的。在这种情况下,如果您不应用上限,则不需要为其提供变量。

我认为您正在寻找的是这样的东西(使用 ID 属性作为占位符,但是您唯一地标识依赖的 User 节点):

MATCH (dep:User{ID:123})<-[:DEPENDS_ON|FOR*0..]-(u:User)
RETURN DISTINCT u

这将匹配零个或多个 :DEPENDS_ON 或 :FOR 关系链,找到所有不同的依赖用户。


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;
© www.soinside.com 2019 - 2024. All rights reserved.