首页 > 解决方案 > 如何使用弹簧数据neo4j查找2度朋友之间的关系

问题描述

我的关系图如下图
使用MATCH (n:Person {name:'1'})-[]-()-[r]-(m) RETURN m,r将返回“4”和“5”,但无法获得“4”和“5”之间的关系,实际上,“4”跟随“5”,“r”只是代表4的朋友(4-->2) 和 5(5-->3)。
在spring数据neo4j
domain.java中

@NodeEntity(label = "Person")
public class PersonTest {
@Id
private Long id;
@Property(name = "name")
private String name;
@Relationship(type = "Follow")  //direction=Relationship.DIRECTION
private List<PersonTest> friends;

存储库.java

public interface PersonRepository extends Neo4jRepository<PersonTest,Long> {
    @Query("MATCH (n:Person {name:{name}})-[]-()-[r]-(m) RETURN m,r")
    Collection<PersonTest> graph(@Param("name") String name);
}

服务.java

 Collection<PersonTest> persons = personRepository.graph(name);
 Iterator<PersonTest> result = persons.iterator();
 while (result.hasNext()) {
      for (PersonTest friend : p.getFriends()) {
           //........here will get 2 and 3!
      }
 }

如何解决这个问题?得到“4”和“5”之间的关系。

标签: neo4jcypherspring-data-neo4j

解决方案


要查找某个级别的相关子项,可以使用可变长度的双边模式:

MATCH (n:Person {name:'1'})-[:Follow*2]->(m)-[r:Follow]-()<-[:Follow*2]-(n) 
RETURN m,r

http://console.neo4j.org/r/el2x80

更新。我认为这是一个更正确的查询:

MATCH (n:Person {name:'1'})-[:Follow*2]->(m:Person)-[r:Follow]-(k:Person) 
WHERE (n)-[:Follow*2]->(k) 
RETURN m, r

http://console.neo4j.org/r/bv2u8k


推荐阅读