2016-08-19 61 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提供支持 - 加入强烈鼓励。