Neo4j匹配与一个或另一个节点有关系的节点



我正试图围绕一个查询进行思考。例如,我有这样的模式(photo:Photo)-[:AUTHOR]->(user:User)。用户可以有好友(user:User)-[:FRIEND]->(friend:User)。那么,我如何查询我或我的朋友制作的所有:Photo,并按日期排序(如果有的话)呢?

MATCH (user:User {id: 'me'}), (user)-[:FRIEND]-(friend:User)
//other pattern matches that I need to do
OPTIONAL MATCH (photo:Photo)-[:AUTHOR]-(user | friend)
RETURN photo
ORDER BY photo.date
LIMIT 42

但据我所知,这个成本结构(user | friend)是无效的。那么,正确的方法是什么呢?

如果只查找与定义的User节点的单个关系,一种简单的方法是使用长度为0到1的可变长度关系。这将收集距离为0的所有节点(即起始节点)和距离为1的所有节点。

MATCH (user:User {id: 'me'})-[:FRIEND*0..1]-(me_and_friend:User)
OPTIONAL MATCH (photo:Photo)-[:AUTHOR]-(me_and_friend)
RETURN photo
ORDER BY photo.date
LIMIT 42

一个更通用的解决方案是将collect不同的节点分成阵列,将这些阵列组合起来,然后再次使用UNWINDMATCH

MATCH (user:User {id: 'me'}), (user)-[:FRIEND]-(friend:User)
WITH collect(user)+collect(friend) AS me_and_friends
UNWIND me_and_friends AS allusers
OPTIONAL MATCH (photo:Photo)-[:AUTHOR]-(allusers)
RETURN photo
ORDER BY photo.date
LIMIT 42

如果MATCH路径更长或模式更复杂,这可能会很有用。

最新更新