为什么需要知识图谱,如何构建它?

从关系数据库迁移到图形数据库的指南

斯坦·帕格斯利

迈向数据科学

跟随

发表于

迈向数据科学

·
7 分钟阅读
·
4天前

154

4

一、说明

        TLDR:知识图谱在图数据库中组织事件、人员、资源和文档,以进行高级分析。本文将解释知识图谱的用途,并向您展示如何将关系数据模型转换为图模型、将数据加载到图数据库中以及编写一些示例图查询的基础知识。

二、为什么选择知识图谱?

        关系数据库非常适合创建列表,但对于管理不同实体的网络来说却很糟糕。您是否曾经尝试过使用关系数据库执行任何这些任务?

  • 分析患者与数十人、地点和程序互动时的医疗保健护理事件
  • 通过涉及的供应商、客户和交易类型网络查找金融欺诈模式
  • 优化供应链的依赖关系和相互关联的元素

        这些都是事件、人员和资源网络的例子,这些事件、人员和资源给使用关系数据库的 SQL 分析师带来了巨大的麻烦。随着网络规模的增加,关系数据库的速度呈指数级增长,而图形数据库具有相对线性的关系。如果您正在管理活动和事物的网络或 Web,图形数据库是正确的选择。在未来,我们应该期待看到企业数据组采用关系数据库的组合,对一个业务功能进行孤立的分析,以及知识图谱的组合,用于跨功能的复杂网络化流程。

        基于图形数据库技术的知识图谱旨在处理各种流程和实体网络。在知识图谱中,您具有表示人员、事件、地点、资源、文档等的节点。并且您具有表示节点之间链接的关系(边)。这些关系以名称和方向物理存储在数据库中。并非每个图形数据库都是知识图形。要被视为知识图谱,设计必须将业务语义模型嵌入到跨越多个业务功能的各种节点集中,该模型反映在节点和关系的清晰业务名称中。实质上,您是在从交互的业务的所有部分创建一个无缝的网络,并使用业务语义将数据与它们所代表的流程紧密联系在一起。这可以作为未来生成LLM模型使用的基础

        为了说明知识图谱中的各种数据集,让我们看一个简单的供应链物流示例。业务流程可以按如下方式建模:

供应链图数据库模型。图片由作者提供。

        此模型可以扩展到包括业务流程的任何相关部分:客户退货、发票、原材料、制造流程、员工,甚至客户评论。没有预定义的架构,因此模型可以向任何方向或深度扩展。

三、从关系模型到维度模型再到图模型

        现在,让我们了解一下使用电子商务供应商的方案将典型的关系数据库模型转换为图形模型的过程。假设该供应商正在运行一系列数字营销活动,在其网站上接收订单,并将产品运送给客户。关系模型可能如下所示:

电子商务关系数据库模型。图片由作者提供。

        如果我们将其转换为用于数据仓库的维度模型,该模型可能如下所示:

电子商务维度模型(数据仓库)。图片由作者提供。

        请注意,事实数据表侧重于事件,维度表表示合并到一个表中的业务实体的所有属性。这种以事件为中心的设计提供了更快的查询时间,但会产生其他问题。每个事件都是一个不同的事实数据表,很难看到从一个事件到相关事件之间的联系。当维度实体(如产品)与另一个维度中的实体(如运营商)共享的所有事件(在多个事实数据表之间拆分时),没有简单的方法可以理解这些关系。维度模型一次关注一个事件,但模糊了不同事件之间的联系。

        图模型通过对过程进行建模,解决了显示实体之间相互关联的问题,如下所示:

电子商务图数据库模型。图片由作者提供。

        乍一看,该图模型与关系模型比维度模型更相似,但它可以用于与数据仓库相同的分析目的。请注意,每个关系都有名称并具有方向。可以在任何节点之间创建关系 - 事件与事件、人与人、文档与事件等。图形查询还允许您以 SQL 无法实现的方式遍历图形。

        例如,您可以收集与关键事件相关的任何节点并研究发生的模式。与非规范化维度表不同,层次结构被保留,每个级别都可以单独引用。最重要的是,图表在对业务中的任何事件或实体进行建模时更加灵活,无需遵循一组严格的模式约束。该图旨在匹配业务的语义模型。

四、提取、转换和加载 (ETL)

        现在,让我们看一个示例关系数据库表,并创建一些示例脚本来提取、转换数据并将其加载到图形数据库中。在本文中,我将使用Cypher语言,这是最流行的商业图形数据库Neo4j使用的语言。但这些概念将适用于图形查询语言(GQL)的其他变体。我们将使用以下示例产品表:

产品表。 

        使用此查询,我们可以提取过去 24 小时内更新的新产品:

SELECT product_id,product_name,cost_usd,product_status
FROM Product
WHERE last_updated_date > current_date -1;

        我们可以将这些结果拉取到名为“df”的 Python Pandas 数据帧中,打开图形数据库连接,然后使用此脚本将数据帧合并到图形中。

UNWIND $df as row
MERGE INTO (p:Product {product_id: row.product_id})
SET p.product_name = row.product_name,p.cost_usd = row.cost_usd,p.product_status= row.product_status,p.last_updated_date = datetime();

        第一行引用参数“df”,这是来自 Pandas 的数据帧。我们将合并到节点类型“产品”中,该节点类型由别名“P”引用。然后,“product_id”部分用于绑定到节点中的唯一标识符。之后,Merge 语句看起来类似于 SQL 中的合并。

        使用上面这样的合并语句创建每个节点后,我们创建关系。关系可以在同一脚本中创建,也可以使用如下所示的合并命令在后处理脚本中创建:

MATCH (p:Product), (o:Order)
WHERE p.product_id = o.order_id
MERGE (o)-[:CONTAINS]->(p);

        Match 语句类似于 Oracle 中的旧版联接用法,在 Match 之后声明了两种节点类型,然后在 Where 子句中声明了联接。

五、对图模型的查询

        假设我们已经构建了图形,现在想要查询它。我们可以使用这样的查询来查看从亚利桑那州吸引订单的广告组。

MATCH (ag:AdGroup)<-[:BELONGS_TO]-(a:Ad)-[:DRIVES]->(o:Order)<-[:PLACES]-(c:Customer)
WHERE c.state = 'AZ'
RETURN ag.group_name,COUNT(o) as order_count

        此查询将返回广告组名称和订单数量(按亚利桑那州过滤)。请注意,与SQL不同,Cypher中不需要Group By子句。从该查询中,我们将收到以下示例输出:

图形查询的示例结果。图片由作者提供。

        此示例可能看起来微不足道,因为您可以使用订单事实数据表在关系数据库或数据仓库中轻松创建类似的查询。但是,让我们考虑一个更复杂的查询。假设您想查看从广告系列启动到收到可归因投放所花费的时间。在数据仓库中,此查询将跨事实数据表(不是一个简单的任务)并占用大量资源。在关系数据库中,此查询将涉及一长串联接。在图形数据库中,查询如下所示:

MATCH (cp:Campaign) )<-[:BELONGS_TO]-(ag:AdGroup)<-[:BELONGS_TO]-(a:Ad)
MATCH (a)-[:DRIVES]->(o:Order)<-[:FULFILLS]-(d:Delivery)
RETURN cp.campaign_name,cp.start_date as campaign_launch_date,MAX(d.receive_date) as last_delivery_date

        我使用了一个示例查询路径,但用户可以采用多种路径来回答不同的业务问题。在查询中,请注意,从“营销活动”到“投放”的路径经过订单和投放之间的关系。另请注意,为了便于阅读,我将路径分为两部分,从第二行中的 Ad 别名开始。查询的输出如下所示:

        图形查询的示例结果。图片由作者提供。

六、结论

        我们已经查看了一些将电子商务业务流程从关系模型转换为图形模型的示例步骤,但我们无法在本文中涵盖所有设计原则。希望您已经看到图形数据库需要与关系数据库大致相同的技术技能水平,并且迁移不是一个巨大的障碍。

        最大的挑战是重新训练你的大脑,远离传统的关系建模技术,从语义或业务建模的角度思考。如果您看到图形技术的潜在应用,请尝试概念验证项目。使用知识图谱进行分析的可能性远远超出了二维表格所能做到的!斯坦·帕格斯利

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Java中对XML的简单应用

XML 数据传输格式1 XML 概述1.1 什么是 XML1.2 XML 与 HTML 的主要差异1.3 XML 不是对 HTML 的替代 2 XML 语法2.1 基本语法2.2 快速入门2.3 组成部分2.3.1 文档声明格式属性 2.3.2 指令&#xff08;了解&#xff09;&#xff1a;结合CSS2.3.3 元素2.3.4 属性**XML 元素 vs. 属…

windows程序基础

一、windows程序基础 1. Windows程序的特点 1&#xff09;用户界面统一、友好 2&#xff09;支持多任务:允许用户同时运行多个应用程序(窗口) 3&#xff09;独立于设备的图形操作 使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异&#…

LVGL学习笔记 30 - List(列表)

目录 1. 添加文本 2. 添加按钮 3. 事件 4. 修改样式 4.1 背景色 4.2 改变项的颜色 列表是一个垂直布局的矩形&#xff0c;可以向其中添加按钮和文本。 lv_obj_t* list1 lv_list_create(lv_scr_act());lv_obj_set_size(list1, 180, 220);lv_obj_center(list1); 部件包含&…

Android:换肤框架Android-Skin-Support

gihub地址&#xff1a;https://github.com/ximsfei/Android-skin-support 样例&#xff1a; 默认&#xff1a; 更换后&#xff1a; 一、引入依赖&#xff1a; // -- 换肤依赖implementation skin.support:skin-support:4.0.5// skin-supportimplementation skin.support:ski…

Rust语法:变量,函数,控制流,struct

文章目录 变量可变与不可变变量变量与常量变量的Shadowing标量类型整数 复合类型 函数控制流if elseloop & whilefor in structstruct的定义Tuple Structstruct的方法与函数 变量 可变与不可变变量 Rust中使用let来声明变量&#xff0c;但是let声明的是不可变变量&#x…

双色球彩票系统---(java实现)

双色球彩票系统&#xff1a;需求&#xff1a;投注号码由6个红色号码和1个蓝色球号码组成。红色球号码从1-33中选择&#xff0c;蓝色球号码从1-16当中选择 * 红 蓝 * 一等奖 6 1 * 二等奖 6 0 * 三等奖 5 1 * 四等奖 5 0 * 4 1 * 五等奖 4 0 * …

Blazor简单教程(1.1):Razor基础语法

文章目录 前言基本文件配置引入Layout组件 语法介绍pagecodeRazor 语法[ 显式表达和隐式表达](https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/razor?viewaspnetcore-7.0#explicit-razor-expressions) 绑定简单绑定双向绑定带参数的函数绑定 依赖注入 前言 Blazor…

QT:UI控件(按设计师界面导航界面排序)

基础部分 创建新项目&#xff1a;QWidget&#xff0c;QMainWindow&#xff0c;QDialog QMainWindow继承自QWidget&#xff0c;多了菜单栏; QDialog继承自QWidget&#xff0c;多了对话框 QMainWindow 菜单栏和工具栏&#xff1a; Bar: 菜单栏&#xff1a;QMenuBar&#xff0…

A Survey for In-context Learning

A Survey for In-context Learning 摘要&#xff1a; 随着大语言模型(LLMs)能力的增长&#xff0c;上下文学习(ICL)已经成为一个NLP新的范式&#xff0c;因为LLMs仅基于几个训练样本让内容本身增强。现在已经成为一个新的趋势去探索ICL来评价和extrapolate LLMs的能力。在这篇…

微服务06-分布式事务解决方案Seata

1、Seata 概述 Seata事务管理中有三个重要的角色: TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。 RM (Resourc…

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB

本课程基于百度地图技术&#xff0c;由基础入门开始到应用实战&#xff0c;适合零基础入门学习。将企业项目中地图相关常见应用场景的落地实战&#xff0c;包括有地图找房、轻骑小程序、金运物流等。同时讲了基于Netty实现高性能的web服务&#xff0c;来处理高并发的问题。还讲…

JVM垃圾回收篇-垃圾回收算法

JVM垃圾回收篇-垃圾回收算法 标记清除&#xff08;Mark Sweep&#xff09; 概念 collector指的就是垃圾收集器。 mutator是指除了垃圾收集器之外的部分&#xff0c;比如说我们的应用程序本身。 mutator的职责一般是NEW(分配内存)、READ(从内存中读取内容)、WRITE(将内容写入内…

vscode搭建c语言环境问题

c语言环境搭建参考文章:【C语言初级阶段学习1】使用vscode运行C语言&#xff0c;vscode配置环境超详细过程&#xff08;包括安装vscode和MinGW-W64安装及后续配置使用的详细过程&#xff0c;vscode用户代码片段的使用&#xff09;[考研专用]_QAQshift的博客-CSDN博客 问题如下:…

[C++ 网络协议] 套接字和地址族、数据序列

目录 1. 套接字 1.1 在Linux平台下构建套接字 1.1.1 用于接听的套接字(服务器端套接字) 1.1.2 用于发送请求的套接字(客户端套接字) 1.2 在Windows平台下构建套接字 1.2.1 Winsock的初始化 1.2.2 用于接听的套接字(服务器端套接字) 1.2.3 用于发送请求的套接字(客户端套…

pytest框架快速进阶篇-pytest前置和pytest后置,skipif跳过用例

一、Pytest的前置和后置方法 1.Pytest可以集成unittest实现前置和后置 importunittestimportpytestclassTestCase(unittest.TestCase):defsetUp(self)->None:print(unittest每个用例前置)deftearDown(self)->None:print(unittest每个用例后置)classmethoddefsetUpClass…

jmeter中用户参数和用户定义的变量的区别

如果使用jmeter做过参数化的人都知道&#xff0c;参数化的方式有多种&#xff0c;其中一种就是使用用户定义的变量&#xff0c;还有一种是使用用户参数。那么&#xff0c;这两个有什么异同呢&#xff1f; 一、先说相同的点&#xff1a; 1、都可以参数化&#xff0c;以供sample…

allure测试报告

使用pytest结合Allure进行测试报告生成的简单教程 allure测试报告 Allure基于Java开发&#xff0c;因此我们需要提前安装Java 8或以上版本的环境。 ◆安装allure-pytest插件在DOS窗口输入命令“pip3 install allure-pytest”&#xff0c;然后按“Enter”键。 下载安装Allure…

使用 Docker 部署 canal 服务实现MySQL和ES实时同步

文章目录 0. 环境介绍0. 前置步骤1. 安装Kibana和Elasticsearch2. 安装Canal和Canal Adapter2.1 修改数据库配置2.1.1 修改配置2.1.2 验证mysql binlog配置2.1.3 查看日志文件2.1.4 用JDBC代码插入数据库 2.2 安装Canal Server2.3 安装Canal Adapter修改两处配置文件配置文件取…

初识mysql数据库之引入mysql客户端库

目录 一、下载第三方库 1. 准备工作 1. 使用mysql官网提供的库 2. yum源安装 二、测试第三方库是否可用 三、mysql常用接口介绍 1. 查看官方文档 2. 初始化 3. 关闭mysql 4. 连接mysql 5. 下达sql指令 四、一个简单的C客户端库连接mysql程序 1. 头文件 2. 初始化…

Could not resolve host: mirrorlist.centos.org; Unknown error解决方法

今天服务器安装完CentOS系统后&#xff0c;安装网络的时候&#xff0c;出现无法联网yum yum -y install net-tools 以上代码无法运行并报错&#xff0c;这里我要提醒大家&#xff0c;如果在初始安装的时候选中安装网络工具模块就不用在安装net-tools了&#xff0c;因为我选中…