簡體   English   中英

neo4j:到其他路徑上所有特定節點的現有路徑

[英]neo4j: existing paths to all specific nodes on other path

我們有一棵節點樹。 一些節點標記為紅色。 我們還有一個DAG用戶(綠色),它可能是嵌套在組中(黃色)的。 用戶和組可以看到紅色節點(與非紅色節點沒有“看到”關系)

資料模型

是否可以編寫一個密碼查詢,對於給定的用戶U和節點N檢查(或返回N)U(直接或間接地通過組)是否可以看到從根(id = 0)到N的路徑上的所有紅色節點,是否可以進行密碼查詢?

我定義了結構,以便可以根據需要進行任何更改。

例子:

  • 對於U = 12和(N = 3或N =紅色高於3)不滿足條件
  • 對於U = 7和N = 3滿足條件

我的嘗試:

我可以輕松選擇從根到N的所有讀取節點。我可以輕松選擇從U到路徑上紅色節點的路徑。 但我不知道如何定義“全部”限制。 可能嗎?

鏈接到Neo4j控制台: http ://console.neo4j.org/?id=bigdba

圖的來源:

create (n1:node), (n2:node), (n3:node:red {name:'red'}),
(n1)-[:contains]->(n2), (n2) - [:contains] -> (n3),
(n3) - [:contains] -> (n4:node),
(n2) - [:contains] -> (n5:node),
(n5) - [:contains] -> (n6:node),
(n5) - [:contains] -> (n7:node:red {name:'red'}),

(u1:user) - [:inside] -> (g1:group),
(u1) - [:inside] -> (g2:group),
(u2:user) - [:inside] -> (g1),
(g1) - [:inside] -> (g3:group),

(g3) - [:see] -> (n3),

(u3:user) - [:see] -> (n7)

這是使用過濾器所有功能的解決方案:

// match the path between root and n
MATCH p = (r:node)-[*]->(n:node) WHERE id(r) = 0 AND id(n) = 3
// match user u
MATCH (u) WHERE id(u) = 7
// filter all red nodes to the r list
WITH u, p, filter(node in nodes(p) where node:red) as reds
// return true if u can reach all red node
RETURN ALL(red in reds where (u)-[:inside*0..]->(:group)-[:see]->(red))

暫無
暫無

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

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