我在我的应用程序中使用Neo4j(3.4.1版)和Spring-data-neo4j(5.0.10.RELEASE)。我也在使用OGM。
我的节点之间具有以下关系:
我想找到从节点A到节点F的每条路径中的所有节点(按遍历的顺序)
例如: 对于路径A-> B-> F,我想要节点A,B,F(按此顺序)
对于路径A-> C-> D-> F,我希望节点A,C,D,F(按此顺序)等。
我想分别捕获每个路径中遍历的节点。
我想到的密码查询如下:
@Query("MATCH p=((u:User{name:{nameOne}})-[:RELATED*1..3]-(v:User{name:{nameTwo}})) RETURN p")
List<User> getRelationBetweenUsers(@Param("nameOne") String nameOne, @Param("nameTwo") String nameTwo);
我还尝试使用List<List<User>>
作为返回类型,以便将每个路径上的节点作为单独的列表如下所示
@Query("MATCH p=((u:User{name:{nameOne}})-[:RELATED*1..3]-(v:User{name:{nameTwo}})) RETURN p")
List<List<User>> getRelationBetweenUsers(@Param("nameOne") String nameOne, @Param("nameTwo") String nameTwo);
但是,这将返回在多个路径中一起遍历的所有节点,而我希望每个路径都具有它们。
i.e result is List <A,B,C,D,F> where as what I want is
List<List<A,B,F>, List<A,C,D,F>, List<A,D,F>>.
希望您能明白。
任何人都可以对我如何实现预期结果提出一些建议/建议。
关于, 瓦伦
答案 0 :(得分:0)
我能够找到自己的问题的答案。我从另一个SO答案中得到了提示。 Spring Data | Neo4J | Querying for the path in the correct order
这是我获得预期结果的方法
@Query("MATCH p=((u:User{name:{nameOne}})-[:RELATED*1..3]-(v:User{name:{nameTwo}})) RETURN nodes(p) as users")
org.neo4j.ogm.model.Result getRelationBetweenUsers(@Param("nameOne") String nameOne, @Param("nameTwo") String nameTwo);
在调用上述方法的服务类中,我具有以下实现:
List<List<User>> usersOnDifferentPaths = new ArrayList<>();
Iterable<Map<String, Object>> queryResults = userRepository.getRelationBetweenUsers(nameOne, nameTwo).queryResults();
queryResults.forEach(queryResult -> {
List<User> usersOnSinglePath = (List<User>) queryResult.get("users");
usersOnDifferentPaths.add(usersOnSinglePath);
});
希望有人会觉得有用。
PS:注意,由于我只对获取节点感兴趣,因此我故意跳过了查询中的关系。
此致
V