我有以下图表:
我想返回所有具有附加了“CAN_DISTRIBUTE Credits”权限的用户,这些用户通过适用于“Group”的“Role”进行管理。下面的查询将返回用户名为“sara”和“admin”的用户:MATCH (users)-[:IS]->()<-[:CHILD_OF*0..]-(roles)-[:CAN_DISTRIBUTE]->(asset:Asset{name:"Credits"}),(roles)-[:APPLIES_ON]->(group:Group{name:"Digital"})WITH DISTINCT usersRETURN collect(users.name)
现在,我很难按照他们的“Role”关系深度对返回的用户进行排序。我希望“sara”首先返回,因为“Manager”角色是“SuperManager”的子级。通俗易懂地说,就像说:“按照它们的角色层次结构给我所有可以在X组上分发信用点的用户。”
你们有什么想法吗?
以下是创建此图的查询:
创建(admin:User{name:"admin"})
创建(sara:User{name:"sara"})
创建(c:Asset{name:"Credits"})
创建(marketing:Group{name:"Marketing"})
创建(digital:Group{name:"Digital"})
创建(super_manager:Role{name:"SuperManager"})
创建(manager:Role{name:"Manager"})
创建(manager)-[:CAN_DISTRIBUTE]->(c)
创建(admin)-[:IS]->(super_manager)
创建(sara)-[:IS]->(manager)
创建(super_manager)-[:APPLIES_ON]->(marketing)
创建(super_manager)-[:APPLIES_ON]->(digital)
创建(manager)-[:APPLIES_ON]->(marketing)
创建(manager)-[:APPLIES_ON]->(digital)
创建(manager)-[:CHILD_OF]->(super_manager)
CAN_DISTRIBUTE
添加到SuperManager
时,会在admin
和:Group{name:"Digital"}
之间创建两条可能的路径。您可以通过运行以下命令更清楚地看到它:MATCH p = (users)-[:IS]->()<-[:CHILD_OF*0..]-(roles)-[:CAN_DISTRIBUTE]->(asset:Asset{name:"Credits"}), (roles)-[:APPLIES_ON]->(group:Group{name:"Digital"}) RETURN DISTINCT users, length(p) as pathLength
- Bruno PeresMATCH (u:User)-[:IS]->(r1:Role)<-[:CHILD_OF*0..]-(r2:Role)-[:CAN_DISTRIBUTE]->(asset:Asset{name:"Credits"}) WHERE (r1)-[:APPLIES_ON]->(:Group{name:"Digital"}) OR (r2)-[:APPLIES_ON]->(:Group{name:"Digital"}) RETURN u
,但我相信这个查询可以改进。 - Bruno Peres