Graph 按节点深度排序的neo4j密码查询

Graph 按节点深度排序的neo4j密码查询,graph,neo4j,cypher,Graph,Neo4j,Cypher,我有以下图表: 我想返回所有拥有可以分发积分权限的用户,这些权限通过角色附加,该角色应用于组 以下查询将sara和admin作为用户名返回: 匹配(用户)-[:IS]->()(资产:资产{name:“Credits”}), (角色)-[:应用于]->(组:组{name:“数字”}) 具有不同的用户 RETURN collect(users.name) 现在,我真的很难对其角色返回的用户进行排序。我希望首先返回sara,因为Manager角色是SuperManager的子角色。 在英语中,这

我有以下图表:

我想返回所有拥有
可以分发
积分
权限的用户,这些权限通过
角色附加,该角色
应用于

以下查询将
sara
admin
作为用户名返回:


匹配(用户)-[:IS]->()(资产:资产{name:“Credits”}),
(角色)-[:应用于]->(组:组{name:“数字”})
具有不同的用户
RETURN collect(users.name)

现在,我真的很难对其
角色返回的用户进行排序。我希望首先返回
sara
,因为
Manager
角色是
SuperManager
的子角色。 在英语中,这就像说,给我所有可以在组X上分配信用的用户,按他们的角色层次排序

你们有什么想法吗

以下是创建此图的查询:


创建(管理员:用户{name:“admin”})
创建(sara:User{name:“sara”})
创建(c:Asset{name:“Credits”})
创建(营销:组{name:“营销”})
创建(数字:组{name:“数字”})
创建(超级管理员:角色{name:“超级管理员”})
创建(经理:角色{name:“经理”})
创建(管理器)-[:CAN_DISTRIBUTE]->(c)
创建(管理员)-[:IS]->(超级管理员)
创建(sara)-[:IS]->(管理器)
创建(超级管理器)-[:应用于]->(营销)
创建(超级\u管理器)-[:应用\u ON]->(数字)
创建(经理)-[:应用于]->(营销)
创建(管理器)->(数字)
创建(管理器)-[:子项]->(超级管理器)

您可以使用整个路径的长度来执行此操作,方法如下:

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

你刚刚救了我一天:)谢谢你!当我在
超级管理者
角色上直接添加
可以分发
权限时,
DISTINCT
指令似乎无法正常工作。您知道为什么吗?它返回用户
admin
的2倍。我正在考虑如何解决它,但是它发生了,因为当您添加
可以直接将
分发给
超级管理者时,您正在
admin
之间创建两个可能的路径:组{name:“Digital”}
。您可以更清楚地看到它正在运行:
MATCH p=(users)-[:IS]->()(asset:asset{name:“Credits”}),(roles)-[:applications\u ON]->(group:group{name:“Digital”})返回不同的用户,长度(p)作为路径长度
正确,这只是为了给您明确添加该关系的原因。这是因为我不知道如何编写这样一个查询:“给我所有可以通过某个角色分配信用的用户,该角色应用于某个组”。如果超级管理器和credits节点之间不存在关系,它不会将admin作为结果的一部分返回给我。不确定是否清楚,也许你也有解决这个问题的办法。@Pierre LouisGottfrois我正在努力做一些改进。
╒════════════╕
│"users.name"│
╞════════════╡
│"sara"      │
├────────────┤
│"admin"     │
└────────────┘