【发布时间】:2019-05-03 05:59:54
【问题描述】:
对 Spring Data Neo4j (SDN) 的内置查询默认返回填充深度为 1 的对象。这意味着填充查询返回的对象的“子”(相关节点)。很好 - 这些查询返回的对象的引用末尾有实际对象。
默认情况下,自定义查询的深度为 0。这很麻烦。
在this answer 中,描述了如何让 springboot neo4j 将相关元素填充到自定义查询的目标 - 以从查询中获得额外的一级深度。
当相关元素在列表中时,我无法使用此方法:
@NodeEntity
public class BoardPosition {
@Relationship(type="PARENT", direction = Relationship.INCOMING)
public List<BoardPosition> children;
我有一个返回目标 BoardPosition 的查询,我需要填充它的子级。
@Query("MATCH (target:BoardPosition) <-[c:PARENT]- (child:BoardPosition)
WHERE target.play={Play}
RETURN target, c, child")
BoardPosition findActiveByPlay(@Param("Play") String play);
问题在于查询似乎为每个孩子返回一个单独的结果,而这些结果并未用于填充目标中的孩子数组。
而不是 Spring Neo 将子项整理到目标上的数组中,我得到“只有 1 个预期结果”错误 - 好像查询返回多个结果,每个结果都有一个子项,而不是一个包含子项的结果。
org.springframework.dao.IncorrectResultSizeDataAccessException: 结果大小不正确:预计最多为 1
如何使用自定义查询来填充该目标的子列表?
(请注意,内置的 findByPlay(play) 可以满足我的要求 - 内置查询的深度为 1 而不是 0,它返回一个包含填充子对象的目标 - 但我当然需要进行查询比“by Play”更复杂一点......这就是我需要解决这个问题的原因)
版本:
org.springframework.data:spring-data-neo4j:5.1.3.RELEASE
neo4j 3.5.0
【问题讨论】:
-
您使用的是哪个版本。
-
你能返回路径吗?
-
“返回路径”是什么意思?我已经read 关于如何返回节点、关系和属性,没有看到“路径”?
-
你可以编写自己的拦截器。
-
您的问题似乎与我遇到的有点不同,但它们仍然与 自定义查询返回的同类型节点的投影(返回值评估)有关 .因此,请查看我们的discussion 和 michael-simons 关于 Neo4J OGM 错误的信息。它可能也影响了您的用例。因此,如果您仍然遇到问题,不妨尝试一下 Neo4J OGM 的 alpha(或现在的 RC)版本。
标签: spring-boot neo4j cypher