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" │
└────────────┘