谓词指定一个条件,并评估该条件以给出布尔值(真或假)。
所有谓词
分类 |
谓词 |
|---|---|
| 比较谓词 | =,<>(或!=),>,<,>=,<=,=~ |
| Exists谓词 | EXISTS |
| None谓词 | NONE |
| Null谓词 | IS NULL,IS NOT NULL |
| Normalized谓词 | IS NORMALIZED, IS NOT NORMALIZED |
| Labeled谓词 | IS LABELED,IS NOT LABELED,: |
| Property Exists谓词 | PROPERTY_EXISTS |
| 值类型谓词 | IS TYPED,IS NOT TYPED |
| 布尔值谓词 | IS TRUE, IS FALSE |
| All Different谓词 | ALL_DIFFERENT |
| Same谓词 | SAME |
| Source/Destination谓词 | IS SOURCE OF, IS NOT SOURCE OF, IS DESTINATION OF, IS NOT DESTINATION OF |
| Directed谓词 | IS DIRECTED, IS NOT DIRECTED |
比较谓词
比较两个值或表达式,返回真或假。GQL支持以下比较谓词:
- 等于:
= - 不等于:
<>(或!=) - 大于:
> - 小于:
< - 大于等于:
>= - 小于等于:
<= - 正则匹配:
=~
>、<、>=和<=只能与数值、文本值、时态值、布尔值和null值一起使用。
可比较的值
在GQL中,如果两个值可以使用比较运算符进行有意义的评估,则它们被视为可比较的值。可比较的值包括两类:
- 本质上可比较的值:指类型相同的值(如两个字符串、两个日期)或同一类别中紧密相关的类型(如整数与浮点数)。这些值可以直接进行比较。
- 通用可比较的值:指属于不同类别但仍可通过隐式类型转换进行比较的值。例如,将整数
12与字符串"13ab"进行比较时,系统会尝试先将字符串转换为数字后再进行评估。
比较数值
RETURN 30.1 > 30 // true
比较文本值
通过两个文本中第一个不同的字符(从左到右)决定比较结果。字符的比较依据其Unicode值进行。
RETURN "campus" < "camera" // false
这个查询返回假,因为它们的首个不同字符分别是p和e, 而p的Unicode值(112)大于e的Unicode值(101)。
LET email = "johndoe@gmail.com"
RETURN email =~ "[a-zA-Z0-9_.-]+@[a-zA-Z0-9]+\.(com|cn)" // true
这个查询返回真,因为email值符合指定的邮箱地址格式。
比较时间值
时间值在GQL中被视为数值处理,因为时间是以秒、小时、天和年等单位衡量的。GQL在比较两个时间值时,基于它们之间的持续时间(即时间点之差)进行判断:若持续时间为0,则两者相等;若为负,则左值较小;否则,左值较大。
// p1.birthday is 1987-10-01, p2.birthday is 1987-10-02
MATCH (p1 {name: "Alex"}), (p2 {name: "Joy"})
RETURN p1.birthday < p2.birthday // true
比较列表值
如果两个列表包含相同的元素,并且顺序完全相同,则它们相等。
RETURN [1,2,3] = [1,2,3] // true
RETURN [] = [] // true
RETURN [1,2,3] = [1,3,2] // false
比较记录值
如果两个记录具有相同的字段和相同的值,则它们相等。
RETURN {a:1, b:2} = {a:1, b:2} // true
RETURN {a:1, b:2} = {a:2, b:2} // false
RETURN {a:1} = {b:1} // false
比较路径
路径类似于列表,因为路径本质上是点和边组成的序列。
MATCH p1 = (:User {name: "mochaeach"})-[:Joins]->(:Club {_id: "C02"})
MATCH p2 = (:User {name: "mochaeach"})-[:Joins]->(:Club {_id: "C02"})
RETURN p1 = p2 // true
MATCH p1 = (:User {name: "mochaeach"})-[:Joins]->(:Club {_id: "C02"})
MATCH p2 = (:Club {_id: "C02"})<-[:Joins]-(:User {name: "mochaeach"})
RETURN p1 = p2 // false
比较点或边
点和边类似记录一样处理,其中属性名称作为键,属性值作为数据。
MATCH (n1:User {name: "mochaeach"}), (n2:Club {_id: "C02"})
RETURN n1 = n2 // false
比较文本值和数值
GQL比较文本值与数值时,系统尝试将文本值完全转换为数值。当且仅当文本值是有效的数字格式时,可成功转换。例如:
" 123 "→123"-2"→-2"+2.3"→2.3
如果文本值不是有效的数字格式,例如"1-abc"则转换失败,文本值视为0。
RETURN "-2.9" > -3 // true; converts "-2.9" to 2.9
RETURN "11a" > 10 // false; converts "11a" to 0
比较文本值和时间值
在GQL中,文本可以通过隐式转换为时间类型与时间值进行比较。这种行为类似于文本与数字的比较。为了成功转换文本,它必须:
- 遵循ISO 8601标准中日期、日期时间或持续时间的格式。
- 能被转换为与另一个操作数类型匹配的时间值。
// p.birthday is 1987-10-01
MATCH (p1 {name: "Alex"}), (p2 {name: "Joy"})
RETURN p1.birthday < "1987-10-02" // true
比较布尔值和其他值
布尔值可以通过隐式类型转换与其他数据类型进行比较,例如数字或文本值。
RETURN true = 1 // true
RETURN false = 0 // true
RETURN true = "true" // false
Exists谓词
EXISTS谓词用来判断指定的图模式或查询是否有结果返回。如果发现匹配数据,谓词判断结果为真,否则为假。
<exists predicate> ::=
"EXISTS" {
"{" <graph pattern> "}"
| "(" <graph pattern> ")"
| "{" { <match statement>... } "}"
| "(" { <match statement>... } ")"
| "{" <query specification> "}"
}
判断图中是否存在以点A为起点的路径:
RETURN EXISTS {
MATCH ({_id: "A"})->()
}
MATCH关键词可以省略,此时EXISTS只包含图模式;同时可使用WHERE子句设定条件:
RETURN EXISTS {
(n)->() WHERE n._id = "A"
}
EXISTS也可在MATCH语句的WHERE子句中使用:
MATCH (n:movie)
WHERE n.rating > 7.5 AND EXISTS {
MATCH (n)<-[:direct]-(m)
WHERE m.name = "Ang Lee"
}
RETURN n.name
判断列表中是否有元素大于3:
RETURN EXISTS {
FOR item in [1,2,3]
FILTER item > 3
RETURN item
}
判断检索到的点是否具有name属性;请注意,即使name值为null,它也返回真:
MATCH (n:Paper {_id: "book92"}) LIMIT 1
RETURN EXISTS(n.name)
None谓词
NONE谓词用来判断指定的图模式或查询是否无任何结果返回。如果没有发现任何匹配数据,谓词判断结果为真,否则为假。
<none predicate> ::=
"NONE" {
"{" <graph pattern> "}"
| "(" <graph pattern> ")"
| "{" { <match statement>... } "}"
| "(" { <match statement>... } ")"
| "{" <query specification> "}"
}
判断图中是否不存在以点A为起点的路径:
RETURN NONE {
MATCH ({_id: "A"})->()
}
MATCH关键词可以省略,此时NONE只包含图模式;同时可使用WHERE子句设定条件:
RETURN NONE {
(n)->() WHERE n._id = "A"
}
NONE也可在MATCH语句的WHERE子句中使用:
MATCH (n:movie)
WHERE n.rating > 7.5 AND NONE {
MATCH (n)<-[:direct]-(m)
WHERE m.name = "Ang Lee"
}
RETURN n.name
判断列表中是否没有任何元素大于3:
RETURN NONE {
FOR item in [1,2,3]
FILTER item > 3
RETURN item
}
Null谓词
判断值是否为null。GQL支持以下Null谓词:
IS NULLIS NOT NULL
本条查询获取每个Paper点的title,前提是title属性值非null,否则返回信息TITLE NOT FOUND:
MATCH (n:Paper)
RETURN CASE
WHEN n.title IS NOT NULL THEN n.title
ELSE "TITLE NOT FOUND"
END
Normalized谓词
判断字符串是否规范化。GQL支持以下Normalized谓词:
IS [ <normal form> ] NORMALIZEDIS NOT [ <normal form> ] NORMALIZED
详情
<normal form>规范化形式默认为NFC。其他可用规范化形式包括NFD,NFKC和NFKD。
RETURN "Å" IS NORMALIZED AS normRes
结果:
| normRes |
|---|
| 1 |
RETURN "Å" IS NFD NORMALIZED AS normRes
结果:
| normRes |
|---|
| 0 |
Labeled谓词
判断图元素是否满足标签表达式。GQL支持以下Labeled谓词:
IS LABELEDIS NOT LABELED:
MATCH (n) WHERE n IS NOT LABELED Paper
RETURN n
MATCH (n) WHERE n:Paper
RETURN n
Property Exists谓词
PROPERTY_EXISTS谓词用来判断引用的图元素是否具有指定的属性,而不管其值如何。这意味着即使属性值为null,它也返回真。
MATCH (n:Paper) LIMIT 1
RETURN PROPERTY_EXISTS(n, "name")
值类型谓词
判断指定值是否为特定类型。GQL支持以下值类型谓词:
IS TYPED <value type>IS NOT TYPED <value type>
详情
- 目前
<value type>支持以下数据类型关键字:STRING,BOOL。
RETURN "a" IS TYPED BOOL AS typeCheck
结果:
| typeCheck |
|---|
| false |
布尔值谓词
用来判断布尔表达式或变量是否真实,即判断其为真还是为假。GQL支持一下布尔值谓词:
IS TRUEIS FALSE
RETURN 1 > 2 IS TRUE
结果:
| 1 > 2 IS TRUE |
|---|
| 0 |
All Different谓词
ALL_DIFFERENT谓词判断绑定到元素变量列表的所有图元素是否彼此成对不同。
MATCH (n1 {_id:"P1"})
MATCH ({_id:"P1"})-(n2)
MATCH ({_id:"P3"})-(n3)
RETURN table(n1._id, n2._id, n3._id, ALL_DIFFERENT(n1, n2, n3))
结果:
| n1._id | n2._id | n3._id | ALL_DIFFERENT(n1, n2, n3) |
|---|---|---|---|
| P1 | P2 | P2 | 0 |
Same谓词
SAME谓词判断所有元素变量是否绑定到同一个图元素。
MATCH ({_id:"P1"})-(n1)
MATCH ({_id:"P3"})-(n2)
RETURN table(n1._id, n2._id, SAME(n1, n2))
结果:
| n1._id | n2._id | SAME(n1, n2) |
|---|---|---|
| P2 | P2 | 1 |
Source/Destination谓词
判断点是否为边的起点或终点。GQL支持以下Source/Destination谓词:
<node reference> IS SOURCE OF <edge reference><node reference> IS NOT SOURCE OF <edge reference><node reference> IS DESTINATION OF <edge reference><node reference> IS NOT DESTINATION OF <edge reference>
MATCH (n {_id: "P1"}), ()-[e:Cites]->() WHERE n IS SOURCE OF e
RETURN e
Directed谓词
判断边变量是否与有向边绑定。GQL支持以下Directed谓词:
IS DIRECTEDIS NOT DIRECTED
详情
- 嬴图数据库中创建的所有边均为有向边。
MATCH ()-[e]-()
RETURN e IS DIRECTED
结果:
| e IS DIRECTED |
|---|
| 1 |