在我的数据库中,如果 2 个聚合列表中的项目不匹配,我希望返回某些节点和关系。具体来说,用户具有一定的访问权限和角色。我想查明那些当前访问权限与其角色所需的访问权限不匹配的用户。 这是我实现此目标的主要查询:
match(u:User)-[r1:HAS_ATTRIBUTE]->(ri:RoleInfo)-[r2:CURRENT]->(rr:Role{roleName:'Claims Specialist'})-[rel:REQUIRES_ACCESS_TO]->(e:Entitlement)
match (u)-[r3:HAS_ACCOUNT]->(ua:UserAccount)-[r4:HAS_ATTRIBUTE]->(ei:EntitlementInfo)-[r5:CURRENT]->(en:Entitlement)
with apoc.coll.sort(collect(distinct e.entitlementName)) as reqdAccesses, e,u,r1, ri, r2, rr,r3,ua,r4,ei,r5,en, rel, apoc.coll.sort(collect(distinct en.entitlementName)) as currentAccesses
WHERE any(item in currentAccesses where not item in reqdAccesses) and size(reqdAccesses) <> size(currentAccesses)
return e,u,r1,ri,r2,r3,ua,r4,ei,r5,en,rel,rr
现在根据数据,该角色的两个列表都不匹配,如下面的查询和输出所示。
match(u:User)-[r1:HAS_ATTRIBUTE]->(ri:RoleInfo)-[r2:CURRENT]->(rr:Role{roleName:'Claims Specialist'})-[rel:REQUIRES_ACCESS_TO]->(e:Entitlement)
match (u)-[r3:HAS_ACCOUNT]->(ua:UserAccount)-[r4:HAS_ATTRIBUTE]->(ei:EntitlementInfo)-[r5:CURRENT]->(en:Entitlement)
return apoc.coll.sort(collect(distinct en.entitlementName)) as currentAccesses, apoc.coll.sort(collect(DISTINCT e.entitlementName)) as reqdAccesses
输出:
currentAccesses
["Claims Adjustment Portal", "Claims Management System", "Customer Relationship Management System", "Electronic Health Records System", "Fraud Detection Platform", "Patient Portal"]
reqdAccesses
["Claims Adjustment Portal", "Claims Management System", "Customer Feedback System", "Fraud Detection Platform", "MEDSTAR CRM"]
我仍然没有收到返回的数据。我的主要查询有什么问题吗?
聚合函数,例如
COLLECT
在分组键上聚合。
您的第一个查询使用非常大的一组分组键(e,u,r1,ri,r2,rr,r3,ua,r4,ei,r5,en,rel):
with apoc.coll.sort(collect(distinct e.entitlementName)) as reqdAccesses, e,u,r1, ri, r2, rr,r3,ua,r4,ei,r5,en, rel, apoc.coll.sort(collect(distinct en.entitlementName)) as currentAccesses
特别是,由于
e
和 en
作为分组键包含在内,因此 collect(distinct e.entitlementName)
和 collect(distinct en.entitlementName)
聚合列表将仅包含单个项目。
您的第二个查询未指定分组键,因此按您的预期工作:
return apoc.coll.sort(collect(distinct en.entitlementName)) as currentAccesses, apoc.coll.sort(collect(DISTINCT e.entitlementName)) as reqdAccesses