如何在spring数据neo4j中正确编码相同类型节点的层次关系?

时间:2016-10-06 15:19:31

标签: java neo4j spring-data-neo4j

我有一个树形数据结构,我想使用Neo4j进行存储。

父节点:CodeSet始终是树的根节点和子节点:Node,它们本身可以具有相同类型的子节点。它们与:SUBTREE_OF类型的关系相关联,如下所示:tree data structure

父节点显示为红色,其本身的父节点显示为绿色。

只要父节点和子节点有一些公共数据,我就创建了一个抽象类:

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>
}

我需要的只是更新子节点。我在服务层使用以下方法:

public Node update(Node node, Long nodeId) throws EntityNotFoundException {
    Node updated = findById(nodeId, 0);
    updated.setDescription(node.getDescription());
    updated.setType(node.getType());
    updated.setName(node.getName());
    updated.setCode(node.getCode());
    nodeRepository.save(updated);
    return updated;
}

有了这个,我得到了以下结果: result of node update 这种关系破裂了。我还尝试在depth=1方法参数中指定findById,但这又导致了错误的关系: enter image description here

之后我尝试将我的类中的双向关系修改为单向关系,因为只有一个类的注释带有指向另一个的@Relatinship字段,但这也无济于事。

如何使这项工作?

2 个答案:

答案 0 :(得分:5)

通过更新服务方法中的保存操作解决:

public Node update(Node node, Long nodeId) throws EntityNotFoundException {
    Node updated = findById(nodeId, 0);
    updated.setDescription(node.getDescription());
    updated.setType(node.getType());
    updated.setName(node.getName());
    updated.setCode(node.getCode());
    //added param depth=0 here
    nodeRepository.save(updated, 0);
    return updated;
}

答案 1 :(得分:0)

也许您在抽象类中定义关系时存在问题。子节点也继承了INCOMING关系,因此当您使用深度1更新时,关系是双边的。