2012-05-26 185 views
6

使用spring-data-neo4j,我想創建兩個類,使用@RelationshipEntity(type="OWNS")Person類鏈接到PetCar相同類型的多個關係類

@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; 
} 

這保存到圖形數據庫正常,沒有任何問題,因爲我可以查詢實際NodeRelationship,看看他們

但是,當我嘗試使用@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()被省略了,但它只是簡單地調用toString()每個字段)是這樣的:

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

有誰知道這可以完成,應該完成,只是一個錯誤或缺少的功能?

回答

3

看來問題似乎是,註釋導致springDataNeo4j優先考慮關係名稱。我在我創建的另一個示例上也嘗試過。如果兩個註釋都包含 type="OWNS",它將混合兩個「對象」。當我忽略這些信息時,只使用方向和類型,它對我很有用。

不幸的是,如果您將另一個@RelatedTo註釋與更多的Pets或Cars與另一個註釋相關聯,則會導致問題。由於「OWNS」和任何其他與寵物類型的關係並不相同,該集合將返回所有相關寵物(例如:peter - >(HATES-Relationsip) - >狗)。

如果這是一個錯誤,我不能告訴......但對於數據庫:只有節點和關係。兩者都沒有輸入,所以neo4j不知道你的'寵物'或'Car'-Class。 Spring數據neo4j通過索引每種類型的所有節點並設置類型屬性或使用特定的圖形佈局(使用子引用)來處理此問題。即使你想用遍歷描述來獲取一個人的所有寵物,你也會有更多的代碼來寫,因爲與'OWNS'這個名字的傳出關係包含兩種類型的對象。

我會建議使用兩個不同的名稱。稍後編寫自定義遍歷/查詢會更容易,而且它可能會更快,因爲不需要類類型比較。有什麼理由,爲什麼你需要這些特定的名字?

PS:有可能,並非所有事情都100%準確。我不詳細地瞭解springdataneo4j,但這就是我到目前爲止所瞭解的。

相關問題