残念ながら、十分な情報がなく、"OWNER - OWNED ITEMS" のような Java 関連エンティティで表現する最良の方法を示す例もありません。
私は neo4j 関係の方向性について話しているのではなく、そのようなエンティティを保存する際の Java データ表現と永続化動作についてのみ話しています。 ここでは、永続化の深さについてガイドが説明しています。
「...この動作は、アノテーションで構成されたリレーションシップの方向に依存しないことにも注意してください。これは Java 参照の問題であり、データベース内のデータ モデルとは関係ありません。」
データ モデルで選択する戦略を理解したい。そう...
たとえば、(同じタイプの)多くのサブタスクを持つことができるクラス「タスク」があります。どのタスクも「プロジェクト」が所有でき、「コンポーネント」のメンバーになることができます...それにもかかわらず、タスクはプロジェクトが直接所有でき、コンポーネントとはまったくリンクできません。
オプション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<>();
}
これは、最も論理的なデータ表現のようです。しかし、欠点があるようです:
新しいタスクが作成されて template.save(newTask) が呼び出されると、新しいタスク オブジェクトのみが保持され、このタスクとプロジェクトの間の関係を作成します。 - プロジェクト オブジェクトを抽出し、新しく保存されたタスクをコレクション要素として更新する必要があります。したがって、実際には、別の Task オブジェクトを保存する必要さえありません。Project オブジェクトを抽出し、コレクションに Task を追加し、Project を更新することができます...私には奇妙に見えます...
Task オブジェクトを作成するとき、Project はまったく存在しないと想定できます。その場合、Task は Project について何も知らないため、再帰的に作成されません...
オプション 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
}
このモデルでは、db から既存のプロジェクトを抽出した新しいタスクまたは新しいコンポーネントの設定 (または新しいプロジェクトの設定) を作成し、それらの両方を保存できます...そして、親オブジェクトが子と同様に永続化されることを確認します。
欠点:
リレーションデータベースの「FOREIGN_KEY」リンクのように見えます...
たとえば、タスクが一部のプロジェクトまたはコンポーネントにリンクされていない場合、冗長な「null」プロパティがあります...
したがって、何を選択すればよいかわかりません-両方のソリューションが機能します...しかし、それは機能することではなく、「クリーンコード」についてです