【数据库】neo4j-CQL(Cypher Query Language)
一、认识neo4j
1.1 了解数据
看下在neo4j上查询出的数据是怎样的,点击左侧的四个tab可切换不同形式的数据呈现方式
-
Graph:以图形展示数据

-
Table:以json形式呈现数据

-
Text和Code就不截图了,和Table看起来差不多
1.2 一些基本概念
-
节点
在Graph中,一个小圆点就是一个节点
可以将标签理解为类,节点理解为类实例化的对象 -
标签
标识节点属于什么类别,一个节点可以有多个标签,不同类型的标签在Graph中会以不同颜色呈现;
在Graph中,点击节点,看到的这个带圆角背景的,就是节点的标签:

在Table视图中,以labels字段表示标签:

-
关系
在Graph中的灰色连线就是两个节点间的关系,连线上的文字是关系的类型(点击关系 可查看其属性),箭头表示关系方向;
两个节点之间可以有多种关系,有多少类型的关系就有多少条线进行连接

-
属性
节点和关系都能带多个属性 -
类型
标识关系类型的 -
路径
A节点到B节点,经历的关系和节点就是A到B的路径
A到B之间经历的关系的层数,为路径的长度
二、常用CQL语法及示例
2.1 增
2.1.1 CREATE
语法:
CREATE (:标签<:标签…> {节点属性})
示例:
create
(a:西游记:西天取经组合:人 {name:“唐僧”,skills:[“百分百被抓”,“紧箍咒”,“碎碎念”]}),
(b:西游记:西天取经组合:马:龙 {name:“白龙马”,skills:[“龙马来回变”]}),
(c:西游记:西天取经组合:猴子{name:“孙悟空”,skills:[“打妖怪”]}),
(d:西游记:西天取经组合:猪{name:“猪八戒”,skills:[“吃”]}),
(e:西游记:西天取经组合:人{name:“沙僧”,skills:[“扛行李”]})
return a,b,c,d,e

语法:
CREATE (节点1) -[:关系类型 {关系属性}]-> (节点2)
示例:
match
(a {name:“唐僧”}),
(b {name:“白龙马”}),
(c {name:“孙悟空”}),
(d {name:“猪八戒”}),
(e {name:“沙僧”})
create
(a) -[r1:师徒 {sort:1}]-> (c),
(a) -[r2:师徒 {sort:2}]-> (d),
(a) -[r3:师徒 {sort:3}]-> (e),
(a) -[r4:师徒 {sort:4}]-> (b)
return a,b,c,d,e

语法:
CREATE INDEX ON :标签名(属性)
示例:
create index on :西游记(name)
:schem 可查看创建的索引和约束
语法:
CREATE CONSTRAINT ON (变量名:标签) ASSERT 变量名.属性 IS UNIQUE
示例:
create constraint xy_name_unique on (m:西天取经组合)
assert m.name is unique
2.1.2 MERGE
不存在则新增,已存在则不进行任何操作
语法:把CREATE改成MERGE即可
如果目标不存在(本次操作是新增的),则进行MERGE后,还要执行ON CREATE之后的操作
语法:
MERGE XXX
ON CREATE
需要进行的额外操作
示例:
merge (m:人 {name:“张三”})
on create
set m.operation = ‘新增’
如果目标已存在(本次操作没有新增),则进行MERGE后,还要执行ON MATCH之后的操作
语法:
MERGE XXX
ON MATCH
需要进行的额外操作
示例:
merge (m:人 {name:“张三”})
on create
set m.operation = ‘新增’
on match
set m.operation = ‘更新’
return m
2.2 查
2.2.1 MATCH
条件筛选有两种形式,不带where和带where
示例:查找唐僧
match
(a {name:“唐僧”})
return a
match
(a)
where a.name=“唐僧”
return a
2.2.2 OPTIONAL MATCH
match和optional match的区别在于:match没查到就啥也不返回,optional match会返回null
match示例: 
optional match示例:

2.2.3 ORDER
与SQL一样,ORDER BY XX ASC/DESC
order需要在return之后,否则会报错
示例:
match(n:西天取经组合)
return n
order by n.name
2.2.4 SKIP LIMIT
和mysql中的limit offset效果一样,不过neo4j中 skip需要在limit之前(如果有同时用skip和limit)
示例:
match(n:人)
return n
order by n.name desc
limit 10 skip 10
2.2.5 UNION
同sql一样,支持UNION和UNION ALL
neo4j中,被UNION连接的对象需要设置相同的别名,否则会报语法错误
示例:
match (n {name:“白龙马”})
return n.name as name
UNION ALL
match (m {name:“白龙马”})
return m.name as name
2.2.6 数据筛选
2.2.1的示例,就是精确查找
neo4j支持正则匹配,以=~表示正则匹配
示例:
match
(a)
where a.name=~".+僧"
return a
neo4j还支持CONTAINS、IN之类的筛选,想了解更多可以看看官方文档
2.2.7 跨关系查询(指定路径长度)
语法:
match (a) -[:关系*m…n]- (b)
*m…n表示跨m~n层关系,*m表示跨m层关系
示例1:查找与孙悟空有跨任意两层关系的节点
match
(n {name:“孙悟空”}) -[*2]-(m)
return m,n
示例2:查找与孙悟空有跨1或2层师兄弟关系的节点
match
(n {name:“孙悟空”}) -[:师兄弟*1…2]-(m)
return m,n
2.3 改
2.3.1 SET
示例:
match
(a {name:“唐僧”})
set a.name=“唐三藏”
return a
示例:
match (a {name:“唐三藏”})
set a:光头
return a

示例:
match (n {name:“光头强”})
removen:大头
setn:光头
return n


2.4 删
2.4.1 REMOVE
示例:
match (n {name:“白龙马”})
remove n.skills
return n
示例:
match (n {name:“孙悟空”})
remove n:猴子
return n
2.4.2 DELETE
示例:
match (n {name:“光头强”})
delete n
示例:
match
(n {name:“唐三藏”}) -[r]-(m {name:“孙悟空”})
delete r
return m,n

2.4.3 DETACH DELETE
使用delete删除节点时,如果该节点与其他节点有关系,是无法删掉的,可使用DETACH DELETE删除节点及与其相关的所有关系
示例:
match
(n {name:“唐三藏”})
detach delete n
2.4.4 DROP
示例:
drop index on :西游记(name)
更多推荐


所有评论(0)