上一篇:基于电影知识图谱的智能问答系统(六) -- 问题训练样本集敲定
到目前为止,本系列文章快接近尾声了,本篇是该系列文章的倒数第二篇,本来想打算直接跳过进入最后一章的,但是感觉有必要再讲一下neo4j,博主的文章中不止一次介绍过neo4j的使用,但感觉还是不够细致,所以,借助着这个系列文章,再来捋一下neo4j语句的用法,希望给用惯了传统关系型sql语句的兄弟们一个喜欢上Cypher语句的契机!!!
下面,我将一步步的创建节点、创建关系、创建索引、修改属性、删除属性,删除节点、删除关系、删除索引...etc
总结起来就是【数据的操作万变不离其宗】: 增删改查!!!
数据模型参照:美国男子职业篮球联赛【NBA】
第一种方式: merge(n:洛杉矶湖人) == 节点不存在,则创建,存在,则忽略
第二种方式: create(n:洛杉矶湖人) == 不管节点存不存在,创建
效果就是,洛杉矶湖人这类的节点,一共被创建了两次,因此,查询的时候,会出现两个Node
虽然上面我们创建了两个节点,但是这两个节点除了系统给的唯一id外,没有其他属性,下面我就基于这两个节点,分别对它们进行“update”,赋予节点意义
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
执行语句效果如下:
注意:不要写成 如下这种方式的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 :( )
索引都是喜忧参半,这里不再做过多的说明
语法:
DROP INDEX ON :( )
删除上一步创建的索引,语句如下:
其实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
终极篇:基于电影知识图谱的智能问答系统(八) -- 终极完结篇