按节点深度排序neo4j Cypher查询

3

我有以下图表:

graph

我想返回所有具有附加了“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)

1个回答

2
您可以使用整个路径的长度来完成此操作,方法如下:
MATCH p = (users)-[:IS]->()<-[:CHILD_OF*0..]-(roles)-[:CAN_DISTRIBUTE]->(asset:Asset{name:"Credits"}),
      (roles)-[:APPLIES_ON]->(group:Group{name:"Digital"})
WITH DISTINCT users, length(p) as pathLength
RETURN users.name
ORDER BY pathLength

给定数据集的输出结果:
╒════════════╕
│"users.name"│
╞════════════╡
│"sara"      │
├────────────┤
│"admin"     │
└────────────┘

1
你刚刚拯救了我的一天 :) 谢谢! - Pierre-Louis Gottfrois
当我直接在“SuperManager”角色上添加“CAN_DISTRIBUTE”权限时,“DISTINCT”指令似乎无法正常工作。http://d.pr/i/6owUQB 你有任何想法吗?它会返回2次用户“admin”。 - Pierre-Louis Gottfrois
我正在考虑如何解决这个问题,但是当您直接将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 Peres
@Pierre-LouisGottfrois 这个应该可以工作:MATCH (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
1
@Pierre-LouisGottfrois 我正在尝试进行一些改进。 - Bruno Peres
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接