基于电影知识图谱的智能问答系统(七) -- Neo4j语句那点事

上一篇:基于电影知识图谱的智能问答系统(六) -- 问题训练样本集敲定


       到目前为止,本系列文章快接近尾声了,本篇是该系列文章的倒数第二篇,本来想打算直接跳过进入最后一章的,但是感觉有必要再讲一下neo4j,博主的文章中不止一次介绍过neo4j的使用,但感觉还是不够细致,所以,借助着这个系列文章,再来捋一下neo4j语句的用法,希望给用惯了传统关系型sql语句的兄弟们一个喜欢上Cypher语句的契机!!!


       下面,我将一步步的创建节点、创建关系、创建索引、修改属性、删除属性,删除节点、删除关系、删除索引...etc

总结起来就是【数据的操作万变不离其宗】: 增删改查!!!

       

       数据模型参照:美国男子职业篮球联赛【NBA】



一、创建节点【create】


第一种方式:  merge(n:洛杉矶湖人)     == 节点不存在,则创建,存在,则忽略





第二种方式:  create(n:洛杉矶湖人)     == 不管节点存不存在,创建





效果就是,洛杉矶湖人这类的节点,一共被创建了两次,因此,查询的时候,会出现两个Node







虽然上面我们创建了两个节点,但是这两个节点除了系统给的唯一id外,没有其他属性,下面我就基于这两个节点,分别对它们进行“update”,赋予节点意义



二、修改节点的属性


(1)首先:查询ID等于21798的Node


match(n) where ID(n) = 21798 return n    ==  别忘了查询节点,最后要return n返回节点





(2)其次:给该Node添加三个属性,分别是label(节点标签名),height(身高),position(场上位置


neo4j查询节点用:match   == 相当于关系型数据库的select,相当于非关系数据库mongodb的find

neo4j修改节点属性用:set == 相当于关系型数据库的update...set...


直接接着上面的语句写set:


match(n) where ID(n) = 21798 set n.label='科比',n.height=198,n.position='得分后卫' return n


类似sql语句: update n set label = ‘科比’,height=198,position='得分后卫' where id = 21798


区别:关系型数据库如果字段不存在的话会报错,而NoSql数据库neo4j,如果属性字段不存在的话,就添加


执行后,效果如下:





(3)如果想删除节点的height属性该怎么做呢?


上面说过,设置【添加】属性用set,而删除属性在neo4j中用remove,比如移除点节点的身高属性做法如下


match(n) where ID(n) = 21798 remove n.height return n


执行语句,效果如下






(4)模糊查询:查询属性值label开头是“科”其余任意值的节点信息


match(n) where n.label=~'科*.' return n



执行语句效果如下:





三、创建带属性值的节点


我们使用create创建另一位湖人传奇巨星奥尼尔这个节点,语句如下:

create(n:洛杉矶湖人{label:'奥尼尔',height:216,position:'中锋'}) return n

效果如下:



注意:不要写成 如下这种方式的cypher语句






四、删除没有意义的节点


(1)我们先查出所有和湖人队有关的节点有哪些


match(n:洛杉矶湖人) return n





(2)删除节点id=21836的节点


neo4j中不管是删除节点还是删除关系,都是用delete命令进行删除,注意,删除哪个节点必须先查【match】出来:


match(n:洛杉矶湖人) where ID(n) = 21836 delete n


执行【回车键或者执行按钮】效果如下:






(3)这样一来,我们只保留了两个节点,一个是湖人队的科比,一个是巨无霸奥尼尔







五、创建关系


       由于关系不能独立存在【比如我吃米钱,如果只有吃这个关系,没有谁来吃,吃什么的话,你知道关系吃是什么玩意嘛,如果你说不出来,那我可以说出一万种这种关系的出处,偷笑】,而构成一条关系最基本的要素是要有两个对象,放在neo4j图库中就是,两个节点,一条边,才能称作是一个完整的关系。

       创建统一用create命令,而关系的创建,实际上和创建节点差不多,唯一区别就是,关系是有方向的,而且关系用‘[]’表示,而节点用'()'表示。

       下面我给目前尚存在的两个节点,科比和奥尼尔创建一条关系,关系的name叫“搭档”,这种关系,不区分方向,因此,无所谓谁是startNode,谁是endNode。


创建语句如下:


match(n),(b) where n.label='科比' and b.label='奥尼尔'
create(n)-[r:搭档{since:1996,des:'NBA史上最强OK组合',champion:3}]->(b) 
return n,r,b


解释一下:

1、首先匹配找到节点n和b,也就是科比和奥尼尔代表的节点Node

2、然后创建节点n到节点b的关系r,r有三个属性,一个是从哪一年开始since,一个是关系描述des,另一个是合作拿过的冠军数量champion

3、最后返回n,r,b 完整节点之间的关系结果,table数据如下,总过三列:







graph图效果如下:










六、修改关系属性


和修改节点的属性一样,修改关系的属性也用set,如修改id等于12513的关系的属性des为“小飞侠&大鲨鱼”的语句如下:


match(n)-[r]-(b) where ID(r) = 12513 set r.des='小飞侠&大鲨鱼' 
return n,r,b


效果图如下:








七、删除节点科比和奥尼尔之间的关系


删除统一用命令delete,和删除节点一样,删除关系的语句如下:


match(n)-[r]-(b) where n.label='科比' and b.label='奥尼尔'
delete r
return r


执行后,返回关系效果如下【此时关系已经删除】





如果此时,在查询科比和奥尼尔之间的节点关系会怎么样呢,我们来验证一把:






八、创建索引

语法:


CREATE INDEX ON :<label_name> (<property_name>)

为节点标签洛杉矶湖人基于属性label创建索引,语句如下



create index on:洛杉矶湖人(label)


索引都是喜忧参半,这里不再做过多的说明




九、删除索引

语法:


DROP INDEX ON :<label_name> (<property_name>)



删除上一步创建的索引,语句如下:







十、说明


       其实neo4j的cypher语句博主在初次写的时候那是相当的别扭啊,总是感觉查询和创建这块特别绕,语句怎么能那么写?后来慢慢在项目中用到了它,便有了时间好好斟酌其语法,几番折腾后,便对其语法越来越上手,后来感觉,查询是那么的简单,因为,不管你查什么,查的无外乎节点、关系、节点间的关系,用表达式表示就是:(n)-[r]-(b)


      结合表达式:  match(n)-[r] -(b)

      如果查询节点n                            就    return n

      如果查询关系r                             就    return r

      如果查询节点b                            就    return b

      如果查询节点n和b之间的关系r    就    return n,r,b

      如果查询带条件                          就    where n.x = x,r.xx = xx,b.xxx = xxx

      如果修改属性                             就     where.....   set ....

      如果删除属性                             就     where.....   remove .....

      如果删除节点或关系                   就     where.....   delete n 或者 delete r  或者 delete b 或者 delete n , r , b



终极篇:基于电影知识图谱的智能问答系统(八) -- 终极完结篇

  • 23
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【资源介绍】 毕业设计基于医疗知识图谱的智能问答机器人python源码+项目说明.zip 本项目是一个基于Neo4j数据库的医疗知识图谱智能问答机器人 在刘焕勇老师项目做的重构与增强 问答分为两个模块 基于知识图谱的问答和基于关键词的问答 基于知识图谱主要分为以下模块 * build_medicalgraph.py: 构建neo4j数据库 * question_analysis.py : 问题语义分析 * get_cql.py : 根据问题获取对应cql语句 * get_answer.py : 查询数据库并结合生成答案 ## 二.项目启动 1. 环境要求,neo4j数据库,python3,pycharm 2. 打开build_medicalgraph.py文件 修改信息包括neo4j数据库的ip地址,端口号,用户名和密码 运行最下面的main函数(数据量较大,可能会运行几十分钟) 3. 打开main.py文件 修改main函数中的端口号 4. 打开static下的index.html文件并打开右上角浏览器即可使用 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值