neo4j - 如何使用弹簧数据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”之间的关系。
解决方案
要查找某个级别的相关子项,可以使用可变长度的双边模式:
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
推荐阅读
- hardware - 计算机只能使用软件中断吗?
- rest - 如何在同一 URI 上处理无参数和参数化 REST 服务
- java - 如何根据坐标仅使我的部分布局(包括部分视图)不可见?
- c++ - Boost.Graph 和 Graphviz 嵌套子图
- javascript - javascript 设置值输入字段文本共享点信息路径表单
- julia - 在 Julia 1.0+ 中:如何使用 redirect_stdout 获取字符串
- clojure - 使用规范/合并与规范/多规范
- swift - UICollectionView 和 FlowLayout 的单元格间距不同
- arrays - 为什么在此代码中出现数组超出范围错误?
- java - 如何使用 Spring Boot 应用程序和 Spock 测试在运行时更改服务器端口