在我的应用程序中,我有设置角色,为用户提供对其他用户资产的不同级别的访问。
我有一个查询来返回一个资产BobsPrivate,其中用户请求的是Bob
MATCH (u:User {name: 'Bob' })
MATCH (n:Asset:Album {name:'BobsPrivate'})
WHERE (u)-[:CREATED|:FRIENDS_CAN_READ]->(n) OR (n)<-[:CAN_READ]-()<-[:BELONGS_TO]-(u)
RETURN n我所有的查询都是在REST节点上进行的。
这与预期一样工作,并返回资产,因为其中一个关系是存在的,如果我传递一个不存在的资产名称(如foo ),它将按预期工作,并且不返回任何内容。
当我传递用户James和BobsPrivate时,它也不会返回任何内容,正如您所期望的那样,但我希望返回一些不同的内容。
我的问题是,对于不存在的资产和不存在的关系,我得到了相同的结果,后者等同于没有适当的访问级别。
如何构造查询,以便返回两个不同的结果,以便在控制器中以不同的方式处理HTTP响应(404,403)?我还需要在我的UPDATE和DELETE方法中使用同样的原则。
编辑:
我稍微改变了我的查询,它给了我想要的东西,但是,它确实引入了另一个MATCH,所以我仍然愿意接受建议。
OPTIONAL MATCH (u:User {name: 'Bob' })
OPTIONAL MATCH (n:Asset:Album {name:'BobsPrivate'})
WHERE (u)-[:CREATED|:FRIENDS_CAN_READ]->(n) OR (n)<-[:CAN_READ]-()<-[:BELONGS_TO]-(u)
WITH n
OPTIONAL MATCH (l:Asset:Album {name:'BobsPrivate'})
RETURN n AS ASSET, l IS NOT NULL AS ASSET_EXISTS, CASE WHEN n IS NOT NULL AND l IS NOT NULL THEN true ELSE这样我就可以按原样返回Asset,而不需要基于关系进行任何额外的钻研,这样我就可以返回控制器可以使用的有用的布尔值。
我是NEO4J的新手,我确信会有比这更好的方法,所以如果你知道,我会非常感激的。
发布于 2016-02-24 13:00:23
我5分钟的努力是为了达到理想的行为:
MATCH (u:User {name: 'Bob' })
MATCH (n:Asset:Album {name:'BobsPrivate'})
RETURN
n,
EXISTS((u)-[:CREATED|:FRIENDS_CAN_READ]->(n)) as isDirectAccessible,
EXISTS((n)<-[:CAN_READ]-()<-[:BELONGS_TO]-(u)) as isIndirectAccessible我们正在分别检索所有事实:
然后,在客户端,我们可以决定我们要用它做什么。例如:
删除查询示例:
MATCH (u:User {name: 'Bob' })
MATCH (n:Asset:Album {name:'BobsPrivate'})
WITH
n,
EXISTS((u)-[:CREATED|:FRIENDS_CAN_READ]->(n)) as isDirectAccessible,
EXISTS((n)<-[:CAN_READ]-()<-[:BELONGS_TO]-(u)) as isIndirectAccessible
WITH n, isDirectAccessible, isIndirectAccessible,
(CASE
WHEN isDirectAccessible OR isIndirectAccessible THEN n
ELSE null
END) as deletableObject
DETACH DELETE deletableObject
RETURN (deletableObject IS NOT NULL) as isDeleted, isDirectAccessible, isIndirectAccessible同样的原则也在这里发挥作用:
注:我觉得这可能不是最好的方法。但是,嘿,很管用。
https://stackoverflow.com/questions/35602398
复制相似问题