Neo4j and ORM (Hibernate)



我从大学起就一直在使用RDBMS,在NoSQL数据库的底层概念上真的很吃力。。。但我认为他们的概念真的很酷。

相信我理解以下内容(如果我错了,请纠正我,因为这些内容影响了我的问题!):

  • NoSQL不是某种形式的规范;它是一个新的数据库"品种"的概念,这些数据库不是关系数据库,也不使用SQL
  • 因此,每个NoSQL系统都是不同的(例如,MongoDB是以JSON为中心的)

如果这些都是真的,那么让我们将注意力转向Neo4j,一个"基于图形"的数据库。

仔细阅读网站和PDF后,Neo4j似乎不仅仅是一个数据库,它还提供了一个Java API,基本上取代了对Hibernate等传统ORM工具的需求。

因此,我的最后一个问题实际上是要求澄清/确认最后一个断言,特别是:

  • 如果我的后端完全基于Neo4j,那么我真的不需要Hibernate(这是我常用的ORM)吗?这两个API是相互排斥的,还是同时使用它们有某种好处

提前感谢!

我从大学起就一直在使用RDBMS,我真的很难理解NoSQL数据库的基本概念。。。但我认为他们的概念真的很酷。

像Neo4j这样的图数据库用连接到具有边的其他顶点的顶点来表示域。边包含其起点和终点顶点。每个顶点和边都可以有一个属性映射,即可用于存储有关顶点和边的附加信息的键值对。当然,你可以用自己的域来扩展它,但事情一开始很简单。

要了解这些概念的实际应用,我推荐《Gremlin入门指南》。Gremlin是一种用于遍历图的特定领域语言,可与Neo4j和其他几个图数据库一起使用。Gremlin对于图形数据库的意义,正如SQL对于关系数据库的意义一样。

当你学习图形时,我再怎么强烈地推荐Gremlin也不为过。只需几分钟,您就可以启动并运行Gremlin教程。Gremlin将为您提供一个REPL,让您尝试使用小图形并立即获得反馈。即使您在生产系统中不使用Gremlin,在REPL中获得的知识也将帮助您验证设计,并可以作为更严格的单元测试和开发的先驱。

如果您更喜欢直接使用Neo4j的API,他们的遍历框架教程应该会有所帮助。

如果我的后端完全基于Neo4j,那么我真的不需要Hibernate(这是我常用的ORM)吗?

由于您是Neo4j的新手,我建议您在第一次了解ORM需要为您做什么之前避免使用ORM。看看将查询结果映射到域会有多痛苦。如果ORM可以减轻痛苦,那么Peter提到的Spring Data框架可能会很有用。

你很可能会没事的。我参与过几个项目,ORM带来的意外复杂性远远超过了好处。将查询结果映射到域决不是系统中最复杂的部分。

我将看看http://www.springsource.org/spring-data/neo4j它是注释驱动的,由Spring支持,工作得很好。这会是一个有用的东西吗?

AFAIK,Hibernate是一个只支持类似SQL的数据库的对象/关系映射框架。因此,如果您使用Neo4j,您将不需要/无法使用它,而是使用Neo4j的API。

但没有什么能阻止您同时使用Neo4j和SQL数据库,因此混合了Hibernate和neo4jneneneba API(最有可能在项目中存储/查询不同的对象)。

你有没有检查过Neo4j网站上给出的基本例子,比如http://docs.neo4j.org/chunked/snapshot/tutorials-java-embedded-hello-world.html?

编辑:

你是对的,NoSql并没有定义一个特定的标准。你可能想看看这个(简短的)介绍:http://martinfowler.com/articles/nosql-intro.pdf

从版本4测试版开始,Hibernate OGM增加了对Neo4j:的支持

Hibernate OGM现在可以使用Neo4j,一个完全事务性的属性图形数据库。

图形数据库将数据表示为互连节点的系统当您需要存储诸如例如,社交网络中人与人之间的关系。在里面此外,在属性图中,还可以将属性添加到图中的元素。

Hibernate OGM将实体映射为节点实体成为节点的属性。现在我们添加一些用于将节点转换为实体的附加属性但我们计划使用中添加的标签机制来替换它们最新的Neo4j版本。

两个节点之间的关系表示两个实体。目前,双向关联需要两个关系,但我们将改变这一点,因为Neo4j可以导航双向关系。

与Neo4j的集成是实验性的,但我们正在计划很快就会改进。请告诉我们您的想法或帮助我们

http://planet.jboss.org/post/hibernate_ogm_4_0_0_beta4_is_out

现在还为时过早,随着时间的推移,最初的支持可能会有所改善。我正在尝试设置和试用它。我知道还有一个Spring项目有更好的集成。

正如@assilias所说,对于Neo4J这样的Graph DB,您将无法使用Hibernate作为ORM,但还有其他解决方案。

首先,您可以使用Neo4J api遍历图形并检索顶点和边,请考虑它不是ORM,因此它不会像Hibernate那样将检索到的顶点和/或边映射到自定义实体。

这可能是一个解决方案,但你最终会得到专门为Neo4J编写的代码,这些代码有自己的api,与其他图形数据库(例如OrientDB)不同。在开发过程中,你可能需要一种更灵活的方式来检索数据并将结果映射到你的对象,所以我建议你看看Tinkerpop堆栈(http://tinkerpop.com/)这基本上是一系列使用图形数据库的javaapi和抽象层。

开始查看蓝图(http://blueprints.tinkerpop.com)这是图形数据库的主要概念之上的抽象层,因此您可以编写不依赖于特定数据库供应商的代码,然后查看Frames(http://frames.tinkerpop.com/)一个类似ORM的框架,用于将对象映射到顶点和边,以及Gremlin(http://gremlin.tinkerpop.com/)一种可以轻松查询图形的语言。

您是否考虑过使用Ferma?这是一个特定于图形数据库的ORM。它支持包括Neo4J在内的所有主要品牌。以下是该项目的说明。

Ferma是一个强大的框架,其作用类似于用于传统数据库的对象关系模型(ORM)库。费尔马通常被称为对象图模型(OGM)库,并映射Java对象指向图中的元素,如"顶点"或"边"。在里面简而言之,它允许使用java接口和类,为与底层图形。

最新更新