2016-08-19 6 views
1

Ich modelliere meine erste Spring Data Neo4j-App und frage mich, ob ich @RelationshipEntity-Klassen unterklassieren könnte - 1) kann es gemacht werden, und 2) ist es eine gute Idee?Spring Data Neo4j @RelationshipEntity-Unterklassen?

Hier ist ein Beispiel für das, was ich über die Verwendung von RSS denke.

A Feed hat viele Entry s und es gibt 3 Arten von Einträgen:

  1. Original-Eintrag (neue Inhalte)
  2. gerebloggt Inhalt
  3. Zufrieden mit Inhalt (effektiv ein degenerierter Reblog)

Ein Feed könnte wie folgt aussehen: @Relationship List<Entry> entries; wo Liked ist ein Sub Klasse von Reblog, die eine Unterklasse von Entry ist.

Dies scheint natürlicher gegeben RelationshipEntities sind Objekte erste Klasse: @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 { ... Wie gesagt, dies ist mein erster Neo4j app, damit ich weiß nicht, ob eine dieser Ideen alle gut ist.

Aus einer Abfrage Sicht möchte ich Fragen zu beiden bestimmten Arten (oder Kombinationen von Typen) von Entry und Entry s als Ganzes stellen.

Zeiger auf Design/Modellierung Ideen sind willkommen.

Antwort

2

Es ist möglich, Unterklasse Beziehung Einheiten mit folgenden Einschränkung:

  • Jede Unter eingestuft Beziehung Einheit eine zusätzliche Unterscheidungs ​​Eigenschaft erklärt, dass es abgesehen von der Basisklasse setzt - wird diese Information, die von das OGM-Tool für Typ-Introspektion.

Beispiel:

Hier ist ein Beispiel (in der Kotlin JVM Sprache) eine Basis Beziehung Entität:

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? 


} 

Zusammen mit einer Unterklasse:

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

Verwendung:

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

Beachten Sie, dass wir für jeden separaten Beziehungstyp eine Sammlung definieren. Wenn eine einzelne aggregierte Sammlung erforderlich ist, muss dies in Code erfolgen.

Neo4j Benutzer Slack Channel:

Neben Stackoverflow, der Neo4j Community-Support über die Neo4j Users public Slack channel bietet - sehr gefördert verbindet.

Verwandte Themen