1

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

@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
}

我的 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);

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

A -- B -- C

方法的结果路径findShortestPaths介于A和之间,C包含 5 个元素:

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

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

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

4

2 回答 2

3

不幸的是,节点 ID 不能作为 Map 结果的一部分。打开https://jira.spring.io/browse/DATAGRAPH-771来跟踪它。

于 2015-10-07T17:23:32.713 回答
1

Eventually I ended up with a modified Cypher query that beside path nodes returns also extracted ids as a separate iterable inside the result map.

@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")

Although this solution is far from perfect, at least it returns required details.

于 2015-10-08T12:00:34.537 回答