Graph neo4j:指向其他路径上所有特定节点的现有路径

Graph neo4j:指向其他路径上所有特定节点的现有路径,graph,neo4j,cypher,graph-databases,Graph,Neo4j,Cypher,Graph Databases,我们有一个节点树。一些节点被标记为红色。我们还有一个DAG的用户(绿色)可能在嵌套的组(黄色)中。用户和组可以看到红色节点(与非红色节点没有“查看”关系) 如果U(直接或间接通过组)可以看到从根(id=0)到N的路径上的所有红色节点,是否可以编写一个密码查询,对给定的用户U和节点N检查(或返回N) 我定义了结构,以便在需要时可以进行任何更改 示例: U=12和(N=3或N=3以上红色)不满足条件 满足U=7和N=3的条件 我的尝试: 我可以轻松地选择从根到N的所有读取节点。我可以轻松地选择

我们有一个节点树。一些节点被标记为红色。我们还有一个DAG的用户(绿色)可能在嵌套的组(黄色)中。用户和组可以看到红色节点(与非红色节点没有“查看”关系)

如果U(直接或间接通过组)可以看到从根(id=0)到N的路径上的所有红色节点,是否可以编写一个密码查询,对给定的用户U和节点N检查(或返回N)

我定义了结构,以便在需要时可以进行任何更改

示例:

  • U=12和(N=3或N=3以上红色)不满足条件
  • 满足U=7和N=3的条件
我的尝试:

我可以轻松地选择从根到N的所有读取节点。我可以轻松地选择从U到路径上红色节点的路径。但我不知道如何定义“全部”限制。可能吗

链接到Neo4j控制台:

图表的来源:

create (n1:node), (n2:node), (n3:node:red {name:'red'}),
(n1)-[:contains]->(n2), (n2) - [:contains] -> (n3),
(n3) - [:contains] -> (n4:node),
(n2) - [:contains] -> (n5:node),
(n5) - [:contains] -> (n6:node),
(n5) - [:contains] -> (n7:node:red {name:'red'}),

(u1:user) - [:inside] -> (g1:group),
(u1) - [:inside] -> (g2:group),
(u2:user) - [:inside] -> (g1),
(g1) - [:inside] -> (g3:group),

(g3) - [:see] -> (n3),

(u3:user) - [:see] -> (n7)
以下是使用和函数的解决方案:

// match the path between root and n
MATCH p = (r:node)-[*]->(n:node) WHERE id(r) = 0 AND id(n) = 3
// match user u
MATCH (u) WHERE id(u) = 7
// filter all red nodes to the r list
WITH u, p, filter(node in nodes(p) where node:red) as reds
// return true if u can reach all red node
RETURN ALL(red in reds where (u)-[:inside*0..]->(:group)-[:see]->(red))

它将红色节点从
u
转到
n
而不是从
root
转到
n
但是这对我来说是一个很大的帮助,谢谢@不客气!但我并不完全清楚。您的示例数据没有“根”节点。。。我忘了什么吗?如问题中所述,root是id为的节点0@piotrek哦,对不起,我弄错了!所以我认为这个查询应该可以很好地工作:
//匹配根和n之间的路径匹配p=(r:node)-[*]->(n:node)其中id(r)=0和id(n)=3//匹配用户u匹配(u)其中id(u)=7//将所有红色节点过滤到r列表中,使用u,p,将(节点(p)中的节点:红色)过滤为红色//如果可以到达所有红色节点,则返回true(红色中的红色,其中(u)-[*]->(红色))
经过一些微调后,它实际上起了作用。我需要将
where(u)-[*]->(红色)
更改为
where(u)-[:inside*0..]>(:group)-[:see]>(红色)
以使
see
关系不可传递。请更新答案,以便我可以接受它