我有一个树形数据结构,我想使用Neo4j进行存储。
父节点:CodeSet
始终是树的根节点和子节点:Node
,它们本身可以具有相同类型的子节点。它们与:SUBTREE_OF
类型的关系相关联,如下所示:
父节点显示为红色,其本身的父节点显示为绿色。
只要父节点和子节点有一些公共数据,我就创建了一个抽象类:
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;
}
有了这个,我得到了以下结果:
这种关系破裂了。我还尝试在depth=1
方法参数中指定findById
,但这又导致了错误的关系:
之后我尝试将我的类中的双向关系修改为单向关系,因为只有一个类的注释带有指向另一个的@Relatinship
字段,但这也无济于事。
如何使这项工作?
答案 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更新时,关系是双边的。