簡體   English   中英

如何構造CYPHER查詢以針對不存在的路徑和不存在的節點返回不同的結果

[英]How to structure CYPHER query to return a different results for none existent paths and none existent nodes

在我的應用程序中,我具有設置角色,可為用戶提供對其他用戶資產的不同級別的訪問。

我有此查詢返回資產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 API實現的。

這可以按預期方式工作並返回資產,因為存在一種關系,並且如果我傳遞了不存在的資產名稱(例如foo),則按預期方式工作並且不會返回任何內容。

當我傳遞用戶JamesBobsPrivate它也不會返回任何內容,這與您期望的一樣,但是我想返回不同的內容。

我的問題是,對於不存在的資產和不存在的關系,我得到相同的結果,后者相當於沒有適當的訪問級別。

如何構造查詢,以便可以返回兩個不同的結果,以便可以在控制器(404、403)中以不同方式處理HTTP響應? 我還需要在UPDATEDELETE方法中使用相同的原理。

編輯:

我對查詢進行了一些更改,它為我提供了所需的內容,但是它確實引入了另一個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的新手,我敢肯定會有比這更好的方法,因此,如果您知道的話,我將不勝感激。

我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

我們將分別檢索所有事實:

  • 資產
  • 返回布爾值標志,是否可以直接訪問資產
  • 返回布爾值標志,是否可以間接訪問資產

然后,在客戶端,我們可以決定要怎么做。 例如:

  • 如果根本沒有返回任何數據:返回404
  • 如果數據庫中有這樣的資產,但是一個(或兩個都)標志為false:返回403
  • 如果資產存在,則兩個標志都為真:返回200和數據

刪除查詢示例:

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

同樣的原理在這里起作用:

  • 如果沒有任何回報,則資產不存在
  • 如果返回:檢查標志

注意:我覺得這可能不是最好的方法。 但是,嘿,它有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM