“好事”文章推荐:BuildAdmin19:前端项目如何设计一个异步API请求模块
文章地址:https://cloud.tencent.com/developer/article/2469533
在前后端分离的架构中,后端负责封装api接口,前端负责请求api接口。我通常使用Springboot来开发后端,在前端项目中就要实现api请求模块。 那么前端如何请求这些后端接口呢,所以这边篇文章还是来封装一个前端的接口请求模块。
让我们来整理之前我们两章的内容思绪,第一章我们了解了知识图谱的基本概念和需要构建的步骤架构,第二章我们明确了要采用知识抽取的技术栈。目前再来回溯最初的架构图:
目前我们最主要的还是构建一个小型知识图谱,先建立一个基座方便我们后续进行不断拓展,现在这一章我们就开始进行使用Neo4j搭建一个小型知识图谱。
如果按照我文章系列章节来学习的话,上一章我们了解了Neo4j的基础操作,但是还没有正式开始对图数据库进行操作。也就是数据的增删改查是不了解的,从此一章我们来了解整个Neo4j图数据库的数据操作。
Cypher Shell是一个命令行工具,用于对Neo4j实例运行查询和执行管理任务。默认情况下,shell是交互式的,但也可以通过在命令行上直接传递Cypher或通过管道传输带有Cypher语句的文件(需要Windows上的PowerShell)将其用于脚本编写。它通过Bolt协议进行通信。
运行Cypher 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输入
:play movie-graph
根据引导我们可以创建电影图数据:
如果要查看返回数据的表视图,可以单击左侧的表图标:
如何查看结果也将取决于返回的数据。如果查询返回节点,则可以将数据视为图形。如果查询返回属性值,则只能将数据作为表查看
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
从GQL来看很容易看出语句结构:
CREATE (<节点名称>:<节点标签>{<节点键>:<节点值>})
两个节点创建关联关系的语句:
CREATE (Emil)-[:ACTED_IN {roles:["Emil"]}]->(TheMatrix)
上述这段语句也很好理解,具体的模版为:
CREATE <节点名称(客体)>-[:<关系类型> {<关系属性>:[<关系值>]}]->(<节点名称(主体)>)
点击关系链接可以看到:
我们现在想要查询一个Tom Hanks的节点,对标SQL帮助我们更好去记忆代码,查询语句可以为:
MATCH (tom:Person)
WHERE tom.name = "Tom Hanks"
RETURN tom
还可以使用表视图查看节点的属性:
查询语句和SQL很类似,将select替换为match即可,最后注意要加上RETURN <节点名称>。
比如我们想要查找电影名称为Cloud Atlas的电影:
接下来,我们想在图中找到10个人的名字。此代码查找图中的所有Person节点,但只返回其中10个节点的name属性值:
MATCH (people:Person)
RETURN people.name LIMIT 10
对于此查询,将返回属性值,只能以表的形式查看结果。那么现在我们想查询一定范围内的数据,也就是对标Between
MATCH (nineties:Movie)
WHERE nineties.released > 1990 AND nineties.released < 2000
RETURN nineties.title
到目前为止,已经在图中查询了节点。接下来需要获得检索相关节点,也就是相当于直接查表,和SQL的表连接查询类似,问题可以为:
比如我要列出Tom Hanks 的所有电影,想返回演员汤姆·汉克斯的Person节点,我们还想返回所有与汤姆·汉克斯有ACTED_IN关系的Movie节点。也就是说汤姆·汉克斯出演的所有电影:
MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies)
RETURN tom,tomHanksMovies
这里需要注意动作的执行者和动作的承受者电影演员是演出这个动作的执行者,所以是演员->出演->电影这个顺序,如果我们想要查询Cloud Atlas这部电影是由谁拍的时,电影<-演导<-导演这个顺序:
MATCH (cloudAtlas:Movie {title: "Cloud Atlas"})<-[:DIRECTED]-(directors)
RETURN directors.name
那么我们再试试复杂的检索,接下来,我们想找到汤姆·汉克斯出演的所有电影,并为检索到的每部电影找到出演该电影的人。
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)
RETURN tom, m, coActors
如果我们想在其中返回有关与Cloud Atlas电影之间关系的信息。需要找到相关节点,然后返回人员的姓名、关系类型以及该关系的属性:
MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"})
RETURN people.name, type(relatedTo), relatedTo
我们发现图数据展示是可以根据关系的逐层递进依次索引的,就好像遍历树的深度,在图里面含义也与其类似树的层级一样,也可以理解为树的高度为图的遍历深度。我们来看一个例子:
我们想找到图表中距离凯文·培根最多3跳的所有电影和/或人物:
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..3]-(hollywood)
RETURN DISTINCT bacon, hollywood
因为对象之间的关系是可以通过对象链接来逐层累计深入下去的,比如供应关系链,我直接购买了你的产品,其中就只有一层关系:
某一天你把你的东西挂在了闲鱼上,我是通过闲鱼来买你的东西的。那么关系就是:
这样就是有三层关系了,当然我们如果只想要查询我购买你的东西这条仅有最短直接关系的数据,可以通过shortestPath函数直接实现,比如我要找到Bacon Path和Meg Ryan的最短关系,就可以是:
MATCH p=shortestPath(
(bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"})
)
RETURN p
既然我们现在了解了基础的Neo4j的操作,那么我们还差调用的语言工具来完成我们全链路知识图谱自动生成,也就是通过Python来联通Neo4j数据库并能够完成从导入到自动化查询生成到展示的全流程搭建,那么下一章我们就来完成最后一道链路的打通。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。