我在这个Cypher查询中遇到了以下问题。总体结果按预期在对象数组中返回。但是,collect()
子句给我带来了一些麻烦。
如果user
没有myFriends
,也没有theirFriends
,则应返回空数组。否则,如果myFriends
和/或theirFriends
具有值,则它应该是组合好友的对象的单个数组,具有相应好友的id属性。
查询:
MATCH (user:User)
WHERE user.id IN ['1', '2', '3']
OPTIONAL MATCH (user)-[:HAS_FRIEND]->(myFriends:User)
OPTIONAL MATCH (user)<-[:HAS_FRIEND]-(theirFriends:User)
OPTIONAL MATCH (user)-[:HAS_TEACHER]->(myTeachers:User)
RETURN {
name: user.name,
friends: collect({id: myFriends.id}) + collect({id: theirFriends.id}),
teachers: collect({id: myTeachers.id})
}
结果:
[
{
name: 'Joe',
friends: [{id: null}, {id: null}],
teachers: [{id: null}]
}, ...
]
期望结果:
[
{
name: 'Joe',
friends: [],
teachers: []
}, {
name: 'Jen',
friends: [{id: '4'}, {id: '6'}, {id: '7'}],
teachers: [{id: '8'}, {id: '9'}]
}
]
2条答案
按热度按时间qxsslcnc1#
[更新]
关于您的特定数据模型的一个非常好的地方是:你可以用一个 * 无向 * 关系模式得到所有的
myFriends
和theirFriends
元素:(user)-[:HAS_FRIEND]-(f)
。例如:
因此,不需要列表连接。此外,
DISTINCT
选项会删除重复的friends
元素。null
值。x6h2sr282#
一个优雅的解决方案,使用Map投影并保留
OPTIONAL MATCH
子句。