前言:
Abstract:本文的主要内容是图形数据建模、领域知识对建模的重要性以及图数据模型和实例模型之间的区别。
笔者近日在学习有关知识图谱Knowledge Graph的相关内容。
Neo4j是项目所需的一款功能强大的应用,特此来学习之,并记录于本文。
笔者是AI领域的小白,作为初学者,文章中难免会有出错或者不恰当的部分,烦请读者朋友们指出(在以下任意平台)。
Bilibili:space.bilibili.com/57089326
注意:本文不是教程,只是个人学习的记录和心得,可能会对你有帮助,建议配合官方文档一起学习!
官方文档链接:graphacademy.neo4j.com/courses/mod…
再注:原文是英文,若有较好的英文阅读能力可以直接读,本文是对原文中重要的内容进行了翻译,以及加上了笔者自己的理解。
初窥门径:
什么是图形数据建模:
首先我们要知道的是Neo4j中,图的组成部分有哪些,具体来说有四个组件,分别是:
- 节点
- 标签
- 关系
- 属性
而创建图形数据模型的步骤又如下所示:
- 了解领域并为应用程序定义特定用例(问题)。
- 开发初始图形数据模型:
- 对节点(实体)建模。
- 对节点之间的关系建模。
- 针对初始数据模型测试用例。
- 使用 Cypher 使用测试数据创建图形(实例模型)。
- 测试用例,包括针对图表的性能。
- 由于关键用例的变化或性能原因,重构(改进)图形数据模型。
- 在图上实施重构并使用 Cypher 重新测试。
由此可见,图形数据建模事实上是一个迭代的过程,有些读者可能会觉得那么频繁的重构是很麻烦的,不过事实上,与RDBMS相比,利用Cypher语言构建的Neo4j图形修改起来是十分灵活和方便的。
模型的目的:
在为应用程序执行图形数据建模过程时,至少需要两种类型的模型:
- 数据模型
- 实例模型
听起来名字差不多?那么,这两种模型分别都是什么呢?
事实上:
- 数据模型描述的是图形的标签、关系和属性。
- 实例模型是用来测试模型用例的,这是图形数据建模的重要一环。
这是一个数据模型的例子:
而这是一个实例模型的例子:
建模节点:
这一部分主要学习的是:
- 从您的用例中识别实体。
- 在图中创建节点以支持数据模型。
定义标签:
实体是应用程序用例中的主导名词,比如:食谱中主要使用了哪些成分?
加粗的名词就是所谓的实体。
而这些实体就是在图中的节点,我们定义标签也是用名词来定义,也就是节点的"名字"。
定义属性:
节点不仅有名字(标签),还要有属性,属性是用来唯一标识一个节点的,还可以回答应用程序用例的具体细节和返回数据。
具体问题需要具体分析。
建模关系:
这一部分主要学习的是:
- 从用例中识别关系。
- 在图中创建关系以支持数据模型。
首先我们要知道的是,关系是实体之间的联系,一般来说是动词。
比如:食谱中主要使用了哪些成分?
虽然这看上去不是一件很难的事情,但是它们的微观和宏观设计可以说是图形性能中最关键的因素。
命名关系:
如上例,"使用了"就是一种命名,不能随便命名,以防混淆。
关系方向:
在Neo4j中创建关系的时候,一定是一条有向的边,倘若真的需要无向边,那就正反都创建就好了。
值得一提的是,关系可以是两个节点之间的,也可以是一个节点的自环。
Fanout:
直接翻译成扇出不知道合不合适,我们就暂时先用Fanout了。
在这里,我们的实体(Person、Residence)不是表示为单个节点,而是表示为网络或链接节点。
关系属性:
在这里我们看到我们在MARRIED关系上有一个日期属性来进一步描述 Michael 和 Sarah 之间的关系。
此外,我们在WORKS_AT关系上有一个角色属性来描述迈克尔在 Graph Inc. 工作时拥有或拥有的角色。
测试模型:
在本模块中,我们将测试图是否可以用于测试模型的用例。
简单来说,在测试用例期间,我们需要做的是:
- 向图中添加更多数据以测试可扩展性。
- 测试和修改用于测试用例的任何 Cypher 代码。
- 如果无法回答用例,则重构数据模型。
重构图:
在本模块中,我们将学习:
- 为什么我们重构一个图数据模型和图。
- 向数据模型添加标签。
为什么重构:
重构是更改数据模型和图形的过程。
重构的三个原因:
- 建模的图表并没有回答所有的用例。
- 出现了一个新的用例,您必须在数据模型中考虑该用例。
- 用例的 Cypher 表现不佳,尤其是当图形缩放时。
重构步骤:
要重构图形数据模型和图形,您必须:
- 设计新的数据模型。
- 编写 Cypher 代码来转换现有图形以实现新的数据模型。
- 重新测试所有用例,可能使用更新的 Cypher 代码。
具体内容待补充
消除重复数据:
概述:
我们应该注意避免在图表中重复数据。
有些数据库需要一种非规范化形式来提高一组查询的速度,而图形数据库并不总是这样。
去重数据给你带来了额外的好处,允许你通过一个节点进行查询。
例如,找到购买了特定产品的其他客户,或者根据其他用户的评分找到类似的电影。
此外,在图中复制数据会增加图的大小以及查询可能需要检索的数据量。
具体内容待补充
特殊化关系:
为什么要重构图表以特殊化关系:
- 减少需要检索的节点数。
- 提高查询性能。
特殊关系允许您遵循特定的关系类型并避免在单个查询中遍历图的大部分。
如何建立动态关系:
使用Cypher中的APOC库,这是图形引擎在运行时可用的库中的专用过程。
具体内容待补充
中间节点:
有时,我们会发现需要将更多数据连接到关系的情况,而不是可以在属性中完全捕获的数据。
换句话说,您需要连接两个以上节点的关系。
数学通过超边的概念允许这样做。这在 Neo4j 中是不可能的,但我们也有办法,解决方案是创建中间节点。
流程:
- 在单个上下文中连接两个以上的节点。
- 超边(n 元关系)
- 将某事与一段关系联系起来。
- 在实体之间共享图中的数据。
具体内容待补充