如何在Spring Data Neo4j 4.0.0中使用路径查询获取节点ID?

时间:2015-10-07 15:07:58

标签: neo4j spring-data-neo4j spring-data-neo4j-4

我有一个从以下节点构建的图表:

@NodeEntity
public class Node {
    @GraphId
    private Long id;
    private String desc;
    @Relationship(type = "CONNECTED_WITH", direction = Relationship.UNDIRECTED)
    private Set<Node> nodes;
    //getters and setters
}

My Spring Data存储库包含Cypher查询,用于查找这些节点之间的最短路径:

@Query("START startNode = node({startId}), endNode = node({endId}) " +
       "MATCH paths = allShortestPaths((startNode)-[*]-(endNode)) " +
       "RETURN paths")
Iterable<Map<String, Iterable<Object>>> findShortestPaths(@Param("startId") long startId, @Param("endId") long endId);

Second Iterable将实际路径作为节点和关系列表返回,其中每个节点和关系表示为具有属性的哈希映射。对于这样的简单图表:

  

A - B - C

findShortestPathsA之间的C方法的结果路径包含5个元素:

{desc=DescA}, {}, {desc=DescA}, {}, {desc=DescA}

我猜空映射表示节点之间的关系,在这种情况下,它们没有任何属性。我的问题是代表节点的地图不包含id属性。

问题: 是否可以将节点作为对应的实体对象而不是哈希映射返回?如果没有,我如何在返回的哈希映射中获取路径节点的id?

2 个答案:

答案 0 :(得分:3)

不幸的是,节点ID并不可用作地图结果的一部分。已打开https://jira.spring.io/browse/DATAGRAPH-771进行跟踪。

答案 1 :(得分:1)

最终,我最终得到了一个修改过的Cypher查询,它在路径节点旁边还返回了提取的id作为结果映射中的单独迭代。

@Query("START startNode = node({startId}), endNode = node({endId}) " +
       "MATCH paths = allShortestPaths((startNode)-[*]-(endNode)) " +
       "RETURN nodes(path) AS nodes, EXTRACT(node IN nodes(path) | ID(node)) AS ids")

虽然这个解决方案远非完美,但至少它会返回所需的细节。