【问题标题】:Persisting data to neo4j stand alone server将数据持久化到 neo4j 独立服务器
【发布时间】:2014-05-02 18:06:20
【问题描述】:

我目前正在进行一些关于将一些业务功能从 Oracle RDBMS 迁移到 Neo4j 的研发工作,以降低应用程序查询中的连接复杂性。由于数据的维护和可见性要求,我认为独立服务器是最佳选择。

我的想法是,在 java 程序中,我会从 Oracle 表中提取相关数据,将其映射到节点对象并将其持久化到 neo4j(在此过程中创建适当的关系)。

我很好奇,SDN over REST 不是最佳解决方案,有哪些选项可用于持久性。服务器插件或非托管扩展是否是首选方法,或者我是否使问题过于复杂,因为这种问题往往会不时发生。

谢谢!

【问题讨论】:

  • 现在我会选择 JDBC 驱动程序或用 SDN 编写的服务器扩展(如果您想使用对象图映射)。这一切都取决于你想要解决的用例。

标签: neo4j


【解决方案1】:

REST 指的是一种通过网络查询数据的方法,而不是一种存储数据的方法。通常,您会将数据存储在某台机器上;然后,您可以选择使用 neo4j 服务器通过 RESTful 服务访问它,或者仅使用 java 应用程序访问数据。

我假设 SDN 你指的是spring data neo4j。 Spring 是一个用于 java 应用程序的框架,如果你愿意的话,SDN 指的是一个插件,它允许 java 程序员在 neo4j 中存储模型。确实可以使用 spring-data-neo4j 读取数据,然后将其存储在 Neo4J 中——但这也是数据如何进入 neo4j 的一种方法,它本身并不是存储。

在大多数情况下,存储模型几乎总是相同的。 This link 描述了存储实际发生方式的各个方面。

现在 - 实现您更大的业务目标。为了使用 neo4j 做到这一点,您需要查看您的 oracle 数据并决定如何最好地将其建模为图形。 oracle RDBMS 和 Neo4J 在数据表示方式方面存在很大差异。一旦您确定了图形设计,您就可以将数据加载到 neo4j 中(可以使用许多不同的选项)。

所有这些“降低应用程序查询中的连接复杂性”吗?嗯,是的,从某种意义上说 Neo4j 不做连接。它会提高应用程序的速度/性能吗?只是没有办法说。答案取决于您的应用是什么、查询是什么、如何将数据建模为图表以及如何在该图表上表达结果查询。

【讨论】:

  • 我想我的印象是,如果我使用 spring data neo4j 和独立服务器,创建节点/关系查询将使用某种形式的 spring neo4j rest 在服务器上运行语句。由于这会对性能产生影响,因此我想尝试避免这种情况。我正在考虑使用事务性 http 端点或可能的 jdbc 驱动程序,但我不熟悉每种方法的优缺点。
  • 就业务目标和降低连接复杂性以提高性能而言,这是研发目标的一部分。我正在考虑推入 neo4j 的应用程序部分是我们的产品树,它主要基于关系进行查询,这似乎很合适,因为我们经常从一个类别开始并钻取产品属性以查找项目或符合规定条件的物品。这是多语言持久性模型的开始和关键部分,我想说服老板会比 RDBMS 更好地满足业务需求。
  • 我认为您在这里组合/混淆了几个不同的主题。我不知道存在像“spring neo4j rest”这样的东西。 Spring neo4j 是一组 spring 模型和 neo4j 对象之间的映射。 REST 是一种访问方法。是的,通过 REST 进行查询会对性能产生影响(通常速度较慢),所以不要这样做。如果您使用的是 spring data neo4j,则不会使用 REST。我认为您的意思也是“嵌入式”neo4j,而不是“独立”。
  • 至于使用HTTP而不是JDBC作为访问方法,那么JDBC会更快,但是您必须开发Java代码才能使用它。 HTTP 会更慢,但更通用;您将能够使用非 Java 软件与其交谈/查询,有时您将能够使用常规客户端(如浏览器)而不是自定义代码。
  • 对不起,我真的很困惑。由于原型的功能要求,就我的研究可以确定的而言,嵌入式 neo4j 不是一个可行的选择。我相信从进一步的研究来看,spring-data-neo4j 只能访问嵌入式 neo4j 数据库,因此我可以使用 spring-data-neo4j-rest 来访问远程 neo4j 服务器,但由于网络上的闲聊,这不是最佳方法。对于查询,我可以使用非托管扩展来减少网络流量,但我有哪些选项可以创建/更新节点和关系?