1.简介
Cypher是一种声明式图数据库查询语言,它具有丰富的表现力,能高效地查询和更新图数据。具有以下特点:
- 是一种声明性模式匹配语言
- 遵循SQL语法
- 的语法是非常简单且人性化、可读的格式
语法详情请看博主其他博客:
一、cypher插入语法
二、 cypher查询语法
三、cypher通用语法
2.模式
使用模式可以描述你期望看到的数据的形状,当用模式描述一个形状的时候,Cypher将按照模式来获取相应的数据。
模式类型 | 语法 | 含义 |
---|---|---|
节点(点) | (n) | 节点使用一对圆括号表示,然后中间含一个名字 |
关系(边) | (a)->(b) ,(a)<-(b) ,(a)-(b) | 使用箭头来表达两个节点之间的关系,不关心关系的方向,则箭头的头部可以省略 |
标签 | (a:User) | |
属性 | (a {name:'v1',sport:'s1'}) | 使用键值对的映射结构来表达,然后用大括号包起来 |
变长模式匹配:
描述指定长度的关系,描述了三个节点两个关系:
(a)-[*2]->(b)
# 等价于(a)-->()-->(b)
长度范围也可以指定,如最短为3,最长为5:
(a)-[*3..5]->(b)
至少三个关系:
(a)-[*3..]->(b)
最多5个关系:
(a)-[*..5]->(b)
任意长度的关系:
(a)-[*]->(b)
图数据库与关系型数据库的类比:
图数据 | 关系型数据库 |
---|---|
点 | 表 |
点标签 | 表名 |
点属性 | 表字段 |
点数据(标签+属性键值对) | 表的一行数据 |
相同标签的点数据 | 表的所有数据 |
关系 | 常用一列专门来描述(如树结构) |
3.变量
当需要引用模式(pattern)或者查询的某一部分的时候,可以对其进行命名。针对不同部分的这些命名被称为变量。
match (n)-[r]->(b) return b # 这里的n和b和r就是变量
4.关键字
关键字大小写不敏感,变量名大小写敏感,语法关键字主要分为三类:
4.1.插入关键字:(详细讲解)
关键字 | 含义 |
---|---|
create | 创建节点或关系 |
merge | 匹配不到则创建 |
set | 更新节点的标签以及节点和关系的属性 |
delete | 删除土元素(节点、关系、路径) |
remove | 删除图元素的属性和标签 |
foreach | cypher提供的一种列表遍历工具,主要用来做增删改 |
create unique | 相当于match和create的混合体 (尽可能地匹配,然后创建未匹配到的创建) |
load csv(import) | 用于导入csv文件 |
4.2.查询关键字:(详细讲解)
关键字 | 含义 |
---|---|
match | 匹配(查询)已有数据 |
optional match | 与match类似,只是如果没有匹配上,则将使用null作为没有匹配上的模式。类似于SQL中的外连接。 |
where | 类似SQL中的添加查询条件 |
start | START语句仅用于访问neo4j遗留的索引(节点或者关系的索引) |
aggregation(count、sum、avg…) | 聚合函数 |
4.3.通用关键字:(详细讲解)
关键字 | 含义 |
---|---|
return | 返回结果 |
order by | 排序,紧跟RETURN或者WITH |
limit | 限制输出的行数 |
skip | 从哪行开始返回结果 |
with | 向后面的语句传递指定结果 |
unwind | cypher提供的一种列表遍历工具,结合case等语法可以写出许多复杂的查询,尤其是对于路径查询的处理 |
union/union all | 并集(去重/不去重) |
call | 执行子查询并返回结果,版本4.x后支持 |
5.数据类型
Cypher支持的类型系统分为三类:属性类型,结构类型和复合类型。
5.1.属性类型
名称 | 类型 |
---|---|
数值 | int,float… |
字符 | string |
布尔 | Boolean |
空间 | Point |
时间 | Date,Time,LocalTime,DateTime,LocalDateTime和Duration |
5.2.结构类型
名称 | 类型 |
---|---|
节点(点) | Node,包含Id**, Labels, Map类型 |
关系(边) | Relationship,包含Type, Map, Id类型 |
路径 | Path,节点和关系的序列 |
5.3.复合类型
名称 | 类型 |
---|---|
列表 | List |
字典 | Map,组成为(key, value)对,key是字符类型,value可以是属性类型, 结构类型和符合类型 |
6.运算符
neo4j中运算符与关系型数据库差不多,不过也有不同和需要注意的点
6.1.比较运算
=, <>, <, >, <=, >=, is null, is not null
- 不同类型不能比较,例如点和边和路径不能互相比较
- List比较时,只有所有对应元素都相等列表才相等
- Map比较时,只有Map的键相等且其指向的值也相等时才相等
- 路径比较时,只有路径上所有的点和边都相等时才相等
- 和null比较的结果还是null
6.2.字符串比较运算
- start with: 匹配前缀
- ends with: 匹配后缀
- constant: 字符串包含
6.3.字符串运算
- 字符串连接: “+”
- 正则匹配: “=~”
6.4.时间运算
- +, -: Duration与时间实例/Duration
- *, /:Duration与一个数字
6.5.List运算
- List链接: +
return [1,2,3,4,5]+[6,7] as myList
- List判断e是否在List中: e in List
with [2, 3, 4, 5] as numberList unwind numberList AS number with number where number in [2, 3, 8] return number
- 动态获取其中元素: []
with ['Anne', 'John', 'Bill', 'Diane', 'Eve'] as names return names[1..3] as result
6.6.Map运算
- 静态获取Map的value: 使用点运算符
with {name: 'Anne', age: 25 } as n return n.name
- 动态获取Map的value: 使用[]
with {name: 'Anne', age: 25 } as n return n[$myKey] as result