Neo4j:基本的CQL

Stella981
• 阅读 343

上一篇:Neo4j:简介与初体验

Neo4j:基本的CQL

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界面使用起来很简单,界面如下:

Neo4j:基本的CQL

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:"李四"}) 

Neo4j:基本的CQL

创建节点u0到节点u1的关系friend。如果多次执行上面的语句,两个节点可以创建多个关系

Neo4j:基本的CQL

当然也可以创建反向关系(注意两条CQL语句关系箭头的方向不同)。

match (u0:User {name:"张三"}),(u1:User {name:"李四"}) create (u0)-[r:friend]->(u1)return u0,r,u1

Neo4j:基本的CQL

说明:有没有发现,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的节点,需要先删除他们的关系,再删除节点。如果我们直接删除有关系的两个节点,将会报如下的错:

Neo4j:基本的CQL

所以我们需要先删除两个节点之间的关系。

match (u:User {name:"张三"})-[r:friend]->(u1:User {name:"李四"}) delete r

Neo4j:基本的CQL

和上图对比,张三和李四有一个双向的关系,删除张三到李四的关系,只剩下李四到张三的关系,我们继续删除李四到张三的关系(注意箭头的指向):

match (u:User {name:"张三"})<-[r:friend]-(u1:User {name:"李四"}) delete r

Neo4j:基本的CQL

最后,我们才能删除节点

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='张三';

最后返回的结果是:

Neo4j:基本的CQL

上面所列举的增删改查语句,是比较基本的。并且语法不止一种,CQL的语法比较随意。当然,还有其他的操作,比如remove,union等操作,在此处就不一一举例,大家可以查阅相关资料。

实战

我们以苏轼一大家子举例,首先创建苏轼一大家子节点:

create(suxun:Person_{name:"苏洵",age:80,sex:"男"})

Neo4j:基本的CQL

根据上述排列,我们知道,苏洵是长辈,苏轼苏辙苏小妹属于同一辈份,苏孙是苏轼的儿子,苏重孙是苏轼的孙子。。。

然后我们创建关系:

match(p1:Person_),(p2:Person_)

Neo4j:基本的CQL

我们根据条件写出CQL语句:

1、筛选出子孙绵延四代的树干:

match(a)-[r1:Parent]->(b)-[r2:Parent]->(c)-[r3:Parent]->(d) return a,  b, c, d

Neo4j:基本的CQL

2、筛选出存在三代子孙的树干:

match(a)-[r1:Parent]->(b)-[r2:Parent]->(c) return a,  b, c

Neo4j:基本的CQL

看起来是一根树干,其实有两组数据

Neo4j:基本的CQL

3、筛选出以某个节点为顶点的三代子孙树干:

match(a:Person_{name:"苏洵"})-[r1:Parent]->(b)-[r2:Parent]->(c) return a,  b, c

Neo4j:基本的CQL

好了,本次的分享就到这里,谢谢大家。

本文分享自微信公众号 - OutOfMemoryError(backend_technology)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
2个月前
css问题
1、 在IOS中图片不显示(给图片加了圆角或者img没有父级) <div<img src""/</div div {width: 20px; height: 20px; borderradius: 20px; overflow: h
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录 问题 用navicat导入数据时,报错: 原因这是因为当前的MySQL不支持datetime为0的情况。 解决修改sql\mode: sql\mode:SQL Mode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。 全局s
小森森 小森森
2个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本 欢迎添加左边的微信一起探讨!项目地址:](https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n) \2. Bug修复更新日历 2. 情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意), \ \ 和 注意
晴空闲云 晴空闲云
2个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。 盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
1个月前
快速入门|使用MemFire Cloud构建React Native应用程序
> MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置 1、virsh edit centos7 找到“memory”和“vcpu”标签,将 <name>centos7</name> <uuid>2220a6d1-a36a-4fbb-8523-e078b3dfe795</uuid>
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序 select * from table_name order id desc; 2.按照指定(多个)字段排序 select * from table_name order id desc,status desc; 3.按照指定字段和规则排序 selec
Stella981 Stella981
1年前
Angular material mat
Icon Icon Name mat-icon code _add\_comment_ add comment icon <mat-icon> add\_comment</mat-icon> _attach\_file_ attach file icon <mat-icon> attach\_file</mat-icon> _attach\
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
#### 背景描述 # Time: 2019-01-24T00:08:14.705724+08:00 # User@Host: **[**] @ [**] Id: ** # Schema: sentrymeta Last_errno: 0 Killed: 0 # Query_time: 0.315758 Lock_
helloworld_34035044 helloworld_34035044
4个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。 uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid() 或 uuid(sep)参数说明:sep 布尔值,生成的uuid中是否包含分隔符'',缺省为
helloworld_28799839 helloworld_28799839
2个月前
常用知识整理
# Javascript ## 判断对象是否为空 ```js Object.keys(myObject).length === 0 ``` ## 经常使用的三元运算 > 我们经常遇到处理表格列状态字段如 `status` 的时候可以用到 ``` vue