オントロジー用語を Neo4j データ構造にマップしようとしています。
正確には、Term
クラスと 2 種類の関係 (is_a
とpart_of
) があります。私は次のクラスを持っています:
用語クラス:
@NodeEntity
public class Term {
@GraphId
private Long nodeId;
@Indexed(unique=true)
private String id;
private String name;
private String definition;
@RelatedToVia(type="is_a",direction=Direction.INCOMING)
private Set<Term2Term> is_a_children;
@RelatedToVia(type="is_a",direction=Direction.OUTGOING)
Set<Term2Term> is_a_parents;
@RelatedToVia(type="part_of",direction = Direction.INCOMING)
Set<Term2Term> part_of_children;
@RelatedToVia(type="part_of",direction = Direction.OUTGOING)
Set<Term2Term> part_of_parents;
}
Term2Term クラス:
@RelationshipEntity
public class Term2Term {
@GraphId
Long id;
@StartNode private Term child;
@EndNode private Term parent;
}
マッピングは正常に機能し、特定のコレクション (つまり is_a_children) へのアクセスは正常に機能します。ただしNavigationTree
、データを入力する必要があるユースケースがあります。次のようになります。
-Term 1
- Term 1.1 (is_a)
-Term 1.1.1 (part_of)
- Term 1.2 (part_of)
- Term 1.3 (is_a)
- Term 1.3.1 (part_of)
- Term 1.3.2. (is_a)
....
には、さまざまな関係タイプのNavigationalTree
概念がありません。
さまざまな関係コレクション (つまり、is_a_children と part_of_children) を 1 つのコレクションに結合し、関係のタイプに関する情報を (表示するために) 保持する必要があります。
もちろんSets.union
、2 つのセットの (グアバ) を実行するゲッターを作成できますが、この方法では関係タイプに関する情報が失われます。ハックではない唯一の方法は、グラフ データベースで 2 つの関係タイプ (is_a、part_of) の代わりに 1 つの汎用関係タイプを使用し、そのタイプをプロパティとして関係に追加することです。
他に方法はありますか?
更新 1:
Spring Data Neo4j - @RelationshipType の問題を解決するには、継承を使用する必要があるようです