neo4j入门到精通——2、Cypher语言

一、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
原创文章 19 获赞 16 访问量 2438

猜你喜欢

转载自blog.csdn.net/qq_42778289/article/details/106119933
今日推荐