递归多重关系

时间:2017-12-15 20:54:30

标签: recursion neo4j cypher

我尝试递归执行具有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是向前的。

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

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

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

谢谢!

1 个答案:

答案 0 :(得分: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