在本模块中,您将了解如下内容:
- 什么是图形数据建模。
- 领域知识对建模的重要性。
- 图形数据模型和实例模型之间的区别。
一、什么是图形数据建模?
为什么要进行图形建模?
如果您要使用Neo4j图数据库来开发部分或整个应用程序,则必须与您的开发合作商协作设计一个图形,该图形将:
- 指出应用程序的关键用例问题。
- 为这些关键用例提供最佳的Cypher查询性能。
Neo4j图组件
用于定义图形数据模型的Neo4j组件包括:
- 节点(Node)
- 标签(Label)
- 关系(Relationship)
- 属性(Property)
数据建模过程
以下是创建图形数据模型的步骤:
- 了解域模型并定义应用程序的特定用例(问题)。
- 开发初始图数据模型:
- 对节点(实体)建模。
- 为节点之间的关系建模。
- 根据初始数据模型测试用例。
- 使用Cypher创建带有测试数据的图(实例模型)。
- 测试用例,包括图的性能。
- 根据关键用例的变化或性能等原因,重构(改进)图数据模型。
- 在图上实现重构,并使用Cypher重新测试。
图数据建模是一个迭代过程。您的初始图数据模型是一个起点,但随着您对用例的了解越来越多,或者如果用例发生更改,初始图数据模型也需要更改。此外,您可能会发现,尤其是当图数据库调整大小时,您常常需要修改(重构)图模型,以实现关键用例的最佳性能。
重构在开发过程中非常常见。与RDBMS中的模式不同,Neo4j图有一个非常灵活的可选模式。Cypher开发人员可以很容易地修改图以表示改进的数据模型。
二、域模型
了解应用程序的域信息
在开始数据建模过程之前,必须:
- 确定应用程序的需求用户和开发人员。
- 与需求方和开发人员:
- 详细描述应用程序。
- 识别应用程序的用户(人员、系统)。
- 就应用程序的用例达成一致。
- 对用例的重要性进行优先级排序。
电影域名
在Neo4j基础知识课程中,向您介绍了一个“入门”级电影图数据库。
该域模型中包括电影、电影演员或导演以及电影评分用户。这个示例域的有趣之处在于图中节点之间的连接关系。
用例
应用程序的大多数用例都可以通过一个全面的问题列表来列举。用例有助于定义应用程序在运行时的行为。
以下是您将用于开发初始图数据模型的用例:
- 电影里演什么人?
- 谁导演了一部电影?
- 一个人演过什么电影?
- 有多少用户为一部电影评分?
- 谁是最年轻的电影演员?
- 一个人在电影中扮演什么角色?
- 根据imDB的统计,某一年收视率最高的电影是什么?
- 一名指定的演员演过哪些电影?
- 哪些用户对一部电影的评分为5分?
在上面的域模型中,我们想要区分在电影中扮演或导演的人和对电影进行评分的用户或评论员。我们有更多关于人的信息,如他们的出生日期、tmdbId等(TMDB,是“the movie database”的简写)。电影评论用户只需给出他们的姓名或识别一下即可。
三、图模型的类型
为应用程序执行图数据建模过程时,至少需要创建两种类型的模型:
- 数据模型
- 实例模型
(一)数据模型
数据模型描述图的标签、关系和属性。它没有提供将在图中创建的特定数据。以传统RDBMS学生管理系统中来比较,这一步相当于创建了学生表、课程表、任课老师表并确定组成这几个表的字段名称、类型等,及表间的关系。但是,这一步并没有创建具体的学生数据、课程数据、老师数据。
以下是数据模型的示例:
此步中创建了两个节点类型(在Neo4j中称为标签):Person{name,tmdbid,born},Movie{title, tmdbid,released,imdbRating}
还有一个关系类型:ACTED_IN{role}
虽然这一步不存在任何东西可以用给定的标签唯一地标识节点。然而,图数据模型很重要,因为它定义了在应用程序创建和使用图时将用于标签、关系类型和属性的名称。
(二)建模建议
在开始图数据建模过程时,务必就标签、关系类型和属性键的命名方式达成一致。标签、关系类型和属性键区分大小写,而Cypher关键字不区分大小写。
Neo4j的最佳实践是在命名图的元素时使用以下内容,但您可以自由地为应用程序使用任何约定。
标签是以大写字母开头的单个标识符,可以是CamelCase。
示例:Person、Company、GitHubRepo
关系类型是一个标识符,由大写字母和下划线组成。
示例:FOLLOWS、MARRIED_TO
节点或关系的属性键是以小写字母开头的单个标识符,可以是camelCase。
示例:deptId,firstName
注意:属性键名称不必唯一。例如,Person节点和Movie节点的属性键都可以是tmdbId。
(三)实例模型
图数据建模过程的一个重要部分是根据用例测试模型。要做到这一点,您需要有一组示例数据,可以使用这些数据来查看用例是否可以用模型来回答。
以下是实例模型的示例:
在这个实例模型中,我们创建了一些Person和Movie节点的实例,以及它们之间的关系。拥有这种类型的实例模型将有助于测试我们的用例。
引用:
https://graphacademy.neo4j.com/courses/modeling-fundamentals/1-getting-started/2-the-domain/