neo4j:到其他路径上所有特定节点的现有路径

时间:2018-01-25 09:51:28

标签: graph neo4j cypher graph-databases

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

Data model

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

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

的示例:

  • 条件不满足U = 12和(N = 3或N =红色高于3)
  • 满足U = 7和N = 3
  • 的条件

我的尝试:

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

链接到Neo4j控制台:http://console.neo4j.org/?id=bigdba

图表的来源:

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)

1 个答案:

答案 0 :(得分:3)

以下是使用filterall函数的解决方案:

// 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))