创建一个学生节点(只有节点,没有属性)
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
参考链接
原文地址