基于图的数据库( http://neo4j.org/)和面向对象的数据库(http://www.db4o.com/ )有什么区别?
6 回答
我会以不同的方式回答这个问题:对象和图形数据库在两个不同的抽象级别上运行。
对象数据库的主要数据元素是对象,我们从面向对象的编程语言中了解它们的方式。
图数据库的主要数据元素是节点和边。
对象数据库没有具有自动参照完整性等的两个事物之间的(双向)边的概念。图形数据库没有可以为 NULL 的指针的概念。(当然可以想象混合动力车。)
就模式而言,对象数据库的模式是应用程序中的任何类集。图形数据库的模式(无论是隐式的,按照字符串标签含义的约定,还是显式的,通过声明为模型,例如我们在InfoGrid中所做的那样)独立于应用程序。这使得使用图形数据库而不是对象数据库针对相同数据编写多个应用程序变得更加简单,因为模式是独立于应用程序的。另一方面,使用图形数据库您不能简单地获取任意对象并将其持久化。
我认为针对不同工作的不同工具。
是的,API 似乎是主要区别,但实际上并不是表面上的区别。从概念上讲,一组对象将形成一个图,您可以想到一个以统一方式处理该图的 API。相反,理论上您可以挖掘模式的通用图结构并将它们映射到通过某些 API 公开的对象。但是实际产品的 API 的设计通常会对数据的实际存储方式和查询方式产生影响,因此创建一个包装器并使其看起来像其他东西绝非易事。此外,面向对象的数据库必须提供一些完整性保证和图形数据库通常不会提供的类型结构。事实上,严肃的 OO 数据库远非“自由形式”:)
看看 [HyperGraphDB][1] - 它既是一个完整的面向对象的数据库(如 db4o),又是一个在表示和查询能力方面非常先进的图形数据库。它能够存储广义超图(其中边可以指向多个节点,也可以指向其他边),它具有嵌入为图形等的完全可扩展的类型系统。
与其他图形数据库不同,在 HyperGraphDB 中,每个对象都成为图形中的一个节点或一条边,没有最小限度的 API 入侵,您可以选择将对象表示为图形或以与图形正交的方式处理它们图结构(作为节点或边的“有效负载”值)。您可以进行复杂的遍历、自定义索引和查询。
关于为什么 HyperGraphDB 实际上是 ODMS 的解释,请参阅博文 Is HyperGraphDB an OO Database? 在 Kobrix 的网站上。
正如 Will 从另一个角度描述的那样,graphdb 将使您的数据与您的应用程序类和对象分开。显然,graphdb 还具有更多内置功能来处理图形 - 例如最短路径或深度遍历。
另一个重要的区别是,在像 neo4j 这样的 graphdb 中,您可以根据关系(边)类型和方向遍历图,而无需加载完整节点(包括节点属性/属性)。还可以选择使用 neo4j 作为对象 db 的后端,仍然可以使用所有图形内容,请参阅:jo4neo这个项目有一种不同的方法,也可以算作 neo4j 之上的对象 db:neo4j.rb。一个新选项是使用Spring Data Graph,它通过注释为 graphdb 提供支持。
在这篇博文的评论中也提出了同样的问题。
从他们两个网站的快速浏览中:
主要区别在于 API 的结构方式,而不是您可以使用它们构建的自由格式数据库。
db4o 使用对象映射——您创建一个 Java/C# 类,它使用反射将其持久保存在数据库中。
neo4j 有一个显式的操作 API。
在我看来,Neo4j 似乎更适合与之交互。
您也可以考虑使用键值存储——您可以使用其中一个创建完全相同的自由格式数据库。
低级的差别不是很大。两者都将关系管理为直接链接,无需昂贵的连接。此外,两者都可以使用 Query 语言遍历关系,但图形数据库具有在第 N 级递归执行的运算符。
但最大的区别在于领域:在 Graph 数据库中,所有都基于 2 种类型:顶点和边,即使通常您可以将自己的类型定义为顶点或边的一种子类型。
在 ODBMS 中,您没有顶点和边的概念,除非您自己编写。
使用图数据库,您有一点机会认为它是基于数学图论的。使用面向对象的数据库,您可以确定它根本不基于任何东西(当然也完全没有数学理论)。