2017-09-14 87 views
1

我剛剛開始與Neo4j,我在folling的情況下掙扎了一下。鑑於以下圖表:Neo4j密碼子返回兒童的所有節點

graph

爲「西奧」,我要回誰也可以管理詞彙表的其他用戶名的列表。作爲父母組的成員,應該爲您提供與您的孩子相同的權限。

例如,對於「theo」,我們應該返回sara和bob,因爲sara是PoleManager的成員,它是ProjectManager組的父項。 Bob是有權管理詞彙表的ProjectManager組的成員。

到目前爲止,我有以下查詢,但它不返回薩拉作爲候選:

MATCH (me:User{name:"theo"})-[:MEMBER_OF]->(g:Group), (g)-[:CAN_MANAGE]->(Asset{name:"Glossaries"}), (users:User)-[:MEMBER_OF]->(g) RETURN me.name AS Me, collect(users.name) AS Users UNION MATCH (me:User{name:"theo"})-[:MEMBER_OF]->(Group)<-[:CHILD_OF*]-(children:Group), (children)-[:CAN_MANAGE]->(Asset{name:"Glossaries"}), (users:User)-[:MEMBER_OF]->(children) RETURN me.name AS Me, collect(users.name) AS Users

我也願意接受更好的想法把這個圖表示。

回答

1

查詢的後半部分幾乎是正確的:

MATCH p = (me:User{name:$Me})-[:MEMBER_OF]->()<-[:CHILD_OF*0..]-()-[:CAN_MANAGE]->(:Asset{name:"Glossaries"}) 
UNWIND nodes(p)[1..-1] as group 
MATCH (users:User)-[:MEMBER_OF]->(group) 
RETURN $Me, collect(users.name) AS Users 

如果你從開始:名爲「西奧」用戶,那麼它應該是足夠的參數名稱輸入,並返回名稱參數在RETURN中,而不是在節點上訪問它,如上所述。

我也想知道Theo的匹配是否真的有必要,因爲它看起來像所有你想要的都是可以管理詞彙表的組的成員。如果是這樣,您可以從查詢中刪除西奧部分:

MATCH (users)-[:MEMBER_OF]->(group)<-[:CHILD_OF*0..]-()-[:CAN_MANAGE]->(:Asset{name:"Glossaries"}) 
RETURN $name collect(users.name) AS Users 

對於這一個,我刪除了用戶和組的標籤,但你只能這樣做,如果你的圖形結構的明確定義不夠的此處存在的關係只能連接到:用戶和:組節點。如果其他類型的節點也可以通過這些關係進行連接,則需要重新添加:User和:Group標籤。

+0

我錯了'[:CHILD_OF *]'雖然'*'會匹配'0',但它似乎不是:( –

+0

其實,@ InverseFalcon第一個查詢,這是有用的知道「有什麼用戶Theo可以管理詞彙表「不起作用,它只會返回我'[bob]'。任何想法爲什麼? –

+0

是的,我的查詢中存在一個缺陷,我只是修復它,看看它是否適用於您。 – InverseFalcon