1
OGMを使用してNeo4jでマルチテナントを実装しようとしています。私のお気に入りのソリューションは、テナントIDのエンティティにラベルを付けることです。残念ながら、私はScalaでラベルを動作させることはできません。 (Neo4jでのラベルScalaを使用したOGM
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)
}
}
私のリポジトリは、単純な私は組み込みのNeo4jデータベースとの簡単なテストを作成する方法に
abstract class Repository[Model <: Entity] {
def save(entity: Model): Model = {
val session = getSession()
session.save(entity)
entity
}
}
を保存していますが、最後のアサーションが偽で失敗します。まず、私はこのように私のエンティティを作成しました追加されたラベルが保持されないことを意味します)。
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))
}
}
}
私はここで何が不足していると思いますか?
サイドノート:そこに行って、別の方法で行った。テナントIDをラベルとして使用するということは、テナントごとに特定のCypherクエリを生成する必要があることを意味します。これは、ラベルのプレースホルダを使用できないためです(実行プランの計算に使用されるため)。そのため、テナントごとにそれぞれのクエリのバージョンが存在するため、クエリキャッシュ(ここでは解析/プレコンパイル/実行プランが計算される可能性があります)をすばやく埋めることができます。 –
コードはOKですが、私はJavaとKotlinでScalaよりもコード化しているので、何かを見逃しているかもしれません。 (私はそれを変更する必要があります;))。失敗したサンプルを送信できますか?それをデバッグしますか?私はOGMのラベル機能を実装しました - [email protected] –
@Frankこれらの2つの他のオプション(あなたは何を使用していますか?):http://graphaware.com/neo4j/2015/01/16/neo4j-graph -model-design-labels-indexed-properties.html – Alebon