6

spring-data-neo4j を使用して、クラスを aとの両方@RelationshipEntity(type="OWNS")にリンクするためにを使用して 2 つのクラスを作成したいと考えています。PersonPetCar

@RelationshipEntity(type="OWNS")
public class OwnsCar {  
    @Indexed
    private String name;

    @StartNode
    private Person person;

    @EndNode
    private Car car;
}

@RelationshipEntity(type="OWNS")
public class OwnsPet {
    @Indexed
    private String name;

    @EndNode
    private Person person;

    @StartNode
    private Pet pet;
}

実際Nodeにクエリを実行して、タイプなどRelationshipを確認できるため、これは問題なくグラフ データベースに適切に保存されます。

しかし、使用しようとする@RelatedTo(type="OWNS", elementClass=Pet.class)とクラスキャスト例外が発生するか、遅延初期化を使用すると誤った結果が得られます。

@NodeEntity
public class Person {   
    @Indexed
    private String name;

    @RelatedTo(type="OWNS", direction=Direction.OUTGOING, elementClass=Pet.class)
    private Set<Pet> pets;

    @RelatedTo(type="OWNS", direction=Direction.OUTGOING, elementClass=Car.class)
    private Set<Car> cars;
} 

toString()my person (myは省略されていますが、単にtoString()for each フィールドを呼び出すだけです)を印刷しようとしたときに得られる結果は次のとおりです。

Person [nodeId=1, name=Nick, pets=[Car [nodeId=3, name=Thunderbird]], cars=[Car [nodeId=3, name=Thunderbird]]]

これが可能かどうか、行う必要があるかどうか、単なるバグまたは欠落している機能かどうかを誰かが知っていますか?

4

1 に答える 1

3

問題は、アノテーションにより springDataNeo4j が関係名を優先することです。私が作成した別のサンプルで同じことを試しました。両方の注釈が含まれている場合 type="OWNS"は、両方の「オブジェクト」が混在しています。この情報を省略し、方向とタイプのみを使用すると、うまくいきます。

残念ながら、別の @RelatedTo アノテーションを別のアノテーションに関連するペットまたは車と一緒に使用している場合、これは問題につながります。"OWNS" と Pet-Type に対するその他の関係との間で違いがないため、セットは関連するすべてのペットを返します (例: ピーター ->(HATES-Relationsip)->dogs)。

バグかどうかはわかりませんが、データベースに関しては、ノードとリレーションしかありません。どちらも型付けされていないため、neo4j は「ペット」または「車」クラスについて何も知りません。Spring データ neo4j は、タイプごとにすべてのノードにインデックスを付けてタイプ属性を設定するか、特定のグラフ レイアウト (サブリファレンス付き) を使用することによって、これを処理します。トラバーサルの説明を持つ人物のすべてのペットを取得したい場合でも、'OWNS' という名前の発信リレーションには 2 種類のオブジェクトが含まれているため、記述するコードは非常に多くなります。

2 つの異なる名前を使用することをお勧めします。カスタム トラバーサル/クエリを後で記述する方が簡単で、クラス タイプの比較が必要ないため、おそらくさらに高速です。これらの特定の名前が必要な理由はありますか?

PS: すべてが 100% 正確であるとは限りません。springdataneo4j については詳しくはわかりませんが、ここまではわかったことです。

于 2012-06-04T15:50:44.117 に答える