我试图绕过一个查询。例如,我有这种模式(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
但据我所知,这个costruct (user | friend)
无效。那么这样做的正确方法是什么?
答案 0 :(得分:3)
如果只寻找与定义的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
个不同的节点放入数组中,合并这些数组,然后再次使用UNWIND
到MATCH
:
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
路径较长或模式较复杂,这可能很有用。