问题描述
给出一个图表,其中某个组织的成员与该组织具有一个或多个关系,并且成员发生事件,我正尝试返回事件列表,每个事件包括与之相关的成员及其关系列表该组织。
图结构:
(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