SpringDataNeo4j-4:在 "owner" class 表示策略中的集合中存储实体(拥有的项目)

SpringDataNeo4j-4: storing entities(owned items) in collection inside "owner" class representation strategy

不幸的是,没有足够的信息以及演示在 Java 相关实体(如 "OWNER - OWNED ITEMS".

中表示的最佳方式的示例

我不是在谈论 neo4j 关系方向,而是在 java 保存此类实体时的数据表示和持久性行为。 Here 指南谈论持久性深度:

"...Also note that this behaviour is not dependent on any configured relationship direction on the annotations. It is a matter of Java references and is not related to the data model in the database."

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

例如,我有一个 class "Task" 可以有很多子任务(相同类型)。任何任务都可以由 "Project" 拥有,并且可以是某些 "Component" 的成员...尽管如此,任务可以直接由项目拥有,并且根本不能与组件链接。

选项 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<>();

}

这似乎是最符合逻辑的数据表示。但似乎有缺点:

选项 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

}

此模型允许创建新任务或新组件设置从数据库中提取现有项目(或设置新项目)并将它们都保存...而且我们确定,父对象和子对象将被持久化。

反馈:

所以,我不知道该选择什么 - 两种解决方案都可以...但这不是关于工作,而是关于 "clean code"

一般准则是您的对象模型尽可能接近底层图形。

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

选项 2 看起来比选项 1 更接近您的图形模型,后者限制了可导航性。

这篇博客 post 有助于更好地解释这一点:http://graphaware.com/neo4j/2015/09/03/sdn-4-object-model.html