【问题标题】:Neo4j and ORM (Hibernate)Neo4j 和 ORM(休眠)
【发布时间】:2012-03-01 01:30:15
【问题描述】:

我从大学开始就一直在使用 RDBMS,并且确实在努力了解 NoSQL 数据库的基本概念......但我认为他们的概念真的很酷。

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

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

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

在仔细阅读该网站和 PDF 之后,似乎 Neo4j 不仅是一个数据库,而且它还提供了一个 Java API,从根本上取代了对传统 ORM 工具(如 Hibernate)的需求。

所以,我的最后一个问题实际上是要求澄清/确认最后一个断言,具体来说:

  • 如果我的后端完全基于 Neo4j,我就不需要 Hibernate(这是我常用的 ORM),这是真的吗?这两个 API 是互斥的,还是在使用这两个 API 之间有什么好处?

提前致谢!

【问题讨论】:

  • 在任何答案中都没有解决的小更正:NoSQL 并不意味着数据库不是关系型的。大多数图数据库都被认为是 NoSQL,但关系是图数据库中的一个基本概念。

标签: java hibernate orm nosql neo4j


【解决方案1】:

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

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

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

编辑:

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

【讨论】:

  • Hibernate OGM 可以使用 NoSQL 数据库。
  • 对,现在还专门支持 Neo4J:in.relation.to/Bloggers/…(尽管它仍处于试验阶段)
【解决方案2】:

正如@assylias 所说,您不能将 Hibernate 用作像 Neo4J 这样的 Graph DB 的 ORM,但还有其他解决方案。

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

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

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

【讨论】:

  • +1 用于蓝图和框架。 Frames 可能是您会发现的类似 ORM 的休眠模式的接近点。但是,与所有 ORM 一样,您会在使用 Frames 的性能方面受到打击。
【解决方案3】:

我会看一下http://www.springsource.org/spring-data/neo4j,而不是Hibernate,它是注解驱动的,受Spring 支持并且运行良好。这可以用吗?

【讨论】:

    【解决方案4】:

    我从大学开始就一直在使用 RDBMS,并且对 NoSQL 数据库的基本概念感到非常困惑……但我认为它们的概念真的很酷。

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

    要查看这些概念的实际应用,我推荐Getting Started Guide for Gremlin。 Gremlin 是一种特定于领域的语言,用于遍历与 Neo4j 和其他几个图形数据库一起使用的图形。 Gremlin 对于图形数据库就像 SQL 对于关系数据库一样。

    在您学习图表时,我强烈推荐 Gremlin。只需几分钟,您就可以开始学习 Gremlin 教程。 Gremlin 将为您提供一个 REPL,让您可以尝试小图并获得即时反馈。即使您没有在生产系统中使用 Gremlin,在 REPL 中获得的知识也将帮助您验证您的设计,并且可以作为更严格的单元测试和开发的先驱。

    如果您更喜欢直接使用 Neo4j 的 API,他们的 traversal framework tutorial 应该会有所帮助。

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

    由于您是 Neo4j 的新手,我建议您避免使用 ORM,直到您首先了解 ORM 需要为您做什么。看看将查询结果映射到您的域时您真的会经历多少痛苦。如果 ORM 可以缓解这种痛苦,那么 Peter 提到的 Spring-Data 框架可能会很有用。

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

    【讨论】:

      【解决方案5】:

      从版本 4 beta 开始,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 project 具有更好的集成性。

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-07-06
          • 2019-11-11
          • 1970-01-01
          • 2017-04-06
          • 2011-05-01
          • 2012-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多