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?
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. –
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] –
@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