我尝试递归执行具有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个级别并停止。
在真实数据集中,有许多节点和关系。我试图将显示限制为“树”。仅查看这两个关系/节点。
谢谢!
答案 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