编程拾遗

使用Spring Data Neo4J查询路径

playerzhou 无回复

以一个简单的路径查询为例,对于以下查询语句来说

@Query("match p=(n)-[*]-[m] return p")

若使用自己定义的关系类来获取该查询的返回值,得到的结果是查询出的若干路径的所有边的列表,若想获得路径序列,还需再对得到的数据进行处理,并不方便。

通过在Stackoverflow上搜索,我得到如下解决方法,将返回值定义为Iterable<Map<String,Object>>,其中每个Map只有一个Key值“p”,对应value即为该条路径

在Stackoverflow的答案中,获取的路径变量为List,但经过实际测试,也许是Spring Data Neo4j修改了内部实现,获取的路径变量类型为数组,数组中每个元素即代表路径中的某一条边,类型为Neo4j Driver中定义的内部类,但通过查看源码可以发现,该内部类实现接口Path.Segment,因此可直接使用该接口作为变量类型,至于如何使用获取到的变量,可直接参考相应API。

下面即为个人使用该方法获取路径的代码示例:

     Iterable<Map<String,Object>> iterable =entityRepository.getRelation(entity);
        List<List<Integer>> result = new ArrayList<>();
        for(Map<String,Object> row:iterable){
            List<Integer> tmp_path=new ArrayList<>();
            tmp_path.add(entity.getStart());
            Path.Segment[] path= (Path.Segment[]) row.get("p");
            for(Path.Segment segment:path){
                Map<String, Object> map=segment.end().asMap();
                tmp_path.add(Integer.valueOf(map.get("entityId").toString()));
            }
            result.add(tmp_path);
        }
        return result;

来一发吐槽

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据