neo4j中的CQL语句

创建一个学生节点(只有节点,没有属性)

create(s:Student)

创建一个具有属性的节点

create(s:Student{id:1000,name:"张三",age:18,sex:1})

Neo4j 使用的是match...return...命令进行查询,就类似MySql中的select
查询全部学生并返回

match (s:Student) return s

2.查询全部或者部分字段
只需要把要展示的字段以节点名 + 点号 + 属性字段 拼接即可,如下:

match (s:Student) return s.id,s.name,s.age,s.sex

3.查询满足年龄age等于18的学生信息

match (s:Student) where s.age = 18 return s.id,s.name,s.age,s.sex

4.查询出所有的男生(sex=1)并按年龄倒序排序

match (s:Student) where s.sex=1 return s.id,s.name,s.age,s.sex order by s.age desc

5.查出名字不为null,且按性别分组
这里要注意一点,CQL中的分组和SQL是所有差异的,在CQL中不用显示的写group by分组字段,
由解释器自动决定:即未加聚合函数的字段自动决定为分组字段

match (s:Student) where s.name is not null return s.sex,count(*)

6.union联合查询(查询性别为男或者女的,且年龄为19岁的学生)

match(s:Student) where s.sex=1 and s.age=19 return s.id,s.name,s.sex,s.age union
match(s:Student) where s.sex=0 and s.age=19 return s.id,s.name,s.sex,s.age

有union,当然也有 union all,这两个的区别和SQL中也是一样的。

  • union:对两个结果集进行并集操作,不包括重复行;
  • union all:对两个结果集进行并集操作,包括重复行;

7.分页查询(每页4条,查询第3页的数据)

match(s:Student) return s.id,s.name,s.sex,s.age skip 8 limit 4

上面CQL中的skip表示跳过多少条,limit表示获取多少条。每页4条,查询第三页的数据,
也就是跳过前8条,查询4条,或者说从第8条开始,不包括第8条,然后再查询4条。

8.in操作(查询id为10001和10005的两个数据)

match (s:Student) where s.id in [10001,10005] return s.id,s.name,s.sex,s.age

需要注意的是,这里 用的是中括号,和SQL中是有区别的。

三、增加关系
上面我们介绍了增加单个节点和查询的知识点。这里我们介绍下增加关系。为了存在关系,我们先创建一个老师节点。

创建一个教语文的年龄为35岁的男的王老师:

create (t:Teacher{id:20001,name:"王老师",age:35,sex:1,teach:"语文"}) return t

1.假设王老师所教的班级有3个学生:张三、李四、王五,这里我们就要创建王老师 和 3个学生的关系,注意,这里是为两个现有节点创建关系。

match (t:Teacher),(s:Student) where t.id=20001 and s.id=10001
create (t)-[teach:Teach]->(s)
return t,teach,s

不难发现,创建关系的语法如下:

match (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) 
where <condition>
create (<node1-label-name>)-[<relationship-label-name>:<relationship-name>]
	->(<node2-label-name>) 

或者

match (<node1-label-name>:<node1-name>),(<node2-label-name>:<node2-name>) 
where <condition>
create (<node1-label-name>)-[<relationship-label-name>:<relationship-name>
       {<relationship-properties>}]->(<node2-label-name>) 

node1-name表示节点名称,label1-name表示标签名称
relationship-name表示关系节点名称,relationship-label-name表示关系标签名称
node2-name表示节点名称,label2-name表示标签名称

老师和学生的关系增加了,我们查询下:

match (t:Teacher)-[teach:Teach]-(s:Student) return t,teach,s

2.我们给广东和深圳创建关系,深圳是属于广东省的。但是并没有广东省份节点和深圳市节点,
没错,我们就是为两个不存在的节点创建关系。

create (c:City{id:30000,name:"深圳市"})-[belongto:BelongTo{type:"属于"}]->(p:Province{id:40000,name:"广东省"})

我们查询下我们创建的深圳和广东的关系。

match (c:City{id:30000,name:"深圳市"})-[belongto:BelongTo{type:"属于"}]->(p:Province{id:40000,name:"广东省"}) return c,belongto,p

为两个不存在的节点创建关系的语法如下:

create (<node1-name>:<label1-name>
	{<property1-name>:<property1-Value>,
	<property1-name>:<property1-Value>})-
[(<relationship-name>:<relationship-label-name>{<property-name>:<property-Value>})]
->(<node2-name>:<label2-name>
	{<property1-name>:<property1-Value>,
	<property1-name>:<property1-Value>})

当然,属性都非必填的,只是为了更加准确。

如果我们要查询Neo4j中全部的关系需要怎么写CQL呢,如下:

match (a)-[b]-(c) return a,b,c

三、修改
Neo4j中的修改也和SQL中的是很相似的,都是用set子句。和es一样,Neo4j CQL set子句也可以向现有节点或关系添加新属性。

通过上面的查询,我们已经熟记了学生张三的年龄是18岁,2020年了,张三也长大了一岁,所以我们就需要把张三的年龄改为19。

match (s:Student) where s.name="张三" set s.age=19 return s

四、删除
Neo4j中的删除也和SQL中的是很相似的,都是delete,当然,除了delete删除,还有remove删除。

1.删除单个节点

这里以删除学生节点中没有属性的来举例:

先查询下学生中没有属性的节点

match (s:Student) where s.name is null return s 

然后我们再删除这个节点:

match (s:Student) where s.name is null delete s 

2.删除带关系的节点

这里我们以删除广东和深圳的关系来举例:

match (c:City{id:30000,name:"深圳市"})-[belongto]->(p:Province{id:40000,name:"广东省"}) return c,belongto,p

这个时候是有数据的。

然后我们执行下面的删除CQL,把上面的查询CQL中的return 改为 delete哦:

match (c:City{id:30000,name:"深圳市"})-[belongto]->(p:Province{id:40000,name:"广东省"}) delete c,belongto,p

3.删除全部节点已经关系

这里这个CQL主要用作测试的,生产环境可不要执行,否则,真的是从删库到跑路了~

match (n) detach delete n

这个CQL就不演示了。

4.删除节点或关系的现有属性

可以通过remove来删除节点或关系的现有属性。

例如,我们删除学生李四节点中的sex属性:

match (s:Student{id:10001}) remove s.sex

参考链接
原文地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值