首页 > 解决方案 > Neo4j Cypher - 分别并按顺序获取多条路径上的节点

问题描述

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

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

在此处输入图像描述

我想找到从节点A到节点F的每条路径中的所有节点(按遍历顺序)

例如:对于路径 A-->B-->FI 想要节点 A、B、F(按此顺序)

对于路径 A-->C-->D-->FI 需要节点 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>>.

希望你能明白。

任何人都可以就我如何实现预期结果提供一些指示/建议。

问候, 瓦伦

标签: neo4jcypherspring-data-neo4jneo4j-ogm

解决方案


我能够找到自己问题的答案。我从另一个 SO 答案中得到了提示。 弹簧数据 | 新4J | 以正确的顺序查询路径

这就是我为获得预期结果所做的事情

@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:注意我故意跳过查询中的关系,因为我只对获取节点感兴趣。

问候,


推荐阅读