图数据库Neo4j数据建模系列(二) — 数据建模准则

图数据库Neo4j数据建模系列(二) — 数据建模准则

如果您曾经使用过对象模型或实体关系图,则带标签的属性图模型看起来会很熟悉。
图数据建模是用户将任意域描述为节点的连接图以及与属性和标签的关系的过程。Neo4j图形数据模型旨在以Cypher查询返回子图,并通过为图数据库组织数据结构来解决业务和技术问题。

一、图数据模型=白板友好

图数据模型通常被称为“白板友好型”。通常,在设计传统的数据模型时,人们在白板上绘制示例数据,并将其与绘制的其他数据连接以显示不同项目之间的连接方式。然后,将白板模型重新格式化并进行结构化,以适合关系模型的标准化表格。
图据建模的过程与此类似。但是,图数据模型并不修改数据模型以适合规范化的表格结构,而是完全保留在白板上绘制的状态。这就是图数据模型因“对白板友好”而得名的原因。
让我们看一个例子来证明这一点。在下面的白板图中,我们有关于电影“黑客帝国”的数据集。

白板模型

接下来,我们对实体进行形式化并匹配关系类型的语法,以创建属性图模型的节点/关系视图。

属性图模型的节点和关系

下一步,我们添加标签并确定节点的属性以及属性图模型的关系。

添加标签和属性

最后,我们可以在Neo4j中查看此数据模型,并确保它与我们在白板上绘制的内容匹配。另外,请注意它与我们最初设计的白板模型几乎相同。

Neo4j存储的数据模型

轻松白板数据模型的功能使图数据模型非常简单和直观。无需草拟业务模型版本或向业务用户解释ERD术语。相反,任何人都可以轻松理解图数据模型。

二、场景描述


为了更好地理解并设计图数据模型,让我们以一少量数据为例,逐步介绍如何创建图数据模型的过程。首先考虑以下场景,该场景描述了示例数据实体和关系。


场景:
两个人:JohnSally,朋友关系,JohnSally已阅读:《图数据库》

通过将组件标识为标签、节点和关系,我们可以使用此语句中的信息来构建模型。让我们将场景分为几部分,并将其定义为属性图模型的一部分。

属性图元素

三、节点

从场景提取的第一个实体是节点。节点是形成图的两个基本单位之一(另一个基本单位是关系)。
节点通常用于表示实体,但也可以表示其他组件,具体取决于实例。节点可以包含name-value数据的属性,可以使用一个或多个标签为节点分配角色或类型。

通常可以通过识别场景中的名词来找到图模型的节点。可以将诸如汽车、个人、客户、公司、资产等实体定义为节点。

我们可以将节点标识为具有唯一概念标识的实体。在我们的场景中,我们从Sally和John开始,以下这些实体以粗体显示。

场景–定义节点:
两个人:JohnSally,朋友关系,JohnSally 都已阅读:《图数据库》

提取节点:
* John
* Sally
* 《图数据库》

请记住,图数据库将实体的每个实例作为一个单独的节点(即使JohnSally都是people,他们都是两个单独的节点),而《图数据库》则与另一本书是单独的节点。
图模型–节点

四、标签

现在我们有了节点的概念,我们可以决定使用什么标签(如果有)来分配节点以对其进行分组或分类。Neo4j开发人员手册中以下段落中的定义更好地说明了标签的作用以及在图数据模型中如何使用标签。
标签是一种命名的图构造,用于将节点分组,标有相同标签的所有节点都属于同一集合。许多数据库查询可以使用这些集合而不是整个图,从而使查询更易于编写和提高效率。节点可以用任意数量的标签标记,包括无标签,从而使标签成为图的可选项。

类似于我们通过识别场景中的名词为图模型找到节点的方式,您可以通过通用名词或人员、地点或事物的组来识别标签。适合车辆、人员、客户、公司、资产和类似术语等项目组的通用名词可以用作图标签。

为了确定我们是否可以在场景中对Sally和John对象进行分组,我们将首先确定语句中提到的节点(John、Sally、《图数据库》)的角色。我们可以在语句中找到两种不同类型的对象,下面将重点介绍。

场景–定义标签:
两个人:JohnSally,朋友关系,JohnSally 都已阅读:《图数据库》


提取标签:
* 人
* 书
现在我们已经标识了节点和标签,我们可以更新图数据模型以将标签分配给它们描述的节点。对于JohnSally,我们使用 Person 标签。对于《图数据库》,我们使用 Book 标签

图模型–标签

五、关系

现在,我们有了主要实体以及对它们进行分组的方法,但是我们仍然缺少图数据库模型的重要组成部分-数据之间的关系!
关系将两个节点连接起来,使我们能够找到数据的相关节点。它具有显示箭头方向的源节点和目标节点。尽管必须在特定方向上存储关系,但是Neo4j在任一方向上都具有相同的遍历性能,因此您可以在不指定方向的情况下查询该关系。
图数据库中的一个核心,必须遵循的规则是“没有断开的连接”,从而确保现有关系永远不会指向不存在的节点。由于关系始终具有开始和结束节点,因此删除节点前必须先删除其关联的关系。

正如我们通过查找名词找到节点和标签一样,您通常可以通过识别场景中的动作或动词来找到图模型的关系。诸如DRIVES、HAS_READ、MANAGES、ACTED_IN之类的动作以及其他类似的动作,可以定义为节点之间存在的不同类型的关系。

让我们确定John、Sally《图数据库》节点间的关联(在下面的场景中用下划线表示)。

场景–定义关系:
两个人:JohnSally,朋友关系,JohnSally 都已阅读:《图数据库》


提取节点间的关系:
*John是Sally的朋友
*Sally是John的朋友
*John 阅读《图数据库》
*Sally阅读《图数据库》
我们发现,John和Sally节点(标记为Person)可以通过具有关系的好友相互连接。John和Sally都已经阅读了《图数据库》书籍,因此我们可以将它们的每个节点(每个标记为Person)连接到《图数据库》节点(标记为Book)并具有已读关系。

图模型–关系

六、属性

我们已经完成了创建人与书间关系的基本图数据模型的过程。通过将这些实体的属性定义为键值属性,我们可以进一步更新数据模型。
属性是可以存储在节点或关系上的名称/值数据对。支持大多数标准数据类型,完整列表可查看《 Neo4j 开发人员手册》
属性使您可以存储有关节点或与其描述的实体之间的关系的相关数据,通常可以通过了解用例需要对数据提出哪些问题来提取它们。
对于John和Sally场景,我们可以列出以下有关数据的问题。

有关John和Sally数据模型的问题:

  • John和Sally何时成为朋友?或者他们成为朋友多久了?
  • 《图数据库》的平均评分是多少?
  • 谁是《图数据库》的作者?
  • Sally 年龄?
  • John 年龄?
  • Sally 和 John,谁大一点?
  • Sally 或 John,谁先阅读《图数据库》?


依据上面的问题列表,为了回答这些问题,我们可以确定存储在数据模型中的实体上的属性。

图模型–属性

使用最终模型,我们现在可以回答我们在列表中定义的每个问题。当然,我们可以随时间和场景变化,不断更改模型,并添加/删除关系、节点、属性和标签。属性图数据模型的灵活性和简单性使用户可以轻松地查看数据结构并根据业务变化的需求对其进行更新。

七、图数据建模设计

本文通过简单明了的场景介绍数据建模的过程,本系列后续文章中,我们有很多机会一起探讨并练习,对不同业务场景建模并分析模型迭代。
没有“一刀切”的数据建模方法,也没有统一的数据建模标准,每个数据模型都是唯一的,具体取决于业务场景和需要对数据回答的问题类型。因此,建模最佳实践将提供更有价值的结果,以建立最适合您的流程和场景的数据模型。


图数据库Neo4j数据建模系列:

图数据库Neo4j数据建模系列(一) — 数据建模基础
图数据库Neo4j数据建模系列(二) — 数据建模准则
图数据库Neo4j数据建模系列(三) — 关系与图模型的转变
图数据库Neo4j数据建模系列(四) — 图数据建模
图数据库Neo4j数据建模系列(五) — 建模技巧及模型重构

至此,数据建模的相关概念及技巧就介绍完了,后续将基于一些实际的业务场景共同探讨图数据建模,敬请期待。

近期也在尝试 OrientDB 数据迁移到Neo4j,有时间的话,我也会更新一些迁移细节。

编辑于 05-29

文章被以下专栏收录