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

news2024/12/25 20:14:31

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

斯坦·帕格斯利

迈向数据科学

跟随

发表于

迈向数据科学

·
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.coloradmin.cn/o/877042.html

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

相关文章

【Sklearn】基于最中心分类器算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于最中心分类器算法的数据分类预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 最近中心分类器&#xff08;Nearest Centroid Classifier&#xff09;也被称为近似最近邻…

SolidUI 一句话生成任何图形,v0.2.0功能介绍

文章目录 背景聊天窗口提示词 聊天窗口生成输入数据格式柱形图曲面图散点图螺旋线饼图兔子建模地图 设计页面页面布局预览 SolidUI社区的未来规划如何成为贡献者加群 背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容…

BFS(广度优先搜索) 的相关介绍解析

文章目录 DFS 和 BFSBFS 的应用一&#xff1a;层序遍历BFS 的应用二&#xff1a;最短路径最短路径例题讲解 DFS&#xff08;深度优先搜索&#xff09;和 BFS&#xff08;广度优先搜索&#xff09;就像孪生兄弟&#xff0c;提到一个总是想起另一个。然而在实际使用中&#xff0c…

Keburnetes 存储卷 volumes

K8S 的 存储卷 volumes emptyDir 可实现Pod中的容器之间共享目录数据&#xff0c;但emptyDir存储卷没有持久化数据的能力&#xff0c;存储卷会随着Pod生命周期结束而一起删除 &#xff08;一个pod中创建了docker1 docker2两个容器&#xff0c;他们都挂载这个emptyDir&#xff0…

第1期:《实体新零售--瑞幸咖啡》私域爆款案列拆解

朋友们&#xff0c;大家好&#xff0c;阿车写私域相关的内容也有一段时间了&#xff0c;前前后后也接触了不少“私域玩法” “爆款案列”&#xff0c;只是一直不知道怎么分享给大家&#xff0c;前段时间这个分享的想法愈发激烈&#xff0c;所以抽时间好好梳理了一番&#xff0c…

如何初始化Git仓库

如何将目录初始化为Git仓库 一级目录二级目录三级目录 一、准备1、安装 gh2、登录 二、初始化 Git 仓库 一级目录 二级目录 三级目录 一、准备 ​ 在这里&#xff0c;我们需要借助一个非常好用的工具&#xff0c;大家也可以参照官方文档进行阅读&#xff0c;下面介绍常用的…

Java Review - 关于代理的二三事儿

文章目录 Pre概述静态代理概述Code 动态代理概述实现方式一 - JDK代理或接口代理概述Code 实现方式二 - CGLib 子类代理 (Code Generation Library)概述pom依赖Code Pre Java-JDK动态代理 Java-CGLib动态代理 概述 代理模式是一种结构型设计模式&#xff0c;其目的是为其他对…

Windows安装MinGW和简单的使用教程

Windows安装MinGW和简单的使用教程 什么是MinGW&#xff1f; MinGW&#xff0c;是Minimalist GNU for Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合&#xff0c;允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要…

在P4(Perforce)中使用TortoiseMerge来比较合并

一直习惯于svn的比较合并工具&#xff0c;会觉得p4自带的反人性。还好p4可以在设置里替换成外部的比较合并工具。方法见下图&#xff1a; 1. 比较 2. 合并 注意&#xff0c;如果合并设置有问题&#xff08;某些P4版本&#xff09;&#xff0c;则需要通过一个bat文件来做中转&a…

聊聊看React和Vue的区别

Vue 更适合小项目&#xff0c;React 更适合大公司大项目&#xff1b; Vue 的学习成本较低&#xff0c;很容易上手&#xff0c;但项目质量不能保证...... 真的是这样吗&#xff1f;借助本篇文章&#xff0c;我们来从一些方面的比较来客观的去看这个问题。 论文档的丰富性 从两个…

Linux fork()||fork()问题

以下代码会输出几个"A"&#xff1f; int main() { fork() || fork();printf("A\n");} 代码分析&#xff1a; //父进程fork() || fork();printf("A\n");这里父进程中的第一个fork先执行&#xff0c;产生一个子进程&#xff1a; //子进程…

Electron-builder打包和自动更新

前言 文本主要讲述如何为 electron 打包出来软件配置安装引导和结合 github 的 release 配置自动更新。 electron-builder 是将 Electron 工程打包成相应平台的软件的工具&#xff0c;我的工程是使用 electron-vite 构建的&#xff0c;其默认集成了 electron-builder &#x…

K8S之存储卷

K8S之存储卷 一、emptyDir emptyDir&#xff1a;可实现Pod中的容器之间共享目录数据&#xff0c;但emptyDir存储卷没有持久化数据的能力&#xff0c;存储卷会随着Pod生命周期结束而一起删除二、hostPath hostPath&#xff1a;将Node节点上的目录/文件挂载到Pod容器的指定目录…

【JavaWeb】实训的长篇笔记(下)

文章目录 八、功能实现1、注册功能2、登录功能3、问题说明4、首页数据显示5、后台管理 八、功能实现 1、注册功能 jsp&#xff1a;能够在页面中把数据动态化&#xff0c;jsp和html在元素标签上是无区别的&#xff0c;区别是html中写上java代码就成了jsp文件。filename.jsp。 需…

Threejs学习01——坐标轴展示立方体并实现来回移动

在三维坐标轴上展示立方体并实现来回移动 这是一个非常简单基础的threejs的学习应用&#xff01;创建应用先创建一个场景Scene&#xff0c;然后创建爱你一个透视相机PerspectiveCamera&#xff0c;然后创建立方体BoxGeometry&#xff0c;立方体添加一些材质&#xff0c;将立方…

SPSS多元线性回归操作入门实例

做农情反演的时候往往需要用到SPSS多元线性回归&#xff0c;这里提供一个操作案例 (一)SPSS安装 关于SPSS安装&#xff0c;请参考本人博客&#xff1a;保姆级SPSS图文安装教程_追忆苔上雪的博客-CSDN博客 (二)SPSS多元线性回归实例 在文章ArcGIS入门操作手册_追忆苔上雪的博…

Windows下升级jdk1.8小版本

1.首先下载要升级jdk最新版本&#xff0c;下载地址&#xff1a;Java Downloads | Oracle 中国 2.下载完毕之后&#xff0c;直接双击下载完毕后的文件&#xff0c;进行安装。 3.安装完毕后&#xff0c;调整环境变量至新安装的jdk位置 4.此时&#xff0c;idea启动项目有可能会出…

CCF考试:201703-1 分蛋糕(java代码)

1、【问题描述】 小明今天生日&#xff0c;他有n块蛋糕要分给朋友们吃&#xff0c;这n块蛋糕&#xff08;编号为1到n&#xff09;的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕&#xff0c;对于每个朋友&#xff0c;小明…

2023年新学期12306高铁火车学生票如何在线核验享受优惠?

2023学年优惠资质核验已开始&#xff0c;完成学生优惠资质核验后&#xff0c;您可以在线购买2022年10月1日至2023年9月30日的学生优惠票。&#xff08;注&#xff1a;非该时间段需要重新核验&#xff0c;可享受学生优惠票&#xff09;&#xff1b; 『扩展阅读』 1、美团外卖红…

日常BUG——SpringBoot关于父子工程依赖问题

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 在父子工程A和B中。A依赖于B&#xff0c;但是A中却无法引入B中的依赖&#xff0c;具体出现的…