上一篇:Neo4j:简介与初体验
Neo4j,作为一个存储图的数据库,与其他关系型、非关系型数据库一样,提供了很简单易用的增删改查语句。
CQL,Cypher查询语言。像Oracle数据库具有查询语言SQL,Neo4j用CQL作为查询语言。
作为CQL,它有如下特点:
1、它是Neo4j图形数据库查询语言
2、它是一声明性模式匹配语言(个人使用起来的感觉,像lambd表达式)
3、语法非常简单(个人感觉,语法能表现出很清晰的图结构)
我们启动Neo4j并登录Neo4j提供的UI界面(可以参考这个文章启动和登录Neo4j:简介与初体验 )。
本节,教大家如何使用最基本的CQL语言,完成最基本的增删改查。Neo4j常用的命令如下:
命令
含义
对比MySQL
create
创建节点
insert插入数据
match
查询
select
return
返回数据
where
条件查询
where
delete
删除关系、节点
delete
order by
排序
order by
set
修改
update
另外,由于Neo4j是Java开发的,所以支持Java的8大基本数据类型,再加一个String类型
数据类型
说明
boolean
布尔:true or false
byte
用于表示8位整数
short
用于表示16位整数
int
用于表示32位整数
long
用于表示64位整数
float
用于32位浮点数
double
用于64位浮点数
char
用于表示16位字符串
String
用于表示字符串
Neo4j提供的Web UI界面使用起来很简单,界面如下:
HelloWorld走起来~~
为了让大家尽快熟悉使用语法,我在这里分别用CQL和SQL对照着写。
创建节点:
基本语法:create (node:Label {属性1:属性值1,属性2:属性值2})
CQL:
create (u0:User {name:"张三",age:18}) create (u1:User {name:"李四",age:19}) return u0,u1
SQL:
create table user(name varchar(20),age int);
说明:和关系型数据库不同的是,Neo4j写入数据时,不需要先创建schema。上述CQL的含义是:在Label名是User的标签下创建两个节点,u0和u1,以及他们的属性name和age,并返回。
查询:
CQL:
match (u:User) return u;
SQL:
select * from User;
说明:这是最简单的条件查询,使用match、where和return关键字。从标签名为User的Label(从表名为User的表)中查数据。
创建关系:
和关系型数据库不同的是,Neo4j的node和node间是有关系的,我们可以把它理解成MySQL中的外键,但是还是有区别的哦。
match (u0:User {name:"张三"}),(u1:User {name:"李四"})
创建节点u0到节点u1的关系friend。如果多次执行上面的语句,两个节点可以创建多个关系
当然也可以创建反向关系(注意两条CQL语句关系箭头的方向不同)。
match (u0:User {name:"张三"}),(u1:User {name:"李四"}) create (u0)-[r:friend]->(u1)return u0,r,u1
说明:有没有发现,CQL的语法和图的数据结构很类似,基本语法是:
match (node1),(node2) create node1-[r:relation]->node2
可以理解为,查出两个节点node1和node2,创建从node1到node2的关系r。
删除:
基本语法:
match (u:User) delete u;
通过match查询出结果集,然后delete u。
需要注意的是:
Neo4j节点与节点的关系,和MySQL两张表中数据的外键很相似,在MySQL中,如果两张表之间有外键关联,我们不能直接删除主键表的数据,需要先删除外键表的数据后才能删除主键表。所以Neo4j中,我们不能直接删除两个有relationship的节点,需要先删除他们的关系,再删除节点。如果我们直接删除有关系的两个节点,将会报如下的错:
所以我们需要先删除两个节点之间的关系。
match (u:User {name:"张三"})-[r:friend]->(u1:User {name:"李四"}) delete r
和上图对比,张三和李四有一个双向的关系,删除张三到李四的关系,只剩下李四到张三的关系,我们继续删除李四到张三的关系(注意箭头的指向):
match (u:User {name:"张三"})<-[r:friend]-(u1:User {name:"李四"}) delete r
最后,我们才能删除节点
match (u:User) where u.name='张三' delete u;
和下面的SQL含义相同
delete from User where name='张三'
排序:
match (u:User) return u.name,u.age order by u.age desc;
和下面的SQL含义相同:
select name,age from User order by age desc;
Set修改:
match (u:User {name:"张三"}) set u.name = '张三丰' return u;
和下面的SQL含义相同:
update User set name='张三丰' where name='张三';
最后返回的结果是:
上面所列举的增删改查语句,是比较基本的。并且语法不止一种,CQL的语法比较随意。当然,还有其他的操作,比如remove,union等操作,在此处就不一一举例,大家可以查阅相关资料。
实战
我们以苏轼一大家子举例,首先创建苏轼一大家子节点:
create(suxun:Person_{name:"苏洵",age:80,sex:"男"})
根据上述排列,我们知道,苏洵是长辈,苏轼苏辙苏小妹属于同一辈份,苏孙是苏轼的儿子,苏重孙是苏轼的孙子。。。
然后我们创建关系:
match(p1:Person_),(p2:Person_)
我们根据条件写出CQL语句:
1、筛选出子孙绵延四代的树干:
match(a)-[r1:Parent]->(b)-[r2:Parent]->(c)-[r3:Parent]->(d) return a, b, c, d
2、筛选出存在三代子孙的树干:
match(a)-[r1:Parent]->(b)-[r2:Parent]->(c) return a, b, c
看起来是一根树干,其实有两组数据
3、筛选出以某个节点为顶点的三代子孙树干:
match(a:Person_{name:"苏洵"})-[r1:Parent]->(b)-[r2:Parent]->(c) return a, b, c
好了,本次的分享就到这里,谢谢大家。
本文分享自微信公众号 - OutOfMemoryError(backend_technology)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。