2016-08-19 2 views
1

Я моделирую свое первое приложение Spring Neo4j Spring, и я задаюсь вопросом о подклассе @RelationshipEntity classes - 1) это можно сделать, и 2) это хорошая идея?Spring Data Neo4j @RelationshipEntity подклассы?

Вот пример того, что я думаю об использовании RSS.

Feed имеет много Entry с и существует 3 типа записи:

  1. Оригинал запись (новое содержание)
  2. реблог содержание
  3. В избранное содержание (фактически вырожденный Переблог)

Корма может выглядеть примерно так: @Relationship List<Entry> entries; , где Liked является вспомогательным класс Reblog, который является подклассом Entry.

Это кажется более естественным, учитывая 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, так что я не знаю, если какой-либо из этих идей ничего хорошего.

С точки зрения запроса, я хочу задавать вопросы обо всех конкретных типах (или комбинациях типов) Entry и Entry с в целом.

Понятия к идеям дизайна/моделирования приветствуются.

ответ

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 - соединение настоятельно рекомендуется.