UQL使用多种值和类型来表示图数据库中的信息。理解这些值和类型对实现有效查询和数据操作至关重要。
图类型
图类型指的是从数据库中获取的数据类型,包括点、边和路径。
类型 | 描述 |
---|---|
NODE |
代表一个点,包含schema和属性集 |
EDGE |
代表一条边,包含schema和属性集 |
PATH |
代表一条路径,包含构成路径的点边序列 |
属性值类型
属性值类型指属性值的数据类型。嬴图支持以下属性值类型:
分类 | 支持的类型 | 描述 |
---|---|---|
数值 | int32 |
有符号32位整数(-2,147,483,648到2,147,483,647) |
uint32 |
无符号32位整数(0到4,294,967,295) | |
int64 |
有符号64位整数(-9,223,372,036,854,775,808到9,223,372,036,854,775,807) | |
uint64 |
无符号64位整数(0到18,446,744,073,709,551,615) | |
float |
32位单精度浮点数,6至7位有效数字(整数和小数部分,不包括小数点) | |
double |
64位双精度浮点数,15至16位有效数字(整数和小数部分,不包括小数点) | |
decimal |
数字可以有指定的精度(1到65)和标度(0到30)。例如,decimal(10,4) 代表这样一个小数,其精度为10(所有数字的位数,不包括小数点),其标度为4(小数点后的数字位数) |
|
文本 | string |
不超过60000字节的字符序列,是创建属性时的默认值类型 |
text |
长度不限的字符序列 | |
时间 | datetime |
时间日期值,范围从1000-01-01 00:00:00.000000到9999-12-31 23:59:59.499999,以uint64 类型存储 |
timestamp |
相对于格林威治时间1970年1月1日0时0分0秒后的一个具体时间点,以秒为单位,以uint32 类型存储注意:如果输入了日期和时间格式的值,系统会根据本地时区或SDK的 RequestConfig 设置的时区,将该值转换成时间戳。 同理,如果时间戳以日期和时间格式展示,系统会根据本地时区或SDK的RequestConfig 设置的时区转换该值 |
|
布尔 | bool |
包括两个可能的值:0 表示为真,1 表示为假 |
空间 | point |
代表具体地理位置的二维坐标;两个坐标值以double 类型存储 |
列表 | <subType>[] |
元素的有序集合,支持子类型int32 、uint32 、int64 、uint64 、float 、double 、string 、text 、datetime 和timestamp |
集合 | set(<subType>) |
不重复元素的有序集合,支持子类型int32 、uint32 、int64 、uint64 、float 、double 、string 、text 、datetime 和timestamp |
构造值类型
构造值类型是包含复合元素的数据类型。UQL支持以下构造值类型:
类型 | 描述 |
---|---|
list |
同源元素或异源元素的有序集合 |
结果类型
结果类型指的是查询返回值的数据类型。嬴图定义了以下结果类型。
RESULT_TYPE_NODE
本条查询返回所有@Paper
点的信息:
find().nodes({@Paper}) as n
return n{*}
n
的数据结构:
{
"data": [
{
"id": "P2",
"uuid": "8718971077612535835",
"schema": "Paper",
"values": {
"title": "Optimizing Queries",
"score": 9
}
},
{
"id": "P1",
"uuid": "8791028671650463770",
"schema": "Paper",
"values": {
"title": "Efficient Graph Search",
"score": 6
}
}
],
"alias": "n",
"type": 2,
"type_desc": "RESULT_TYPE_NODE"
}
RESULT_TYPE_EDGE
本条查询返回出边@Cites
的所有信息:
n().re({@Cites} as e).n()
return e{*}
e
的数据结构:
{
"data": [
{
"from": "P1",
"to": "P2",
"uuid": "1",
"from_uuid": "8791028671650463770",
"to_uuid": "8718971077612535835",
"schema": "Cites",
"values": {
"weight": 2
}
}
],
"alias": "e",
"type": 3,
"type_desc": "RESULT_TYPE_EDGE"
}
RESULT_TYPE_PATH
本条查询返回一步出向路径的所有信息:
n().re().n() as p
return p{*}
p
的数据结构:
{
"data": [
{
"nodes": [
{
"id": "P1",
"uuid": "8791028671650463770",
"schema": "Paper",
"values": {
"title": "Efficient Graph Search",
"score": 6
}
},
{
"id": "P2",
"uuid": "8718971077612535835",
"schema": "Paper",
"values": {
"title": "Optimizing Queries",
"score": 9
}
}
],
"edges": [
{
"from": "P1",
"to": "P2",
"uuid": "1",
"from_uuid": "8791028671650463770",
"to_uuid": "8718971077612535835",
"schema": "Cites",
"values": {
"weight": 2
}
}
],
"length": 1
}
],
"alias": "p",
"type": 1,
"type_desc": "RESULT_TYPE_PATH"
}
RESULT_TYPE_ATTR
本条查询返回点@Paper
的title
属性:
find().nodes({@Paper}) as n
return n.title
n.title
的数据结构:
{
"data": {
"alias": "n.title",
"type": 4,
"type_desc": "RESULT_TYPE_ATTR",
"values": [
"Optimizing Queries",
"Efficient Graph Search"
]
},
"alias": "n.title",
"type": 4,
"type_desc": "RESULT_TYPE_ATTR"
}
RESULT_TYPE_TABLE
本条查询返回一个表:
find().nodes({@Paper}) as n
return table(n.title, n.score) as table
table
的数据结构:
{
"data": {
"name": "table",
"alias": "table",
"headers": [
"n.title",
"n.score"
],
"rows": [
[
"Optimizing Queries",
"9"
],
[
"Efficient Graph Search",
"6"
]
]
},
"alias": "table",
"type": 5,
"type_desc": "RESULT_TYPE_TABLE"
}
Null值
null
值是一种特殊值,在所有可空类型中使用。任何非空值都是有效值。
Null情景
null
值可在多种情况下出现,如:
- 默认分配值:在插入点或边时,若未指定属性值给可空属性,则自动接收
null
值。 - 显式指定Null值:在插入点或边时,可空属性可被专门指定为
null
。 - 删除属性值:删除属性原有值并用
null
替代。 - 分配新属性:向schema添加新属性时,默认情况下,该schema下已有的点或边,对应的新属性将被赋予
null
值。 - 不存在的属性引用:引用不存在的属性会返回
null
值。 - 可选匹配:当关键字
OPTIONAL
与语句find()
、khop()
等连用时,若没有找到结果,则语句生成null
值而非空返回。
Null比较
null
值本质上未知,因此无法和其他值进行比较。涉及null
的比较若使用了=
或>
等普通运算符,通常不会生成真或假的结果,而是产生一个未知结果,也表示为null
。
示例 | 结果 |
---|---|
RETURN null = null |
null |
RETURN null > 3 |
null |
RETURN [1,null,2] <> [1,null,2] |
null |
RETURN 3 IN [1,null,2] |
null |
RETURN null IN [1,2] |
null |
RETURN null IN [] |
0 |
涉及null
的比较需要用到null谓词(IS NULL
和IS NOT NULL
)作特殊处理。
示例 | 结果 |
---|---|
RETURN null IS NULL |
1 |
RETURN null IS NOT NULL |
0 |
Null处理
在某些情况下,null
值会得到特殊处理,例如:
- 聚合函数通常忽略
null
值。 - 语句
GROUP BY
将所有null
值归为一组。