仅当 cypher 中某个条件为真时,如何返回节点和关系

问题描述 投票:0回答:1

在我的数据库中,如果 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"]

我仍然没有收到返回的数据。我的主要查询有什么问题吗?

  • 我尝试删除最后一个进行实际比较的 where 子句中的“and”。因此,如果我从中删除尺寸,我就会得到结果。但对于所有其他角色,两个列表中都没有差异。
  • 如果我删除 where 子句的“任何”部分并仅比较两个列表的大小差异,则无论差异如何,我都不会得到任何结果。
neo4j cypher graph-databases neo4j-apoc graph-data-science
1个回答
0
投票

聚合函数,例如

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
© www.soinside.com 2019 - 2024. All rights reserved.