如何在Neo4j密码查询中包括特定于在unwind块中返回的每个节点的关系列表?

问题描述

给出一个图表,其中某个组织的成员与该组织具有一个或多个关系,并且成员发生事件,我正尝试返回事件列表,每个事件包括与之相关的成员及其关系列表该组织。

图结构: (org)<-[MEMBER_OF|ADMIN_OF|MANAGER_OF|VISITOR_OF]-(member)-[:HAS]->(incidents)

我当前正在尝试的查询

MATCH (incidents:Incident)<-[:HAS]-(member:Person)-[rels]->(org:Org {
  orgId: $orgId
})

WITH org,member,rels,collect(incidents) AS collectedIncidents
UNWIND collectedIncidents AS incident
RETURN incident {
       . *,org:properties(org),member:properties(member),roles: rels
       } AS result
  ORDER BY incident.createdAt DESC
  SKIP $skip
  LIMIT $limit

我在一个成员上创建了 2个事件后的结果:

[ { member: { 
       createdAt: 1598524633129,uuid: '5f430e1b-29d1-49bf-bbcc-fe1b68400378',},org: { createdAt: 1598524632522,name: 'Murder Hornet Inc',uuid: '1a69e9a1-4126-4557-b1ff-8f621b25e23d',orgId: 'MHI',updatedAt: 1598524632522 },roles:
     Relationship {
       identity: 167,start: 156,end: 155,type: 'ADMIN_OF',properties: {} 
     },uuid: '42050b82-f777-4a8a-a063-9bc43e4cf80d',createdAt: 1598524637746,{ member: { 
       createdAt: 1598524633129,org: { 
       createdAt: 1598524632522,orgId: 'MHI'
     },properties: {} 
      },uuid: '21c86703-4f7b-4c67-8344-0131b011b925',org:
     { createdAt: 1598524632522,roles:
     Relationship {
       identity: 165,type: 'MEMBER_OF',properties: {} },createdAt: 1598524637746
    },{ member:
     { 
       createdAt: 1598524633129,} 
]

请注意,在这里,我已在一个成员上创建了 2个事件,并且返回了4个结果。我还尝试在rels语句中收集WITH,这提供了一些同样奇怪的结果。

如何获取唯一事件的列表,包括相关成员以及该成员与组织的关系?理想情况下,我只希望数组中的关系类型(假设与该组织可能存在一个或多个关系)。

解决方法

您可以使用type()collect()函数从rels中提取关系类型并将其作为列表。

collect(DISTINCT type(rels))将让您扮演一系列字符串的角色。

您可能要考虑确保DISTINCT的事件中有collect(),以便放松时不会有重复的结果。

您的查询何时如下所示:

MATCH (incidents:Incident)<-[:HAS]-(member:Person)-[rels]->(org:Org {
  orgId: $orgId
})

WITH org,member,collect(DISTINCT type(rels)) as roles,collect(DISTINCT incidents) AS collectedIncidents
UNWIND collectedIncidents AS incident
RETURN incident {
       . *,org:properties(org),member:properties(member),roles: roles
       } AS result
  ORDER BY incident.createdAt DESC
  SKIP $skip
  LIMIT $limit