递归多重关系

问题描述 投票:0回答:1

我试图递归执行具有2个特定关系的备用匹配语句。例如,宠物由人拥有。宠物喜欢其他人(不是主人)这些人拥有他们拥有的宠物,喜欢其他人等。

match (n.Person {id.123})<-[r.OwnedBy]-(p.Pet)  Return n, r, p
match (p.Pet {id.123})-[r.Likes]->(n.Person)  Return p, r, n

注意所涉及的方向关系 - #1是向后的,#2是向前的。

我想做的是给一个人(id),1。显示宠物[OwnedBy]这个人(id)2。显示那些宠物[喜欢]的人3.显示宠物[OwnedBy] 2中的人递归地

独立地,这些Match语句有效。他们没有在一起。我尝试添加第二个匹配语句,使用不同的变量,然后它将下降2级并停止。

在真实数据集中,有许多节点和关系。我试图将显示限制为只有这2个关系/节点的“树”视图。

谢谢!

recursion neo4j cypher
1个回答
0
投票

这个怎么样?

match (n:Person {id:123})<-[:OwnedBy]-(p:Pet)-[:Likes]->(n2:Person)<-[:OwnedBy]-(p2:Pet)
return n, collect(distinct p) as pets, collect(distinct n2) as peopleLiked, collect(distinct p2) as petsOfPeopleLiked

虽然如果你只对图形显示感兴趣,这应该有效:

match path = (n:Person {id:123})<-[:OwnedBy]-(p:Pet)-[:Likes]->(n2:Person)<-[:OwnedBy]-(p2:Pet)
return path, n, p, n2, p2

你也可以使用APOC Procedures。这可以仅使用以下两种类型的关系来处理这些路径:

match (n:Person {id:123})
call apoc.path.expandConfig(n, {relationshipFilter:'<OwnedBy|Likes>'}) yield path
return path
© www.soinside.com 2019 - 2024. All rights reserved.