【发布时间】:2014-07-18 01:11:37
【问题描述】:
作为 Cypher 和 Neo4j 的新手,我在为我的用例构建查询时遇到了麻烦。我正在构建一个简单的 ACL(访问控制列表),并且正在寻找一条通过权限关系的路径,以及向上的层次结构。一张图或许更能说明问题:
Key:
Users -> Blue
Groups -> Yellow, Green
Resource Tree -> Red
现在我想看看是否存在从 Bob 到 Bob 具有 update 访问权限的 eVar 33 资源的路径。因为有直接路径,所以我可以通过运行得到我要找的东西
MATCH p =(usr:Usr)-[:AXO {update: true}]->(aco:ACO)
WHERE usr.name = 'Bob' AND aco.name = 'eVar 33'
RETURN p
但是现在,Bob 也是 Media Mgmt 组的成员,该组授予他对 Conversion 资源的读取 访问权限。并且因为 Conversion 比 eVar 33 在资源树上更靠前,所以 eVar 33 应该继承这个权限。但是当我运行相同的查询来寻找{read: true} 时,找不到路径。我知道这是因为我不允许遍历 :IN 和 :HAS 关系,但我该怎么做呢?
我试过了:
MATCH p =(usr:Usr)-[:IN|:HAS|:AXO {read: true}]->(aco:ACO)
WHERE usr.name = 'Bob' AND aco.name = 'eVar 33'
RETURN p
认为这将允许遍历这些关系,但它仍然找不到路径(因为我不允许超过 1 的深度?)。
这是我的需求:
- 路径深度未知
- 我返回的任何路径都很好(我真正关心的是“是否有路径?”)
- 必须能够从用户获取资源,并且当遵循 AXO 关系时,它必须匹配属性过滤器。
- 必须遵循有向图(例如 Bob 没有 Analytics 的权限)
不,我不为耐克工作。这里只是一个示例用例:)
【问题讨论】: