[英]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),則按預期方式工作並且不會返回任何內容。
當我傳遞用戶James
和BobsPrivate
它也不會返回任何內容,這與您期望的一樣,但是我想返回不同的內容。
我的問題是,對於不存在的資產和不存在的關系,我得到相同的結果,后者相當於沒有適當的訪問級別。
如何構造查詢,以便可以返回兩個不同的結果,以便可以在控制器(404、403)中以不同方式處理HTTP響應? 我還需要在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的新手,我敢肯定會有比這更好的方法,因此,如果您知道的話,我將不勝感激。
我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
同樣的原理在這里起作用:
注意:我覺得這可能不是最好的方法。 但是,嘿,它有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.