文章目录
一、Cypher简介
“Cypher”是一个描述性的类Sql的图操作语言。相当于关系数据库的Sql。其语法针对图的特点而设计,非常方便和灵活。
Cypher是一个申明式查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询。
Cypher通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字,如:like和order by是受SQL的启发。正则表达式匹配实现模仿Scala 语言。
图数据库的一些基本概念
Label: 标签,可以对应理解为关系DB里的表;
节点Node:可以对应理解为表里的每行数据,包含多个属性(列);
关系Ralition : 边,也可以有属性,大小写区分。其他均不区分大小写。
二、增删改查
1、增
create
create (n:Person {id:'20140101',name:'王五',age:30,card:123456})
相当于关系Sql的:
Create table Person(
id varchar2,
name varchar2,
age number,
card number );
Insert into Person values(‘20140101’,’王五’,30,123456);
1、创建带属性的实体和关系
create (p:Person{name:"李四",age:"20"})-[:fear{level:1}]->(t:Tiger{type:"母老虎"})
2、给没有关系的实体创建关系
match (n:Person{name:"张三"}),(m:Person{name:"王五"}) create (n)-[f:friend]->(m) return f
merge
merge 如果关系已有则返回(不会再次创建),没有则创建;而 create 不管有没有都会创建
match (n:Person{name:"张三"}),(m:Person{name:"王五"}) merge (n)-[l:lover]->(m) return l
2、删
delete
DELETE操作用于删除节点和relation。
1、删除Person和Tiger对象之间的关系[f:fear]
match (n:Person{name:“李四”})-[f:fear]->(t:Tiger) delete f
2、删除李四
match (n:Person{name:“李四”}) delete n
3、关系和对象全删
match (n:Person{name:“李四”})-[f:fear]->(t:Tiger) delete n,f.t
remove
REMOVE操作用于删除标签label和属性。
Remove label 等同于drop table
1、删除label
MATCH (n:Test) remove n:Test
3、改
set
Cypher语法中没有Update,用set代替。set操作属性时,没有的属性会给对象加上改属性;对象已有该属性的话就会对属性进行修改。
1、给Tiger加上Animal标签
match (t:Tiger) where id(t)=21 set t:Animal return t
2、给Animal加上年龄,为20
match (a:Animal) where id(a)=21 set a.年龄=20 return a
3、修改年龄为30
match (a:Animal) where id(a)=21 set a.年龄=30 return a
4、查
match
match
(node) - [relationship] -> (node) //查询一个实体(node) - 通过什么关系[relationship] -> 到另外一个实体(node)
where
(node | relationship) //where条件,和mysql类似,可以限制node,也可以限制relationship
return
(node | relationship) //返回值
常见的复杂查询
1、查询姓名叫"王某某"的三度内的朋友关系
match (p:Person)-[:friend_of]-(p1:Person)-[:friend_of]-(p2:Person) where p.name="王某某" return p,p1,p2
2、查询姓名叫"王某某"的三度内有关系的人有哪些(不管啥关系都行)
match (p:Person)-[]-(p1:Person)-[]-(p2:Person) where p.name="王某某" return p,p1,p2
3、某两个人之间的最短关系路径
match (p1:Person{name:"张三"}),(p1:Person{name:"李四"}),p=shortestpath((p1)-[*..10]-(p2)) return p
4、 查询没有关联关系的节点
match(x) where not (x)-[]-() return x
5、查询关系次数为6次的对象和关系
MATCH p=()-[r:relation]->() where r.count=6 return p
三、一些其他的查询条件
order by 排序
同关系sql:
–反序
MATCH (n:Person) RETURN n order by n.id,n.name desc LIMIT 25
–正序
MATCH (n:Person) RETURN n order by n.id LIMIT 25
limit和skip
limit:显示多少行,最前边开始
skip:跳过前多少行
MATCH (n:Person) RETURN n order by n.id desc skip 2 LIMIT 25
union和union all
同关系sql:
union:把多段Match的return结果 上线组合成一个结果集,会自动去掉重复行;
union all:作用同union,但不去重;
MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all
MATCH (n:Person) where n.id=‘erzi’ RETURN n.id,n.age
in语法
MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id in ['erzi','bozi','baba'] RETURN n.id,n.age
四、索引,执行计划,唯一约束
索引 index
创建索引:
create index on :Person(id); // 给Person节点的id创建索引
删除索引:
drop index on :Person(id);
关于索引的注意事项:
1、根据查询需要,把查询多的字段建索引;
2、不需要给索引起名称,只需要设置索引字段即可;
3、通过该字段的查询都走索引。
where
in
substring
执行计划 explain
用法:
explain match 语句…
唯一约束 constraint
给某一属性设置唯一约束:
CREATE CONSTRAINT ON (a:Person) ASSERT a.id IS UNIQUE
删除唯一约束:
drop CONSTRAINT ON (a:Person) ASSERT a.id IS UNIQUE
来源:oschina
链接:https://my.oschina.net/u/4269854/blog/4282100