谓词指定一个条件,并评估该条件以给出布尔值(真或假)。
所有谓词
分类 |
谓词 |
---|---|
比较谓词 | = ,<> (或!= ),> ,< ,>= ,<= ,=~ |
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 NULL
IS 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> ] NORMALIZED
IS 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 LABELED
IS 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 TRUE
IS 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 DIRECTED
IS NOT DIRECTED
详情
- 嬴图数据库中创建的所有边均为有向边。
MATCH ()-[e]-()
RETURN e IS DIRECTED
结果:
e IS DIRECTED |
---|
1 |