Neo4j匹配与一个OR另一个节点相关的节点

时间:2015-12-02 18:31:46

标签: neo4j cypher

我试图绕过一个查询。例如,我有这种模式(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)无效。那么这样做的正确方法是什么?

1 个答案:

答案 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个不同的节点放入数组中,合并这些数组,然后再次使用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路径较长或模式较复杂,这可能很有用。

相关问题