Spring Data Neo4j中的自定义查询无法检索关系

时间:2016-01-07 14:27:22

标签: java spring groovy spring-data-neo4j-4 neo4j-ogm

因此,对于一些复杂的操作,我在我的图形存储库中使用@Query注释在我的自定义查找器方法上使用自定义Cypher查询。但是,在检索节点时,它不会检索其直接关系(即只有1级)。

@Query("match (node:T) return node Order by node.requestedAt Desc LIMIT 100")
List<T> last100T();

@Query("match (node:T) where node.status = \"REQUESTED\" and  timestamp() - node.requestedAt >= 60000 return node")
List<Transit> findUnmatchedAndExpiredT();

我正在使用它们 - (代码是groovy):

 def nodes = TRepository.findUnmatchedAndExpiredT()
    nodes.forEach({
        node ->
            node.status = TStatus.DECLINED
            node.neighbourA.status = NeighbourAStatus.BARRED
            def neighbourBQueue = client.queue(node.neighbourB.username)
            neighbourBQueue.push(mapper.writeValueAsString(node))

    TRepository.save(node)
})

它们是如此相关:

    @NodeEntity
class T{

    public T(){
    }

    @GraphId
    Long id

    @Relationship(type = "REQUESTED_BY", direction = Relationship.OUTGOING)
    NeighbourB neighbourB

    @Relationship(type = "SERVICED_BY", direction = Relationship.OUTGOING)
    NeighbourA neighbourA
}

当关系存在时,邻居A和B都为空。做什么?我正在使用带有spring-data-neo4j的Spring启动1.2.7.RELEASE:4.0.0.RELEASE

2 个答案:

答案 0 :(得分:3)

自定义查询(@Query)不支持深度参数,它们准确映射查询返回的内容。如果您要返回单个节点,它将映射该单个节点。在运行时不会修改查询以包含额外的关系。

您可以改为返回节点ID,然后使用默认深度(1)或自定义深度load返回它。

在将来的版本中,SDN 4将能够将自定义查询中返回的多个实体映射到域实体。

答案 1 :(得分:0)

同时,它似乎可用于深度1。结果节点包含对关系对象的非null引用。但是,重要的是要返回所有3个结果:节点(n),关系类型(r),关系节点(u),例如e。 g。:

@Query("MATCH(n:MyEntity) MATCH (n)-[r:MY_REL_TYPE]-(u) RETURN n, r, u LIMIT {0}")
List<MyEntity> getAll(int limit);