数据模型:
我有一个存储在neo4j中的树结构,其中:Node
类型的节点可以是相同类型节点的父节点。
: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
节点时,具有相同类型父节点的节点将这些父节点放在子节点列表中,这显然是错误的并且导致其他问题。请参阅所述数据集的调试器屏幕截图:
如何解决这个问题?
答案 0 :(得分:4)
使用Spring Data Neo4j(SDN)时,如果存在相同类型的传入和传出关系的组合,则需要注释传入关系字段的字段和setter / getter,否则最终会得到不正确的映射。
这在SDN documentation中说:
@Relationship上的direction属性默认为OUTGOING。必须使用INCOMING方向显式注释由INCOMING关系支持的任何字段或方法。
在neo4j-ogm(春季数据neo4j 4+中使用的映射库)中还创建了一个问题/功能请求。