使用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;
来一发吐槽