2016-09-08 3 views
1

Ich versuche Multi-Tenancy in Neo4j mit OGM zu implementieren. Meine bevorzugte Lösung ist die Verwendung von Labels zur Kennzeichnung von Entitäten mit Mandanten-ID. Leider kann ich keine Etiketten für die Arbeit in Scala bekommen. Zuerst habe ich meine Entitäten wie folgt aus:Labels in Neo4j OGM mit Scala

trait Entity { 
    @GraphId 
    @Property 
    var graphId: java.lang.Long = _ 
} 

@NodeEntity 
class Tenant extends Entity { 

    @Property 
    var name: String = _ 

} 

@NodeEntity 
class Project extends Entity { 

    @Property 
    var name: String = _ 

    @Relationship(`type` = "TENANT", direction = Relationship.OUTGOING) 
    var tenant: Tenant = _ 

    @Labels 
    val labels: java.util.Collection[String] = new java.util.ArrayList[String]() 

    def this(name: String, tenant: Tenant) { 
    this() 
    this.labels.add(tanant.uuid.toString) 

    } 

    def hasLabel(label: String): Boolean = { 
    this.labels.contains(label) 
    } 

} 

Meine Repositories haben nur eine einfache Methode

abstract class Repository[Model <: Entity] { 

    def save(entity: Model): Model = { 
    val session = getSession() 
    session.save(entity) 

    entity 
    } 

} 

speichere ich einen einfachen Test mit einem eingebetteten Neo4j Datenbank erstellt, aber die letzte Behauptung irgendwie falsch (was bedeutet, dass das hinzugefügte Etikett nicht beibehalten wird).

class ProjectSuite extends BaseSuite with Neo4jOgmTestSuite { 

    "Project Model" should { 

    "save properly with Tenant label" in { 
     val tenant = new Tenant("TestTenant") 
     TanantRepository.save(tenant) 

     val project = new Project("TestProject", tenant) 
     ProjectRepository.save(project) 

     assert(project.hasLabel(tenant.uuid.toString)) 

     val loadedProject = ProjectRepository.findById(project.uuid) 
     assert(loadedProject isDefined) 
     assert(loadedProject.get.hasLabel(tenant.uuid.toString)) 
    } 

    } 

} 

Irgendeine Idee, was ich hier vermisse?

+0

Seitennotiz: da gewesen, getan, ging es anders. Wenn Sie Mandanten-IDs als Beschriftungen verwenden, müssen Sie für jeden Mandanten spezifische Cypher-Abfragen generieren, da Sie keinen Platzhalter für eine Beschriftung verwenden können (da sie zur Berechnung des Ausführungsplans verwendet werden). Es wird also etwas hässlich, und Sie füllen schnell den Abfrage-Cache (wo sie geparst/vorkompiliert sind/der Ausführungsplan könnte berechnet werden), da es für jeden Mandanten eine Version jeder Abfrage gibt. –

+0

Code sieht OK aus, obwohl ich etwas verpasst haben könnte, da ich in Java und Kotlin mehr als Scala kodiere. (Ich sollte das ändern;)). Können Sie ein fehlerhaftes Beispiel senden und ich werde es für Sie debuggen? Ich implementierte das Label-Feature in der OGM - [email protected] –

+0

@Frank Weitere Optionen neben diesen beiden (was verwenden Sie?): Http://grafhaware.com/neo4j/2015/01/16/neo4j-graph -model-design-labels-versus-indexed-properties.html – Alebon

Antwort

1

Dieses Problem war ein Fehler darin, dass jede Klasse ohne eine get/set-Methode, die das Feld labels unterstützt, nicht unterstützt wurde. Es wurde behoben und ist in 2.1.0-SNAPSHOT verfügbar.

Verwandte Themen