运算符是用于对数据执行特定操作的符号或关键字。
所有运算符
分类 |
运算符 |
|---|---|
| 获取属性 | . |
| 逻辑运算符 | AND,OR,XOR,NOT |
| 算术运算符 | +,-,*,/,%,^ |
| 赋值运算符 | = |
| 字符运算符 | 字符串拼接:||, +字符匹配: CONTAINS |
| 列表运算符 | 构建列表:[]或LIST[]或ARRAY[]访问元素: []判断包含关系: IN列表串联: || |
| 路径运算符 | 构建路径:PATH[]路径拼接: || |
| 记录运算符 | 构建记录:{}或RECORD{}引用字段: . |
| 去重 | DISTINCT |
获取属性
.(点)运算符可用来获取图元素的属性。
MATCH (n)
RETURN n._id LIMIT 10
你也可以使用.(点)运算符获取POINT(latitude和longitude)或POINT3D(x、y和z)属性的坐标值。
MATCH (n:City)
RETURN n.location.latitude,n.location.longitude
逻辑运算符
AND
将两个或多个条件结合在一起,当所有条件判断为真时,整个表达式判断为真。
AND运算符的真值表:
AND |
真 | 假 |
|---|---|---|
| 真 | 真 | 假 |
| 假 | 假 | 假 |
本条查询返回age大于30,且incomeGroup为4的用户:
MATCH (n:User)
WHERE n.age > 30 AND n.incomeGroup = 4
RETURN n
OR
将两个或多个条件结合在一起,只需满足其中一个条件,整个表达式判断为真。
OR运算符的真值表:
OR |
真 | 假 |
|---|---|---|
| 真 | 真 | 真 |
| 假 | 真 | 假 |
本条查询返回age大于30,或incomeGroup为4的用户:
MATCH (n:Person)
WHERE n.age > 30 OR n.incomeGroup = 4
RETURN n
XOR
将两个或多个条件结合在一起,每次对两个条件执行逻辑运算。若表达式只有两个条件,则有且仅有一个条件为真时,整个表达式判断为真。若两个条件均为真或均为假,则最终结果为假。若表达式涉及多个条件,XOR先判断前两个条件,并将判断结果与下一个条件进行比较,以此类推,直至对全部条件判断完毕。
XOR运算符的真值表:
XOR |
真 | 假 |
|---|---|---|
| 真 | 假 | 真 |
| 假 | 真 | 假 |
本条查询返回age大于30或incomeGroup为4的用户,但会剔除同时满足两个条件的用户:
MATCH (n:User)
WHERE n.age > 30 XOR n.incomeGroup = 4
RETURN n
NOT
对条件进行否定,当条件为假时,返回结果为真,反之亦然。
NOT运算符的真值表:
NOT |
真 | 假 |
|---|---|---|
| 假 | 真 |
本条查询返回age不等于30的用户:
MATCH (n:Person)
WHERE NOT n.age = 30
RETURN n
算术运算符
对数值进行算术运算。GQL支持以下算术运算符:
- 加:
+ - 减:
- - 乘:
* - 除:
/ - 取余:
% - 取幂:
^
RETURN (2+8)%3
结果:
| (2+8)%3 |
|---|
| 1 |
赋值运算符
=运算符用于在LET和SET等语句中赋值,也用于在MATCH语句中声明路径变量。
LET a = 1 RETURN a
MATCH (n:Person WHERE n.name = "John Doe")
SET n.gender = "male"
MATCH p = ()->() RETURN p
字符运算符
字符串拼接
||或+运算符可将多个字符串按顺序拼接成一个字符串。
RETURN "data" || "base"
结果:
| "data" || "base" |
|---|
| database |
RETURN "data" + "base"
结果:
| "data" + "base" |
|---|
| database |
字符匹配
CONTAINS操作符可用来判断一个字符串是否包含另一个字符串(大小写敏感)。
查询aboutMe属性中含有字符串“graph database”的user点:
MATCH (n:user WHERE n.aboutMe CONTAINS "graph database")
RETURN n
为进行大小写不敏感的匹配,可先将所有字符转换成大写或小写:
MATCH (n:user WHERE lower(n.aboutMe) CONTAINS "graph database")
RETURN n
CONTAINS操作符也可用来精确或模糊匹配指定的关键词与全文索引的词元。详见使用全文索引。
使用全文索引prodDesc查找含有graph和database词元的点:
MATCH (n WHERE ~prodDesc CONTAINS "graph database")
RETURN n
列表运算符
构建列表
在[]内放置逗号分隔的元素来创建列表,也可以使用LIST[]或ARRAY[]。
LET items = [1,2,3]
RETURN items
结果:
| items |
|---|
| [1,2,3] |
[]也可用来构建嵌套列表:
LET items = [[1,2],[2,3]]
RETURN items
结果:
| items |
|---|
| [[1,2],[2,3]] |
访问元素
使用[]可通过索引来访问列表中的元素。列表索引从0开始,即第一个元素的索引为0。
格式 |
访问的元素 |
|---|---|
[m] |
索引为m的元素 |
[-m] |
倒数第m个元素 |
[m:] |
从索引为m的元素到最后一个元素 |
[:n] |
从第一个元素到索引为n-1的元素 |
[m:n] |
从索引为m的元素到索引为n-1的元素 |
注:m和n都是正整数,同时n > m。
LET items = ["a", 1, "b", 34]
RETURN items[0], items[1], items[-1], items[-2], items[1:], items[:2], items[1:2]
结果:
| items[0] | items[1] | items[-1] | items[-2] | items[1:] | items[:2] | items[1:3] |
|---|---|---|---|---|---|---|
| a | 1 | 34 | b | [1, "b", 34] | ["a", 1] | [1, "b"] |
判断包含关系
IN用来判断特定元素是否在列表中存在。
本条查询返回_id值包含在列表["U01", "U02"]中的点:
MATCH (n) WHERE n._id IN ["U01", "U02"]
RETURN n
列表串联
串联运算符||将多个列表按顺序合并成单个列表。
RETURN [1,2,3] || [3,4,5] AS newList
结果:
| newList |
|---|
| [1,2,3,3,4,5] |
路径运算符
构建路径
PATH[]通过按顺序枚举点和边创建路径。
<path value constructor> ::= "PATH[" <path element list> "]"
<path element list> ::= <node reference> [ <path element list step>... ]
<path element list step> ::= "," <edge reference> "," <node reference>
详情
- 如果
<path element list>包含null值或未识别出路径,则会引发异常:路径格式错误。
MATCH (n1 {_id: "U01"}), (n2 {_id: "U02"}), -[e {_uuid:39}]->
RETURN PATH[n2, e, n1]
路径拼接
拼接运算符||将多个路径连结成单个连续路径,即前一条路径的终点和后一条路径的起点相同时,两条路径会合并成一条。若前后路径不符合该条件,则会引发异常:路径格式错误。
MATCH p1 = ({_id: "U01"})->(n), p2 = (n)->()
RETURN p1 || p2
注意:如果图中没有匹配({_id:"U01"})->(n)->()的路径,则表达式p1 || p2不会返回任何结果。换句话说,仅当图中确实存在拼接的完整路径时,才会拼接成功。
记录运算符
构建记录
使用{}或RECORD{}创建记录,指定记录的字段和相应的值。
LET rec = {length: 20, width: 59, height: 10}
RETURN rec.length
结果:
| rec.length |
|---|
| 20 |
引用字段
.(句点)运算符可用来引用记录的字段。
LET rec = RECORD{length: 20, width: 59, height: 10}
RETURN rec.length * rec.width * rec.height AS capacity
结果:
| capacity |
|---|
| 11800 |
去重
DISTINCT可用来执行去重操作,仅保留唯一值。
本条查询返回用户不包含重复的age值:
MATCH (n:User)
RETURN DISTINCT n.age