如何在Neo4j cypher查询中包含特定于“展开”块中返回的每个节点的关系列表?
给定一个图表,其中一个组织的成员与该组织有一个或多个关系,并且成员有事件,我试图返回一个事件列表,每个事件列表包括关联成员及其与该组织的关系列表 图形结构:如何在Neo4j cypher查询中包含特定于“展开”块中返回的每个节点的关系列表?,neo4j,cypher,Neo4j,Cypher,给定一个图表,其中一个组织的成员与该组织有一个或多个关系,并且成员有事件,我试图返回一个事件列表,每个事件列表包括关联成员及其与该组织的关系列表 图形结构: (组织)(事件) 我当前正在尝试的查询: MATCH (incidents:Incident)<-[:HAS]-(member:Person)-[rels]->(org:Org { orgId: $orgId }) WITH org, member, rels, collect(incident
(组织)(事件)
我当前正在尝试的查询:
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
请注意,在这里,我在一个成员上创建了两个事件,我得到了4个结果。我还尝试在WITH
语句中收集rels
,它提供了一些同样奇怪的结果
我如何获得唯一事件列表,包括相关成员以及该成员与组织的关系?理想情况下,我只想要数组中的关系类型(假设与组织可能有一个或多个关系)。您可以使用
type()
和collect()
函数从rels
中提取关系类型,并将其作为列表
collect(DISTINCT type(rels))
将为您留下作为字符串数组的不同角色
您可能需要考虑在<代码> >集合()/<代码>事件中确保< <代码>不同的< /代码>,以便在解开时没有重复的结果。
然后,您的查询将如下所示: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
匹配(事件:事件)(组织:组织){
orgId:$orgId
})
使用组织、成员、收集(不同类型(rels))作为角色,收集(不同事件)作为收集事件
将收集的事件作为事件展开
返回事件{
. *,
组织:属性(组织),
成员:物业(成员),
角色:角色
}结果
按事件排序。创建数据描述
跳过$SKIP
限额$LIMIT
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