图数据库 vs 文档数据库 vs 三元组存储

32
这是一个比较抽象和一般性的问题。我对使用不同方法来持久化非结构化数据,包括大量内部引用(类似图形)和大量属性(类似JSON)的固有特性(以及实现特定的特性)感兴趣。
  • 由于图是树的超集,你可以将图数据库(例如Neo4j)视为文档数据库(例如MongoDB)的超集。也就是说,图数据库提供了文档数据库的所有功能,而且还允许循环或具有本地指针类型,因此您不必手动取消引用外键/ ID。

  • 那么,在向对象/资源添加更多引用时,是否存在某个临界点,使您更适合使用图形数据库,但之前更适合使用文档存储?文档数据库是否具有优势(存储空间,性能?),或者您应该始终选择图形数据库以防未来需要更多引用?

  • 同样,图形数据库和三元组存储(例如RDF存储)如何比较?节点和边缘具有属性的图形数据库似乎是简单三元组存储的超集。因此,对于什么问题(如果有的话),三元组存储实际上比Neo4j表现更好?(RDF存储的一个优点是有标准化的查询语言 - SPARQL,尽管似乎有很多人不喜欢SPARQL,因此会称其为劣势。)

我想问的是:图形模型(带属性)似乎能够整洁地表达各种数据,但在现实中使用时有什么问题?我认为图形数据库的问题在于性能,所以我想了解一些关于加载、查询和修改数据时会出现什么样的减速情况、内存和持久存储需求的数字或经验法则(与文档和三元组存储相比)。另外,水平扩展方面如何?我有印象那里的竞争场地相当平等。

你认为有可能图形数据库因其表达能力成为没有超大数据的项目的新默认存储模型,还是我们注定要在关系型数据库、JSON存储和图形数据库之间进行多语言持久化十年,它们必须用更多的粘合代码进行集成?

3个回答

12

我不确定我是否同意许多人不喜欢SPARQL的观点。 SPARQL 1.0 确实存在一些缺点,但它很好地解决了它所设计的问题,而新的版本 SPARQL 1.1 建立在此基础之上,并添加了许多从 SQL 中期望在原始规范中看到的结构,包括子查询、聚合和更新语义。 我认为它的标准化以及您可以预期在每个三元组存储中看到相同的解析和语义,而不是 SQL 的方言,这是一个不错的功能。

我还要声明所有的三元组存储都是图形数据库;您可以在 RDF 中将属性放在特定边缘上,虽然不能像 Neo4j 一样整洁美观。 但是,三元组存储具有真正的查询语言、w3c 标准数据表示,这使得将数据移动到另一个三元组存储变得轻松,并且对于许多三元组存储来说,可以根据 OWL 进行推理。

我不了解大多数图形数据库的可扩展性,但通常商业 RDF 数据库的可扩展性相当不错。 所有这些都可以扩展到数十亿个三元组,这处理了许多用例。 虽然它们如何处理比例有很大的差异,从供应商到供应商的缩放上限或下限、群集等都不同。 您还将看到与每个实现相匹配的相当不同的 mem 和硬件要求。 对于我来说,我倾向于只需获取 EC2 实例,通常是 2XL 或 4XL,挂载足以容纳数据的 EBS,然后就可以了。

此外,一些三元组存储集成了 Lucene 或类似技术,以提供数据上的反向索引,并且许多现在开始包括地理空间和时间索引。 这些非常有用的功能我不确定在类似 Neo4j 的东西中是否可用。

话虽如此,与关系型数据库相比,它们的可扩展性并不会那么好,因为它们还不够成熟。但当你拥有“真实”的数据量时,你也不会受到影响。当然,三元存储库的优势之一是推理,而在大规模情况下执行推理是棘手的,这正是各种OWL配置文件被创建的原因。但如果事先不考虑,你可能会陷入困境。

我认为图形数据库,特别是三元存储库,可以很好地配合正在构建的许多应用程序,但我不认为这意味着所有事情都应该使用它们来完成。就像其他任何工具一样,它们都有优点和缺点,所以您必须根据您的应用程序做出正确的选择。但它们现在可能总是值得考虑的。


11

对amk的回答进行了小修正:Tinkerpop还包含ArangoDB的适配器,请参见https://github.com/triAGENS/blueprints-arangodb-graph/wiki/Gremlin。因此,您可以在ArangoDB中使用Gremlin查询。

总的来说,像ArangoDB或OrientDB这样的多模型数据库允许您将文档数据库的所有良好特性(无模式、索引)与图结构结合使用。顶点或边缘就像文档数据库中的文档一样简单。您可以像喜欢的那样拥有许多属性甚至嵌入式文档。您可以在这些文档上定义哈希、范围、全文本或地理索引。或者,您可以忘记文档结构,并将文档视为顶点和边缘,使用Gremlin或某些遍历语言来研究底层图形。

至于“我们是否注定要使用多语言持久性”这个问题:独立于文档/图形数据库问题,我认为RDBMS还会再存在一段时间。因此,对于那个问题的答案是:“是的,很可能是这样”。


6

有一个临时的图形数据库标准 - Tinkerpop,包括Gremlin(命令式)查询语言,支持除ArangoDB之外的所有内容。

更进一步混淆问题,还有混合文档图形数据库OrientDB和ArangoDB。

在图形数据库中使用边缘存储子级关系与在文档数据库中作为嵌入对象存储的主要区别是前者可以便宜地将子级移动到另一个父级,并且不会出现在两个不同位置上。


2
如果您想进一步了解,Tinkerpop堆栈提供了对Sesame(openrdf.org)Sail API的支持,使您可以在三元存储上使用Gremlin。最后一次检查它并不是超级优化的集成 - 他们没有将gremlin编译到查询代数中 - 但这是一个很好的POC,用于使用Gremlin与RDF。 - Michael

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