2016-08-19 97 views
1

我正在建模我的第一個Spring Data Neo4j應用程序,並想知道子類@RelationshipEntity類 - 1)是否可以完成,以及2)它是一個好主意嗎?Spring Data Neo4j @RelationshipEntity子類?

下面是我想要使用RSS的一個例子。

一個Feed有許多Entry S和有3種類型的條目:

  1. 原始項(新內容)
  2. Reblogged內容
  3. 喜歡的內容(有效地退化的一個reblog)

Feed可能看起來像這樣: @Relationship List<Entry> entries; 其中Liked是一個子這是Reblog的一個子類。

這似乎更自然賦予RelationshipEntities是第一類對象: @Relationship(type="Content", Relationship.OUTGOING) List<Entry> entries; ... @RelationshipEntity(type="Content") public class Content { ... @RelationshipEntity(type="RebloggedContent") public class RebloggedContent extends Content { ... @RelationshipEntity(type="LikedContent") public class LikedContent extends Content { ... 正如我所說的,這是我第Neo4j的應用程序,所以我不知道是否有這些想法有什麼好處。

從查詢的角度來看,我想作爲一個整體提出關於EntryEntry這兩種特定類型(或組合類型)的問題。

讚賞設計/建模思路的指針。

回答

2

這是可能的亞類關係的實體具有以下的警告:

  • 每個子類關係的實體必須聲明它除了從基類的附加區別屬性 - 此信息由用於類型自省的OGM工具。

實施例:

這裏的一個基地關係的實體的一個示例(在科特林JVM語言):

abstract class Relationship 
{ 
    @GraphId 
    internal var graphId: Long? 
     private set 

    @StartNode 
    var auditioner: CandidateProfile 

    @EndNode 
    var auditionee: CandidateProfile 

    var createdDate: Date 

    init 
    { 
     this.graphId = null 
     this.auditioner = CandidateProfile() 
     this.auditionee = CandidateProfile() 
     this.createdDate = Date() 
    } 

    abstract fun mutualRelationship(): Relationship? 


} 

隨着一個亞類:

@RelationshipEntity(type = "MAYBE_LATER") 
class MaybeLater constructor(auditioner: CandidateProfile, 
          auditionee: CandidateProfile, 
          timeOut: Date?) : Relationship() 
{ 
    var timeOut: Date? 
    var count: Int 

    init 
    { 
     this.auditioner = auditioner 
     this.auditionee = auditionee 
     this.timeOut = timeOut 
     this.count = 1 
    } 

    //Provide default constructor for OGM 
    constructor() : this(CandidateProfile(), CandidateProfile(), null) 


    override fun mutualRelationship(): MaybeLater? 
    { 
     return auditionee.maybeLaters.find { it.auditionee == auditioner } 
    } 
} 

用法:

class CandidateProfile { 

    @Relationship(type = "LIKES", direction = Relationship.OUTGOING) 
    var likes: MutableSet<Like> 

    @Relationship(type = "DISLIKES", direction = Relationship.OUTGOING) 
    var dislikes: MutableSet<Dislike> 

    @Relationship(type = "MAYBE_LATER", direction = Relationship.OUTGOING) 
    var maybeLaters: MutableSet<MaybeLater> 
} 

請注意,我們爲每個單獨的關係類型定義一個集合。如果需要單個集合集合,則需要使用代碼完成。

Neo4j的用戶鬆弛頻道:

除了StackOverflow上,在社會各界的Neo4j通過Neo4j Users public Slack channel提供支持 - 加入強烈鼓勵。