【问题标题】:Transforming relational data bases to graph databases将关系数据库转换为图形数据库
【发布时间】:2014-12-10 14:56:40
【问题描述】:

作为我的期末论文的一部分,我必须将关系数据库转换为面向图形的数据库,特别是 PostgreSQL 数据库到 Neo4j 嵌入式数据库。现在,方法是问题。在 Rik Van Bruggen 的书:Learning Neo4j 中,他提到了使用带有 Trascend 和 MuleSoft 工具的 ETL 活动的数据导入过程,但在他们的官方网站上,没有关于如何做到这一点的文档,既没有帮助文档也没有示例。除了这些工具,我还可以使用哪些其他方法来转换这些信息而不使用我自己的代码?

【问题讨论】:

标签: postgresql graph neo4j etl


【解决方案1】:

一些建模建议:

一个良好规范化的关系模型,由于性能原因尚未非规范化,可以转换为等效的图模型。 图模型形状主要由用例驱动,因此之后会有优化和模型演化的机会。

一个好的、规范化的实体关系图通常已经代表了一个体面的图模型。 因此,如果您仍有可用的原始 ER 图,请尝试将其用作指南。

这里有一些提示可以帮助您进行转型:

  • 每个实体表都由节点上的标签表示
  • 表中的每一行都是一个节点
  • 这些表上的列成为节点属性。
  • 移除技术主键,保留业务主键
  • 为业务主键添加唯一约束,为频繁查找属性添加索引
  • 用与另一个表的关系替换外键,然后将其删除
  • 使用默认值删除数据,无需存储这些数据
  • 可能必须将表中非规范化和重复的数据提取到单独的节点中以获得更清晰的模型。
  • 索引列名称,可能表示数组属性(如 email1、email2、email3)
  • JOIN 表转换为关系,这些表上的列成为关系属性

在开始导入数据之前了解图模型很重要,然后它就变成了对该模型进行水合的任务。

【讨论】:

  • 迈克尔,再次感谢。我接受了你的建议。作为我的问题的解决方案,我创建了一个 ETL 流程,将所需数据从关系模型转换为面向图数据库。这项任务很困难,当数据没有按预期分布时也是如此。在我的数据库源中,表不代表实体,所有必需的概念(节点和关系)都是无组织的,因此这会使转换过程复杂化。
【解决方案2】:

LOAD CSV 可能是您最好的选择,但当然这意味着首先输出 CSV。这里有一些很棒的资源:

http://neo4j.com/docs/stable/query-load-csv.html

http://watch.neo4j.org/video/112447027

http://jexp.de/blog/2014/06/load-csv-into-neo4j-quickly-and-successfully/

http://jexp.de/blog/2014/10/load-cvs-with-success/

http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/

我还编写了一个 ruby​​ gem,它可以让您编写一些 ruby​​ 代码来从各种来源导入数据。它被称为neo4apis。您可以查看 neo4apis-twitter gem 以了解其工作原理:

https://github.com/neo4jrb/neo4apis-twitter/

https://github.com/neo4jrb/neo4apis-twitter/blob/master/lib/neo4apis/twitter.rb

我实际上一直想实现一个 neo4apis-activerecord,以便使用 ActiveRecord 从 SQL 中轻松导入

【讨论】:

  • 好吧,我试过这样做,但是源数据集不在同一个表中,它们在数据库的许多表中是无序的。真的,我已经用 LOAD CSV 试过了。感谢您的回答,真是出乎意料(我在这个网站的第一个问题)在过去的时间里,我找到了一个解决方案:在java应用程序中创建一个ETL进程,它使用postgres驱动程序和neo4j嵌入式库,完全可以工作!跨度>
【解决方案3】:

您不能直接从关系中导出数据并导入到 neo4j。

因为这是两种不同的数据库结构。

关系数据库 -
关系数据库是一组包含适合预定义类别的数据的表。每个表(有时称为关系)在列中包含一个或多个数据类别。每行包含由列定义的类别的唯一数据实例。

面向图的数据库 -

图数据库本质上是节点和边的集合。每个节点代表一个实体(例如人或企业),每条边代表两个节点之间的连接或关系。

解决您的问题-

首先,您需要设计 Neo4j 的数据结构。例如,您需要什么节点,节点之间的关系是什么。

之后,您在应用程序语言中创建脚本以从关系数据库中获取数据并将其插入 neo4j。

Load CSA 是使用图形数据库导入/导出(备份)功能的一个选项。您不能直接将数据从 Relational DB 导出/导入到 Graph DB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多