无法在Sprint Neo4j中通过@Query加载实体的“子级”

时间:2019-01-06 04:53:37

标签: neo4j spring-data-neo4j

我有一个这样的实体:

@NodeEntity
public class Move {
    @Id @GeneratedValue private Long id;

    @Property("placement")
    private String placement;

    @Relationship(type="PARENT", direction=Relationship.INCOMING)
    BoardPosition parent;

    @Relationship("CHILD")
    BoardPosition child;

    [...]

当我像这样“加载”它时:

Move the_move = m_store.findByPlacement("C1");
log.info("Move direct load: " + the_move.toString());

它工作正常。 parentchild属性都具有正确的值。

但是,当我通过这样定义的查询访问它时:

public interface MoveStore extends Neo4jRepository<Move, Long> {
    public Move findByPlacement(String placement);
    @Query("MATCH (n:Move) RETURN n")
    public List<Move> findAll();

并按以下方式访问:

ListIterator<Move> moves = m_store.findAll().listIterator();

while(moves.hasNext() ) {
    log.info(moves.next().toString());
}

它缺少child值(为空)。

这个实验很奇怪:

while(moves.hasNext() ) {
    Move m = moves.next();
    log.info(m.toString());  // This is missing m.child's value
    // find the same Move, by passing in the id of this one:
    m = m_store.findById(m.id).orElse(null);
    log.info(m.toString());  // This has the correct value for m.child!
}

我想念什么?如何使查询加载子属性?

1 个答案:

答案 0 :(得分:1)

使用自定义查询时,还必须返回关系和相关节点以填充子代。

例如@Query("MATCH (n:Move)-[rel:CHILD]-(c:BoardPosition) RETURN n, rel, c")可以按照1:1的关系进行工作,否则需要collect(...)才能使列表与您要查询的节点在相同的结果“行”中。