Neo4j Cypher-分别并按顺序获取多个路径上的节点

时间:2019-01-09 01:27:25

标签: neo4j cypher spring-data-neo4j neo4j-ogm

我在我的应用程序中使用Neo4j(3.4.1版)和Spring-data-neo4j(5.0.10.RELEASE)。我也在使用OGM。

我的节点之间具有以下关系:

enter image description here

我想找到从节点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>>.

希望您能明白。

任何人都可以对我如何实现预期结果提出一些建议/建议。

关于, 瓦伦

1 个答案:

答案 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