基于电影知识图谱的智能问答系统(七) -- 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



终极篇:未完待续....................

猜你喜欢

转载自blog.csdn.net/appleyk/article/details/80402519