首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何构造CYPHER查询以返回不存在的路径和不存在的节点的不同结果

如何构造CYPHER查询以返回不存在的路径和不存在的节点的不同结果
EN

Stack Overflow用户
提问于 2016-02-24 12:36:46
回答 1查看 44关注 0票数 0

在我的应用程序中,我有设置角色,为用户提供对其他用户资产的不同级别的访问。

我有一个查询来返回一个资产BobsPrivate,其中用户请求的是Bob

代码语言:javascript
复制
     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 ),它将按预期工作,并且不返回任何内容。

当我传递用户JamesBobsPrivate时,它也不会返回任何内容,正如您所期望的那样,但我希望返回一些不同的内容。

我的问题是,对于不存在的资产和不存在的关系,我得到了相同的结果,后者等同于没有适当的访问级别。

如何构造查询,以便返回两个不同的结果,以便在控制器中以不同的方式处理HTTP响应(404,403)?我还需要在我的UPDATEDELETE方法中使用同样的原则。

编辑:

我稍微改变了我的查询,它给了我想要的东西,但是,它确实引入了另一个MATCH,所以我仍然愿意接受建议。

代码语言:javascript
复制
    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的新手,我确信会有比这更好的方法,所以如果你知道,我会非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-24 13:00:23

我5分钟的努力是为了达到理想的行为:

代码语言:javascript
复制
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

我们正在分别检索所有事实:

  • 资源
  • 返回布尔标志,是否可以直接访问资产
  • 返回布尔标志,是否可以间接访问资产

然后,在客户端,我们可以决定我们要用它做什么。例如:

  • 如果根本没有返回数据:返回404
  • 如果数据库中有这样的资产,但是有一个(或两者兼有)标志为false:返回403
  • 如果存在资产,则两个标志都为真:返回200和数据。

删除查询示例:

代码语言:javascript
复制
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

同样的原则也在这里发挥作用:

  • 如果没有返回,那么资产就不存在。
  • 如果某物返回:检查标志

注:我觉得这可能不是最好的方法。但是,嘿,很管用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35602398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档