如何对单个Neo4j数据库进行分区?

5

一个Neo4j数据库是否可以划分为多个起始点,以便将所有查询隔离,而不是拥有多个数据库?

我考虑过这个问题,认为在某些程度上可以实现,但一旦使用标签等功能,这个想法就行不通了,因为标签查询始终会跨越整个数据库。

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


1
你尝试过使用WHERE子句吗?例如,使用电影数据集类似于这样的查询:MATCH (people:Person)-[relatedTo]-(movie:Movie) WHERE people.name in ["Tom Hanks", "Keanu Reeves"] RETURN people.name, Type(relatedTo), relatedTo - MarcoL
是的,我尝试了使用WHERE语句,但是在所有的查询中都使用了people.db_type = 'schema_id_323'。然而这对于开发者来说非常繁琐,需要在where子句中的每个项目中添加属性。我认为使用START会很好,因为它可以添加到每个查询的开头。 - yazzapps.com
1个回答

5
您所描述的听起来像是多租户。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创建两个不同的Peter。
您只需要确保应用程序正在操作的分区标签将其标签附加到每个查询中。虽然这很繁琐,但目前建议采用这种方法进行多租户处理。

听起来是一个合理的方法。是否有任何方法可以使每个查询自动添加相关分区的:Partion2限定符,而不需要在Cypher中指定它呢? - yazzapps.com
1
在代码中,这应该不难实现。编写一个类,它接受一个租户上下文,运行在您的Cypher查询之上,并在任意标签匹配时注入分区标签。 - Kenny Bastani
租户上下文?我甚至没有听说过这个。我会研究一下并尝试一下。顺便说一下,我是通过Clojure和Neocons库访问Neo4j的,所以我需要比Java API更深入地了解一下。 - yazzapps.com
1
“Tenancy context” 指的是租户的上下文环境,也就是你们的分区 :) - Kenny Bastani
你如何动态设置标签名称?例如,PartitionXYZ。 - WJA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接