簡體   English   中英

Neo4j密碼查詢:具有指定節點和關系屬性的AllShortestPaths

[英]Neo4j cypher query: AllShortestPaths with specified nodes and relationship properties

我是Neo4j的新手。

我創建了以下示例:

//         (Node2)
//         /     \
//   Rel2 /       \ Rel3
//       /         \
// (Node1) ------> (Node3)
//          Rel1
// 
// create nodes
CREATE
(n1:Node1{id:1,rights:["admin","user"]}),
(n2:Node2{id:2,rights:["admin","user"]}),
(n3:Node3{id:3,rights:["admin","user"]})
// create relationships
CREATE (n1)-[r1:Rel1{id:11,rights:["admin"]}]->(n3)
CREATE (n1)-[r2:Rel2{id:12,rights:["admin","user"]}]->(n2)
CREATE (n2)-[r3:Rel3{id:13,rights:["admin","user"]}]->(n3)
RETURN n1,n2,n3,r1,r2,r3

每個節點和關系都有一個帶有一些權限值的屬性數組。 我想創建一個查詢,該查詢為我提供具有指定屬性的兩個節點之間的(最短)路徑。 例:

用戶具有“管理員”權限,路徑應為:

(節點1)-[角色1]->(節點3)
(每個節點和關系在'rights'屬性中都有'admin'字符串。)

如果用戶具有正確的“用戶”,則路徑應為:

(節點1)-[角色2]-(節點2)-[角色3]-(節點3)
(因為Rel1關系在'rights'屬性中沒有'user'字符串。)

最初,我嘗試了這個有效的查詢:

WITH ["admin","otherRight"] AS usersRights
MATCH path=allShortestPaths((n1:Node1{id:1})-[*..4]-(n2:Node3{id:3})) 
WITH *, relationships(path) AS rels, nodes(path) as nodes
WHERE ANY (rel IN rels WHERE ANY(r IN rel.rights WHERE r IN usersRights))
AND ANY (node IN nodes WHERE ANY(r IN node.rights WHERE r IN usersRights))
RETURN path

然后,我用“用戶”替換了“管理員”,但是此查詢不起作用(沒有魯):

WITH ["user","otherRight"] AS usersRights
MATCH ... // same as above
...
RETURN path

以下查詢與我所需的結果匹配,但是在這種情況下,我將不得不進行幾次查詢才能獲得深度n的所需結果(最短路徑)。

WITH ["user","otherRight"] AS usersRights
MATCH path=(n1:Node1{id:1})-[r1]-(n2)-[r2]-(n3:Node3{id:3}) 
WHERE ANY(r IN n1.rights WHERE r IN usersRights)
AND ANY(r IN r1.rights WHERE r IN usersRights)
AND ANY(r IN n2.rights WHERE r IN usersRights)
AND ANY(r IN r2.rights WHERE r IN usersRights)
AND ANY(r IN n3.rights WHERE r IN usersRights)
RETURN path

是否可以創建一個密碼查詢,使我得到不良結果?

謝謝。

您的第一個查詢具有一個WITH子句,該子句將MATCHWHERE子句分隔開,從而防止WHERE子句影響allshortestpath()函數的行為。 因此,該函數僅返回最短路徑,而不測試節點和關系。

試試這個,代替:

WITH ["admin","otherRight"] AS usersRights
MATCH path=allShortestPaths((n1:Node1{id:1})-[*..4]-(n2:Node3{id:3})) 
WHERE
  ANY (rel IN relationships(path) WHERE ANY(r IN rel.rights WHERE r IN usersRights)) AND
  ANY (node IN nodes(path) WHERE ANY(r IN node.rights WHERE r IN usersRights))
RETURN path;

暫無
暫無

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

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