GraphDB 查询和分片

Posted

技术标签:

【中文标题】GraphDB 查询和分片【英文标题】:GraphDB querying and sharding 【发布时间】:2013-11-28 13:07:11 【问题描述】:

我最近一直在测试 Titan-Cassandra 和 OrientDB,我想到了一个问题。

我只是想知道 graphDBs 如何跨不同集群对图进行分片,以及它们的查询接口如何支持对分片图的查询,例如寻找两个节点之间的最短路径。

我知道 Gremlin 为它的 groupby 函数实现了Mapreduce pattern。

但我想更深入地了解查询分片之间的关系以及两个数据库如何处理分片图上的查询。我特别感兴趣的是 OrientDB 的 SQL 接口如何支持跨分片图的查询。

我知道 Neo4j 反对分片,正如我问过的 previous question 所建议的那样。

【问题讨论】:

【参考方案1】:

请看以下两篇关于 Titan (http://titan.thinkaurelius.com) 的帖子:

小规模的泰坦 -- http://thinkaurelius.com/2013/11/24/boutique-graph-data-with-titan/ 大尺度泰坦 -- http://thinkaurelius.com/2013/05/13/educating-the-planet-with-pearson/

通常,当您开始开发图形应用程序时,您使用的是一台机器。在这个模型中,整个图在一台机器上。如果图表很小(数据大小)并且事务负载很低(不是大量的读/写),那么当您投入生产时,您只需添加复制以实现高可用性。使用非分布式复制,数据被完全复制到其他机器,如果任何一台机器出现故障,其他机器仍可用于服务请求。再次注意,在这种情况下,您的数据没有分区/分布,只是复制。

接下来,随着图表规模的增长(超出单台机器的内存和 HD 空间),您需要开始考虑分布。通过分发,您可以在多机集群上对图进行分区,并(以确保高可用性)确保您有一些数据冗余(例如复制因子 3)。

从单服务器到分布式集群:http://thinkaurelius.com/2013/03/30/titan-server-from-a-single-server-to-a-highly-available-cluster/

目前Titan中有两种数据分区方式:

    随机分区:顶点及其共同定位的入射边分布在集群中。也就是说,一个顶点和它的入射边形成一个“数据束”并一起存在于一台机器上。随机分区确保集群适当平衡,因此没有一台机器维护所有数据。一种普遍有效的简单分发策略。 用户导向的分区:一个顶点(及其关联边)被分配给一个分区(这个分区最终代表一台机器——尽管由于复制和多台机器上存在相同的数据而不完全正确)。用户导向的分区对于了解其域拓扑的应用程序很有用。例如,您可能知道不同大学的人之间的边缘比同一大学的人之间的边缘要少。因此,智能分区将基于大学。这确保了正确的顶点-顶点共置并减少了希望解决遍历的多机。缺点是您要确保集群不会太不平衡(一个分区上的所有数据)。

归根结底,整个故事都是关于同一地点的。你能确保共同检索的数据在物理空间中接近吗?

http://thinkaurelius.com/2013/07/22/scalable-graph-computing-der-gekrummte-graph/

最后,请注意 Titan 允许使用 Faunus (http://faunus.thinkaurelius.com) 进行并行读取(和写入)。因此,如果您有一个需要扫描整个图的 OLAP 问题,那么 Titan 的协同定位模型作为顶点很方便,它的边是从磁盘顺序读取的。再一次,故事保持不变——在空间中根据时间的共同检索来定位。

http://thinkaurelius.com/2012/11/11/faunus-provides-big-graph-data-analytics/

【讨论】:

以上是关于GraphDB 查询和分片的主要内容,如果未能解决你的问题,请参考以下文章

将数据存储在 GraphDB 的边缘

可嵌入的 GraphDB? [关闭]

如何在graphdb lucene连接器中使用属性路径

哪个 graphdb 用于用户的数据库。 (Neo4j 或 FB 图形 API)

如何从 java 中获取 Neo4j 图形数据库的节点数,我们可以从磁盘存储和重用 graphdb 吗?

当我尝试在构建中包含 neo4j-rest-graphdb 时,我的 Maven 构建失败