如何避免spring数据neo4j将父节点作为树数据结构中子集合的成员获取?

时间:2016-10-27 21:52:19

标签: java neo4j spring-data-neo4j neo4j-ogm nosql

数据模型:

我有一个存储在neo4j中的树结构,其中:Node类型的节点可以是相同类型节点的父节点。 tree structure

右侧显示

:Node个节点。树的根(以红色显示)与叶子共享一些属性,因此有一个名为AbstractNode的抽象类:

public abstract class AbstractNode {
    private Long id;
    @NotEmpty
    private String code;
    @Relationship(type = "SUBTREE_OF", direction = Relationship.INCOMING)
    private Set<Node> children;

    <getters & setters omitted>
}

父节点的类:

public class CodeSet extends AbstractNode {
    @Relationship(type = "SUBTREE_OF", direction = Relationship.OUTGOING)
    private Application parent;

    <getters and setters omitted>
}

子节点的类:

public class Node extends AbstractNode {
    @NotEmpty
    private String description;
    @NotEmpty
    private String type;
    @NotEmpty
    private String name;
    @NotNull
    @Relationship(type = "SUBTREE_OF", direction = Relationship.OUTGOING)
    private AbstractNode parent;

    <getters and setters omitted>
}

服务层:

此方法用于将节点信息检索到指定的深度:

@Transactional(readOnly = true)
    public Node findById(Long id, int depth) throws EntityNotFoundException {
        Node entity = nodeRepository.findOne(id, depth);
        if (entity == null) {
        throw new EntityNotFoundException(String.format("Node %d not found", id));
        } else {
            return entity;
        }
    }

问题: 在获取:Node节点时,具有相同类型父节点的节点将这些父节点放在子节点列表中,这显然是错误的并且导致其他问题。请参阅所述数据集的调试器屏幕截图: debugger screenshot

如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

使用Spring Data Neo4j(SDN)时,如果存在相同类型的传入和传出关系的组合,则需要注释传入关系字段的字段和setter / getter,否则最终会得到不正确的映射。

这在SDN documentation中说:

  

@Relationship上的direction属性默认为OUTGOING。必须使用INCOMING方向显式注释由INCOMING关系支持的任何字段或方法。

neo4j-ogm(春季数据neo4j 4+中使用的映射库)中还创建了一个问题/功能请求。