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

3

因为一些复杂的操作,我正在使用自定义Cypher查询,并在我的图形存储库中的自定义查找器方法上使用@Query注释。然而,虽然它检索了节点,但它没有检索到其直接关系(即仅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都为null。怎么办?我正在使用Spring boot 1.2.7.RELEASE和spring-data-neo4j:4.0.0.RELEASE。

2个回答

6

自定义查询(@Query)不支持深度参数,并且它们与查询返回的完全相同。如果您返回单个节点,则会映射该单个节点。查询不会在运行时修改以包含额外的关系。

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

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


以下是与此问题相关的问题:[DATAGRAPH-782](https://jira.spring.io/browse/DATAGRAPH-782),[DATAGRAPH-771](https://jira.spring.io/browse/DATAGRAPH-771)和[DATAGRAPH-700](https://jira.spring.io/browse/DATAGRAPH-700)。还请查看关于使用自定义查询的[这篇文章](http://graphaware.com/neo4j/2016/04/06/mapping-query-entities-sdn.html)。 - Gilberto Torrezan
"在以后的版本中" - 这个功能两年后仍然在未来吗?一个没有关系的实体几乎是无用的。 - Abhijit Sarkar
SDN 4已经将自定义查询返回的实体映射到域实体。 - Luanne
4
我正在使用 SDN 5,但它没有返回关联信息。我需要做些特殊的事情吗? - grandouassou

1
与此同时,它似乎适用于深度为1。结果节点包含对关系对象的非null引用。但是重要的是返回所有3个结果:节点(n)、关系类型(r)、关系节点(u),例如:
@Query("MATCH(n:MyEntity) MATCH (n)-[r:MY_REL_TYPE]-(u) RETURN n, r, u LIMIT {0}")
List<MyEntity> getAll(int limit);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接