前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >一文速学-知识图谱从零开始构建实战:知识图谱搭建

一文速学-知识图谱从零开始构建实战:知识图谱搭建

原创
作者头像
fanstuck
修改2024-11-27 10:03:57
修改2024-11-27 10:03:57
5030
举报

“好事”文章推荐:BuildAdmin19:前端项目如何设计一个异步API请求模块

文章地址:https://cloud.tencent.com/developer/article/2469533

在前后端分离的架构中,后端负责封装api接口,前端负责请求api接口。我通常使用Springboot来开发后端,在前端项目中就要实现api请求模块。 那么前端如何请求这些后端接口呢,所以这边篇文章还是来封装一个前端的接口请求模块。

前言

让我们来整理之前我们两章的内容思绪,第一章我们了解了知识图谱的基本概念和需要构建的步骤架构,第二章我们明确了要采用知识抽取的技术栈。目前再来回溯最初的架构图:

目前我们最主要的还是构建一个小型知识图谱,先建立一个基座方便我们后续进行不断拓展,现在这一章我们就开始进行使用Neo4j搭建一个小型知识图谱。

Cypher Shell

如果按照我文章系列章节来学习的话,上一章我们了解了Neo4j的基础操作,但是还没有正式开始对图数据库进行操作。也就是数据的增删改查是不了解的,从此一章我们来了解整个Neo4j图数据库的数据操作。

Cypher Shell是一个命令行工具,用于对Neo4j实例运行查询和执行管理任务。默认情况下,shell是交互式的,但也可以通过在命令行上直接传递Cypher或通过管道传输带有Cypher语句的文件(需要Windows上的PowerShell)将其用于脚本编写。它通过Bolt协议进行通信。

语法

运行Cypher Shell的语法是:

代码语言:shell
复制
 cypher-shell [-h] [-a ADDRESS]
              [-u USERNAME] [--impersonate IMPERSONATE]
              [-p PASSWORD] [--encryption {true,false,default}]
              [-d DATABASE] [--access-mode {read,write}]
              [--format {auto,verbose,plain}]
              [-P PARAM] [--non-interactive] [--sample-rows SAMPLE-ROWS]
              [--wrap {true,false}] [-v] [--driver-version]
              [-f FILE] [--change-password] [--log [LOG-FILE]]
              [--history HISTORY-BEHAVIOUR]
              [--notifications] [--fail-fast | --fail-at-end]
              [--idle-timeout IDLE-TIMEOUT]
              [cypher]

我们之前导入的相关电影关系图数据,现在我们开始来创建一个Movie Graph,现在将展示如何:

  • 创建:将电影数据插入到图形中。
  • 查找:检索单个电影和演员。
  • 查询:在图中查找模式。
  • 解答:回答一些关于图表的问题。

创建

首先我们创建一个新的Neo4j database。打开Neo4j Desktop,创建一个新的project:

之后创建一个新的DataBase

记得设置浏览器设置以允许多语句:

在查询窗格中输入:引导电影图,然后单击右侧的“播放”按钮。查询窗格下方将打开一个新窗口,其中包含浏览器指南。

之后我们可以点开Sample Scripts的Example Graphs,或者你也可以Cypher输入

代码语言:shell
复制
:play movie-graph

根据引导我们可以创建电影图数据:

如果要查看返回数据的表视图,可以单击左侧的表图标:

创建节点

如何查看结果也将取决于返回的数据。如果查询返回节点,则可以将数据视为图形。如果查询返回属性值,则只能将数据作为表查看

代码语言:sql
复制
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})

从GQL来看很容易看出语句结构:

代码语言:sql
复制
CREATE (<节点名称>:<节点标签>{<节点键>:<节点值>})

创建关系

两个节点创建关联关系的语句:

代码语言:sql
复制
CREATE (Emil)-[:ACTED_IN {roles:["Emil"]}]->(TheMatrix)

上述这段语句也很好理解,具体的模版为:

代码语言:sql
复制
CREATE <节点名称(客体)>-[:<关系类型> {<关系属性>:[<关系值>]}]->(<节点名称(主体)>)

点击关系链接可以看到:

查询

我们现在想要查询一个Tom Hanks的节点,对标SQL帮助我们更好去记忆代码,查询语句可以为:

Where

代码语言:sql
复制
MATCH (tom:Person)
WHERE tom.name = "Tom Hanks"
RETURN tom

还可以使用表视图查看节点的属性:

查询语句和SQL很类似,将select替换为match即可,最后注意要加上RETURN <节点名称>。

比如我们想要查找电影名称为Cloud Atlas的电影:

LIMIT

接下来,我们想在图中找到10个人的名字。此代码查找图中的所有Person节点,但只返回其中10个节点的name属性值:

代码语言:sql
复制
MATCH (people:Person)
RETURN people.name LIMIT 10

对于此查询,将返回属性值,只能以表的形式查看结果。那么现在我们想查询一定范围内的数据,也就是对标Between

Between

代码语言:sql
复制
MATCH (nineties:Movie)
WHERE nineties.released > 1990 AND nineties.released < 2000
RETURN nineties.title

检索

到目前为止,已经在图中查询了节点。接下来需要获得检索相关节点,也就是相当于直接查表,和SQL的表连接查询类似,问题可以为:

  • 演员是在电影中表演的人。
  • 导演是导演电影的人。
  • 还存在哪些其他关系?

比如我要列出Tom Hanks 的所有电影,想返回演员汤姆·汉克斯的Person节点,我们还想返回所有与汤姆·汉克斯有ACTED_IN关系的Movie节点。也就是说汤姆·汉克斯出演的所有电影:

代码语言:sql
复制
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies)
RETURN tom,tomHanksMovies

这里需要注意动作的执行者和动作的承受者电影演员是演出这个动作的执行者,所以是演员->出演->电影这个顺序,如果我们想要查询Cloud Atlas这部电影是由谁拍的时,电影<-演导<-导演这个顺序:

代码语言:sql
复制
MATCH (cloudAtlas:Movie {title: "Cloud Atlas"})<-[:DIRECTED]-(directors)
RETURN directors.name

多关系检索

那么我们再试试复杂的检索,接下来,我们想找到汤姆·汉克斯出演的所有电影,并为检索到的每部电影找到出演该电影的人。

代码语言:sql
复制
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)
RETURN tom, m, coActors

如果我们想在其中返回有关与Cloud Atlas电影之间关系的信息。需要找到相关节点,然后返回人员的姓名、关系类型以及该关系的属性:

代码语言:sql
复制
MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"})
RETURN people.name, type(relatedTo), relatedTo

检索路径限制

我们发现图数据展示是可以根据关系的逐层递进依次索引的,就好像遍历树的深度,在图里面含义也与其类似树的层级一样,也可以理解为树的高度为图的遍历深度。我们来看一个例子:

我们想找到图表中距离凯文·培根最多3跳的所有电影和/或人物:

代码语言:sql
复制
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..3]-(hollywood)
RETURN DISTINCT bacon, hollywood

最短路径检索

因为对象之间的关系是可以通过对象链接来逐层累计深入下去的,比如供应关系链,我直接购买了你的产品,其中就只有一层关系:

  • 我->购买->产品
  • 产品->归属->你

某一天你把你的东西挂在了闲鱼上,我是通过闲鱼来买你的东西的。那么关系就是:

  • 我->购买->产品
  • 产品->挂靠->平台
  • 产品->归属->你

这样就是有三层关系了,当然我们如果只想要查询我购买你的东西这条仅有最短直接关系的数据,可以通过shortestPath函数直接实现,比如我要找到Bacon Path和Meg Ryan的最短关系,就可以是:

代码语言:sql
复制
MATCH p=shortestPath(
  (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p

既然我们现在了解了基础的Neo4j的操作,那么我们还差调用的语言工具来完成我们全链路知识图谱自动生成,也就是通过Python来联通Neo4j数据库并能够完成从导入到自动化查询生成到展示的全流程搭建,那么下一章我们就来完成最后一道链路的打通。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Cypher Shell
    • 语法
    • 创建
      • 创建节点
      • 创建关系
    • 查询
      • Where
      • LIMIT
      • Between
    • 检索
      • 多关系检索
      • 检索路径限制
      • 最短路径检索
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档