将关系型数据库转换为图形数据库

3
作为我的毕业论文的一部分,我必须将一个关系型数据库转换成面向图的数据库,具体来说是将PostgreSQL数据库转换成Neo4j嵌入式数据库。现在问题是如何实现这个转换。在Rik Van Bruggen的书《学习Neo4j》中,他提到了使用Trascend和MuleSoft工具进行ETL活动的数据导入过程,但在官方网站上,没有关于如何实现的文档,也没有帮助文档或示例。除了这些工具,我还有什么其他方法可以在不使用自己的代码的情况下转换这些信息?

1
CSV导入?你看过这个吗?http://neo4j.com/developer/guide-importing-data-and-etl/ - MarcoL
https://github.com/nuko-yokohama/neo4j_fdw - Denis de Bernardy
1
你是在询问如何将关系型数据转换为图形数据吗?还是在询问如何将关系型模型转换为图形模型? - FrobberOfBits
你实际上有检查过他的网站吗:http://blog.bruggen.com,他有两个例子。还要看一下musicbrainz博客文章http://neo4j.com/blog/musicbrainz-in-neo4j-part-1/。 - Michael Hunger
3个回答

4

一些建模建议:

一个规范化的关系模型,由于性能原因尚未去规范化,可以转换为等效的图形模型。图形模型的形状大多受用例驱动,因此后期将有机会进行优化和模型演进。

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

以下是一些转换提示:

  • 每个实体表都由节点上的标签表示
  • 表中的每一行都是一个节点
  • 这些表上的列变成节点属性。
  • 删除技术主键,保留业务主键
  • 为业务主键添加唯一约束条件,为频繁查找属性添加索引
  • 将外键替换为与其他表的关系,之后删除它们
  • 删除具有默认值的数据,无需存储这些数据
  • 在表中的数据被去规范化和复制时,可能需要将其拉出到单独的节点中,以获得更清晰的模型。
  • 索引列名称,可能表示数组属性(如email1、email2、email3)
  • JOIN表被转换成关系,这些表上的列变成了关系属性

在开始导入数据之前了解图形模型非常重要,然后只需要填充该模型即可。


迈克尔,再次感谢。我采纳了你的建议。作为解决我的问题的方案,我创建了一个ETL过程,将所需数据从关系模型转换成有向图数据库。任务很困难,尤其是当数据不如预期地分布时。在我的数据库源中,一个表并不能代表一个实体,所有所需概念(节点和关系)都是无组织的,这使得转换过程更加复杂。 - Rigoberto Peña

4
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,可以从各种来源导入数据。 它叫做neo4apis。 您可以查看neo4apis-twitter gem以了解其工作原理:https://github.com/neo4jrb/neo4apis-twitter/https://github.com/neo4jrb/neo4apis-twitter/blob/master/lib/neo4apis/twitter.rb。 我实际上一直想实现一个 neo4apis-activerecord,以便轻松从SQL中导入数据。

嗯,我尝试过这个,但源数据集并不在同一个表中,它们分散在数据库的许多表中。实际上,我已经尝试了所有的LOAD CSV方法。感谢答案,真出乎意料(这是我在这个网站上的第一个问题)。最近我找到了一个解决方案:创建一个ETL过程在Java应用程序中,使用PostgreSQL驱动程序和Neo4j嵌入式库,完美运行! - Rigoberto Peña

1
您无法直接从关系型数据库中导出数据并导入到Neo4j中,因为这两种数据库结构不同。关系型数据库是一组包含在预定义类别中的数据表。每个表(有时称为关系)包含一个或多个列中的数据类别。每行包含由列定义的类别的唯一数据实例。
图形数据库本质上是节点和边的集合。每个节点表示一个实体(例如人或企业),每个边表示两个节点之间的连接或关系。
解决方案:首先,您需要设计Neo4j数据结构。例如,您需要哪些节点,节点之间的关系是什么。然后,在应用程序语言中创建脚本以从关系型数据库中提取数据并将其插入到Neo4j中。
“Load CSA”是带有图形数据库的导入/导出(备份)功能选项。您无法直接从关系型数据库导出/导入数据到图形数据库中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接