我正试图围绕一个查询进行思考。例如,我有这样的模式(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
不同的节点分成阵列,将这些阵列组合起来,然后再次使用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
路径更长或模式更复杂,这可能会很有用。