2015-12-02 182 views
0

我试图围绕一个查询来包裹我的头。例如,我有这种模式(photo:Photo)-[:AUTHOR]->(user:User)。用户可以有朋友(user:User)-[:FRIEND]->(friend:User)。那么,如何查询我在哪里可以找到由我或我的朋友制作的所有:Photo,并按日期排序,如果有的话?Neo4j匹配与一个或另一个节点有关系的节点

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)无效。那么,正确的做法是什么?

回答

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 

如果您使用更长的路径或更复杂的模式,这可能很有用。

+0

哇,我应该考虑以这种方式放松自己。从来没有使用可变长度,这有趣的是,你可以使用0长度'引用'节点本身,真棒片段,谢谢! 如果其他人想要发布一些方便的解决方案,我会等待一段时间才能接受答案。 –

+0

哎呀,对不起,忘了这个问题,接受!谢谢! –

相关问题