上一篇文章我们主要对Neo4j做了简单介绍以及安装部署,这一章主要是讲解Neo4j如何使用。
※ 概念
Neo4j只要是用CQL作为查询语言,就像Oracle数据库一样使用SQL作为查询语言。CQL有几个关键名词:节点、关系、标签、属性
节点对应图上面一个个的小圈圈,它是一个实体。人名,车名,桌椅,一切都可以做成节点。节点的标签表明它归属于哪个节点类。
关系对应图上的线,它由三元组构成:(节点A,关系,节点B)。关系也有自己的标签,标签表明它归属于哪个关系类。
标签就相当于SQL中表的概念,如果我们match某个标签,那返回的就是这个标签下所有的节点,跟我们用SQL去查某张表是一个道理。
既然标签就相当于表,如果它是表,就应该有自己的表字段,所以节点或者关系的属性值,就相当于表字段。
当你理解了CQL与SQL的概念对应关系之后,就可以玩起Neo4j了。
不同点:
概念不一样。CQL一个节点对应到SQL就是一条记录,同样一条关系,对应到SQL也是一条记录。CQL的节点和关系都有标签,相当于是SQL中表的概念。一条记录可能存放在A表,也可能存放在B表。因此在CQL中,一个节点或者关系也都会有多个标签。标签有自己的属性,属性的名相当于SQL中的字段名,属性值相当于SQL中的字段的值
关键词不一样。CQL中的return对应SQL中的select,关键词不一样都表示返回满足条件的记录。SQL中的关键词from后跟着表名表示查询的数据来源哪个表,到了CQL中变成match,match后跟着要查找的标签。
语法顺序不一样。CQL的return,create,delete操作都是在最后,而SQL这些操作都是在前面。
相同点:
语法通俗易懂。我们可以对比发现,不管是CQL还是SQL它们的写法都很简单,且人性化、可读性都很高。
※ 特殊符号说明
() 表示节点
{} 表示标签
-[:]-> 表示关系
※ 特殊关键字说明
CREATE,用于创建节点、关系、索引
MATCH语句用指定的模式检索数据库
WHERE在MATCH或者OPTINAL MATCH语句中添加约束,或者与WITH一起使用来过滤结果。
OPTINAL MATCH语句用于搜索模式中描述的匹配项,对于找不到的项用null代替。
※ 应用背景:
为了能够更好的学习Neo4J语法,我们以电视剧【琅琊榜】的关系图数据为例,先模拟建立实体表(此次只为了方便记忆而已,跟Neo4j无关),再用CQL语法写入到Neo4j中
(一)人员基本信息表:
姓名 身份证号码 性别
梅长苏 A 男
蒙挚 B 男
蒙浅雪 C 女
萧庭生 D 男
萧平章 E 男
萧景炎 F 男
萧平旌 G 男
黎老堂主 H 男
林溪 I 女
(二)人员关系表:
从节点 到节点 关系
A B 朋友
A D 师徒
A F 朋友
B C 孙女
C E 夫妻
D E 父子
D F 养父子
D G 父子
D H 朋友
F G 兄弟
G I 夫妻
(三)常规操作
创建节点
语法:CREATE ( <node-name>:<label-name> {
<Property1-name>:<Property1-Value>,<Propertyn-name>:<Propertyn-Value>})
实例: CREATE(p:Person{
name:'梅长苏',code:'A',sex:'男'})
CREATE(p:Person{
name:'蒙挚',code:'B',sex:'男'})
其他补充:
现有节点添加/修改 属性:MATCH (p:Person{
name:'梅长苏'}) set p.sex='未知
创建关系
语法:
现有节点新关系:MATCH (:),(:) CREATE ()-[:]->()
新节点新关系:CREATE(:{})-[:{}]->(:{})
实例: MATCH(p:Person{name:'梅长苏'}),(p1:Person{name:'蒙挚'}) CREATE(p)-[r:朋友]->(p1)
CREATE(p:Person{name:'萧庭生'})-[r:父子]->(p1:Person{name:'萧平章'})
查询
语法:MATCH (<node-name>:<label-name>)RETURN <node-name>.<property1-name>
实例:
【普通查询】
查询整个图形数据库:match(n) return n;
查询Person类型的所有数据:match (p: Person) return p;
查询名字等于【梅长苏】的人:
写法一:match (p: Person {
name:'梅长苏'}) return p;
写法二:match (p:Person) where p.name='梅长苏' return p;
【关系查询】
查询【梅长苏】的朋友的名字:Match ( p1: Person {
name:'梅长苏'} )-[r:朋友]->(p2) return p2.name
查询和【梅长苏】有关系的人:Match ( p1:Person {
name: '梅长苏'}) -[r:朋友]-(p2:Person ) return p2
【层级查询】
查询第二层的节点:Match (start:Person {
name:’梅长苏’})-[:gift*2..2]->(end:Person ) return end
查询第一层和第二层的节点:Match (start:Person {
name:’梅长苏’})-[:gift*1..2]->(end:Person ) return end
按级次查询出所有直接或间接获得过小明的礼物的人:Match (start:Person {
name:’梅长苏’})-[:gift*]->(end:Person ) return end
【其他查询】
查询标签(Person)中性别为男的一共有多少节点(人):
Match (n:Person) where n.sex=男 return count(n)
Match (n:Person{
sex:’男’}) return count(n)
Match (n:Person) return count(n.sex=男)
查询标签(Person)中的10个节点(人):Match (n:Person) return n limit 10
查询标签(Person)中所有的不同的name :Match (n:Person) return distinct(n.name)
根据标签(Person)中的name 排序:
Match(n:Person) return n order by name (默认升序)
Match(n:Person) return n order by name asc (升序)
Match(n:Person) return n order by name desc (降序)
判断节点是否存在 name这个属性:Match (n) where exists(n.name) return n
查询name以‘蒙’开头的节点:Match (n) where n.name starts with ‘蒙’ return n
查询name以‘萧’结尾的节点:Match (n) where n.name ends with ‘萧’ return n
查询name中含有 ‘萧’的节点:Match (n) where n.name Contains ‘萧’ return n
删除
语法:match (n) detach delete
实例:
删除所有 :match (n) detach delete n
删除指定节点:match (n:Person{
name:'梅长苏'}) detach delete n
删除指定节点属性: match (n:Person{
name:'梅长苏'}) remove n.sex
删除指定关系: match (a:Person {
name:"梅长苏"})-[r:朋友]-(b:Person {
name:"蒙挚"}) delete r
修改
修改关系名:
MATCH (n:Person {
name:"林溪"})-[r:父子]->(m:Person {
name:"萧平旌"})
CREATE (n)-[r2:夫妻]->(m)
SET r2 = r
WITH r
DELETE r