Java SpringDataNeo4j-4:将集合中的实体(拥有的项目)存储在“内部”;“业主”;类表示策略

Java SpringDataNeo4j-4:将集合中的实体(拥有的项目)存储在“内部”;“业主”;类表示策略,java,neo4j,spring-data-neo4j-4,neo4j-ogm,Java,Neo4j,Spring Data Neo4j 4,Neo4j Ogm,不幸的是,没有足够的信息和示例来演示在Java相关实体(如“所有者拥有的项”)中表示的最佳方式 我不是在谈论neo4j关系方向,而是在保存这些实体的同时讨论java数据表示和持久性行为。 指南介绍了持久性深度: “…还请注意,此行为不依赖于任何配置 注释上的关系方向。这是Java的问题 引用,并且与数据库中的数据模型无关。” 我想了解在我的数据模型中选择什么策略。所以 例如,我有一个类“Task”,它可以有许多子任务(同一类型)。任何任务都可以归“项目”所有,也可以是某个“组件”的成员。。。尽管

不幸的是,没有足够的信息和示例来演示在Java相关实体(如“所有者拥有的项”)中表示的最佳方式

我不是在谈论neo4j关系方向,而是在保存这些实体的同时讨论java数据表示和持久性行为。 指南介绍了持久性深度:

“…还请注意,此行为不依赖于任何配置 注释上的关系方向。这是Java的问题 引用,并且与数据库中的数据模型无关。”

我想了解在我的数据模型中选择什么策略。所以

例如,我有一个类“Task”,它可以有许多子任务(同一类型)。任何任务都可以归“项目”所有,也可以是某个“组件”的成员。。。尽管如此,任务可以直接归项目所有,并且根本不能和组件链接

备选案文1:

public class Project {

 @Relationship(type = "HAS_TASK", direction = Relationship.OUTGOING)
 private Set<Task> tasks = new HashSet<>();

 @Relationship(type = "HAS_COMPONENT", direction = Relationship.OUTGOING)
 private Set<Component> components = new HashSet<>();


}

public class Component {

 @Relationship(type = "HAS_TASK", direction = Relationship.OUTGOING)
 private Set<Task> tasks = new HashSet<>();                

}

public class Task {

 @Relationship(type = "HAS_SUBTASK", direction = Relationship.OUTGOING)
 Set<Task> subtasks = new HashSet<>();

}
该模型允许创建新任务或新组件,设置从db中提取的现有项目(或设置新项目),并保存它们……并且我们可以确定,父对象和子对象都将被持久化

b拉回:

  • 它看起来像是关系数据库中的“外键”链接

  • 我们有冗余的“null”属性,例如,如果任务没有与某个项目或组件链接


因此,我不知道该选择什么-这两种解决方案都会起作用…但这不是关于工作,而是关于“干净的代码”

一般的指导原则是,对象模型尽可能地映射到基础图

在图中,任务、项目和组件通过关系连接,因此这就是对象模型所表示的

选项2看起来更接近您的图形模型,而选项1限制了导航能力


这篇博文有助于更好地解释这一点:

谢谢!已经读过了)。那么,假设我被第二个绊倒了。。。还有一个问题,为什么第一个“限制航行能力”?感谢您的解释。这看起来确实是最符合逻辑的解释,但我不确定坚持到底是件坏事;-)当然,您可以使用选项1,并根据实体连接的内容管理如何保存实体-这看起来像是要管理的更多代码谢谢!然后选择2…就这样吧)
public class Project { }

public class Component {

 private Project project;   

}


public class Task {

 private Task parentTask: // can be null

 private Component component; // can be null

 private Project project; // can be null

}