Neo4j匹配与一个或另一个节点相关的节点
我正试着把我的头绕在一个问题上。例如,我有这个模式Neo4j匹配与一个或另一个节点相关的节点,neo4j,cypher,Neo4j,Cypher,我正试着把我的头绕在一个问题上。例如,我有这个模式(photo:photo)-[:AUTHOR]->(user:user)。用户可以有朋友(用户:用户)-[:朋友]->(朋友:用户)。那么,我如何进行查询,找到我或我的朋友制作的所有:照片,并按日期排序(如果有的话) MATCH (user:User {id: 'me'}), (user)-[:FRIEND]-(friend:User) //other pattern matches that I need to do OPTIONAL MATC
(photo:photo)-[:AUTHOR]->(user:user)
。用户可以有朋友(用户:用户)-[:朋友]->(朋友:用户)
。那么,我如何进行查询,找到我或我的朋友制作的所有:照片,并按日期排序(如果有的话)
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
但据我所知,这个构造(用户|朋友)
是无效的。那么,正确的方法是什么呢?如果只查找与定义的用户节点的单个关系,一个简单的方法是使用长度为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
更通用的解决方案是将不同的节点收集到数组中,组合这些数组,然后再次使用展开进行匹配
:
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长度“引用”节点本身,非常棒的代码片段,谢谢!如果其他人想发布一些方便的解决方案,我会等一段时间再接受答案。哦,对不起,忘记了这个问题,接受了!谢谢