【问题标题】:How to partition a single Neo4j database?如何对单个 Neo4j 数据库进行分区?
【发布时间】:2014-03-09 06:51:51
【问题描述】:

能不能把一个Neo4j数据库拆分成一个数据库有多个起点,这样就可以隔离所有查询,而不是多个数据库?

我已经考虑过这一点,我认为它可以在一定程度上起作用,但是一旦使用了诸如标签之类的东西,那么这个想法就行不通了,因为标签查询将始终跨越整个数据库。

无论如何,我想知道是否有人成功地做到了这一点以及他们是如何做到的。

【问题讨论】:

  • 您是否尝试过为此使用 WHERE 子句?例如。使用类似这样的电影数据集MATCH (people:Person)-[relatedTo]-(movie:Movie) WHERE people.name in ["Tom Hanks", "Keanu Reeves"] RETURN people.name, Type(relatedTo), relatedTo
  • 是的,我尝试了 WHERE 子句,但我在所有查询中都使用了 people.db_type = 'schema_id_323'。但是对于开发人员来说,它变得非常麻烦,为 where 子句中的每个项目添加一个属性。我认为使用 START 会很好,因为它可以添加到每个查询的开头。

标签: neo4j


【解决方案1】:

您所描述的内容听起来像是多租户。 Neo4j 2.0.1 目前不支持多租户功能。在 Neo4j 数据库实例中实现多租户架构有多种方法和策略。

您可以按标签对属性图集进行分区。由于节点可以有多个标签,因此您可以使用该分区的唯一标识标签来标记一个分区。

请参阅此处的标签文档:http://docs.neo4j.org/chunked/milestone/graphdb-neo4j-labels.html

使用此策略需要注意的事项是确保您的所有 Cypher 调用都包含标签的分区标识符,以确保两个分区在图中相互隔离。确保来自一个分区的关系不会跨越另一个分区非常重要。

例如,分区 1 可以是标签 Partition1。假设您的应用程序上下文在 Partition1 上运行:

MERGE (user:User:Partition1 { name: 'Peter' })
RETURN user

假设您的应用程序上下文在 Partition2 上运行:

MERGE (user:User:Partition2 { name: 'Peter' })
RETURN user

执行这两个查询时,会为 Partition1Partition2 创建两个单独的 Peters。

您只需要确保您的应用程序正在运行的分区标签将其标签附加到您的每个查询。虽然这很乏味,但这是目前进行多租户的建议方法。

【讨论】:

  • 听起来是一种合理的做法。有没有办法让每个查询自动为相关分区添加 :Partion2 限定符而不在 Cypher 中指定它?
  • 在代码中这应该不会太难实现。编写一个类,该类采用在 Cypher 查询之上运行的租户上下文,并在任意标签上匹配的任何地方注入分区标签。
  • 租约上下文?我什至没有听说过这个。我会研究这个并尝试一下。顺便说一句,我正在通过 Clojure 和 Neocons 库访问 Neo4j,所以我需要比 Java APi 更深入一点
  • 租户上下文是指租户的上下文,即您的分区:)
  • 如何动态设置标签名称?例如。分区XYZ
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多