教程:将关系数据导入Neo4j(未完待续)

译者声明

你好! 本中文版指南仅供学习交流使用而翻译,转载请注明出处,所有权利归原作者。 译者才疏学浅,还在学习中,欢迎捉虫指正和讨论!
这篇中文指南基于https://neo4j.com/developer/guide-importing-data-and-etl/文档翻译。

目标

本指南将向您介绍从关系数据库(PostgreSQL)导出数据并导入图形数据库(Neo4j)的过程。您将了解如何通过转换模式和使用导入工具从关系系统获取数据并将数据转换为图形。本例使用特定的数据集,但是本指南中的原则可以应用于任何数据域并对其进行重用。

先决条件

您应该对属性图模型有基本的了解,并知道如何将数据建模为图。如果您还没有安装,请下载并安装Neo4j Desktop,这样您就可以按照示例来操作了。

关于数据域(Data Domain)

在本指南中,我们将使用NorthWind数据集,这是一个经常使用的SQL数据集。该数据描述了一个产品销售系统——存储和跟踪客户、产品、客户订单、仓库库存、运输、供应商、甚至员工和他们的销售区域。虽然NorthWind数据集通常用于演示SQL和关系数据库,但是数据也可以被构造成图。
NorthWind数据集的实体关系图(ERD)如下所示。
教程:将关系数据导入Neo4j(未完待续)
首先,这是一个相当大且详细的模型。对于我们的示例,我们可以将其缩小一点,并选择对我们的图最关键的实体——换句话说,就是那些可能从查看连接中获益最多的实体。对于我们的用例,我们确实想要优化与订单的关系——所涉及的产品(与那些产品的类别和供应商)、处理这些产品的员工和那些员工的经理。
使用这些业务需求,我们可以将模型缩小到这些基本实体。
教程:将关系数据导入Neo4j(未完待续)

开发图形模型

要将数据从关系数据库转换成图,我们需要做的第一件事是将关系数据模型转换为图数据模型。决定如何将表和行作为节点和关系进行组织可能会根据您的业务需求的最重要部分而有所不同。
有关使图形模型适应不同场景的更多信息,请参阅我们的建模设计指南。
在从关系模型派生图形模型时,我们应该记住一些通用的指导原则。

  1. 行是节点
  2. 表名是标签名
  3. 连接或外键是关系

有了这些原则,我们可以通过以下步骤将关系模型映射到图:

行到节点,表名到标签

  1. Orders表上的每一行都成为以Order为标签的图中的一个节点。 Products表上的每一行都成为一个节点,Product作为标签。
  2. 供应者表上的每一行都成为一个节点,供应者作为标签。 Categories表上的每一行都成为一个节点,其中Category作为标签。
  3. Employee表上的每一行都成为一个节点,其中Employee作为标签。

连接关系

  1. 供应商和产品之间的连接成为一个名为SUPPLIES(其中供应商供应产品)的关系。
  2. 产品和类别之间的联接成为名为PART_OF的关系(其中产品是类别的一部分)。
  3. 雇员和订单之间的连接成为一个名为SOLD(其中雇员出售了一个订单)的关系。
  4. 雇员和自身之间的联接(一元关系)成为一个名为REPORTS_TO的关系(其中雇员有一个经理)。
  5. 在订单和产品之间使用连接表(订单详细信息)进行连接将成为一个名为CONTAINS的关系,其中包含单价、数量和折扣(其中订单包含产品)的属性。

如果我们在白板上画出我们的翻译,我们有这个图形数据模型。
教程:将关系数据导入Neo4j(未完待续)

当然,现在我们可以决定要包含关系模型中的其余实体,但是现在,我们将保留这个较小的图模型。

图数据模型与关系数据模型有何不同?

  • 没有空值。不存在的值条目(属性)不存在。
  • 它更详细地描述了这些关系。例如,我们知道一个雇员销售了一个订单,而不是在订单和雇员表之间有一个外键关系。如果愿意,我们还可以选择添加更多关于这种关系的元数据。
  • 两种模型都可以更加规范化。例如,地址在几个表中被反规范化了,但是可以在一个单独的表中。在我们的图模型的未来版本中,我们可能还会选择将地址与订单(或供应商或员工)实体分离,并创建单独的地址节点。

将关系表导出到CSV

值得庆幸的是,我们已经利用北风数据完成了这一步。但是,如果使用另一个数据域,则需要从关系表中获取数据,并将其以另一种格式加载到图中。许多系统可以处理逗号分隔值(CSV)的平面文件的通用格式,因此让我们看看如何将关系表从PostgreSQL数据库导出到CSV文件,以便创建图表。
PostgreSQL ’ copy '命令允许我们执行SQL查询并将结果写入CSV文件。我们可以组装这些复制命令的简短.sql脚本,如下所示。
教程:将关系数据导入Neo4j(未完待续)
(未完待续)