所有数据类型
分类 |
支持的类型 | 支持属性定义 |
|---|---|---|
| 数值 | int32、int64、uint32、uint64、float、double、decimal | 是 |
| 文本 | string、text | 是 |
| 时间 | datetime、timestamp | 是 |
| 空间 | point | 是 |
| 二进制 | blob | 是 |
| 真假 | bool | 否 |
| 空 | null | 否 |
| 图数据 | NODE、EDGE、PATH、GRAPH | 否 |
| 列表 | list(以上所有类型的列表形式) | 是,仅当元素为数字、文本、时间且不为decimal时 |
| 集合 | set(以上除列表之外所有类型的集合形式) | 是,仅当元素为数字、文本、时间且不为decimal时 |
| 对象 | object | 否 |
| 表格 | TABLE | 否 |
属性
创建每一个点或边属性时都需指定数据类型,或使用默认的数据类型(string)。所有支持的属性数据类型如下:
| 数据类型 | 描述 |
|---|---|
| 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)[1],例如,'decimal(10,4)'代表一个共有10位的小数,其中小数点后有4位,小数点前有6位注意:设置时必须用引号包裹 |
| string | 不超过60000字节的字符 注意:这是创建属性时的默认数据类型 |
| text | 长度不限的字符 |
| datetime | 时间日期值,范围从1000-01-01 00:00:00.000000到9999-12-31 23:59:59.499999,以uint64存储 有效格式包括 yyyy-mm-dd hh:mm:ss和yyyy-mm-dd hh:mm:ss.ssssss |
| timestamp | 相对于格林威治时间1970年1月1日0时后的一个时间点,以秒为单位,以uint32存储;时区可通过所选SDK的RequestConfig进行设置有效格式包括 yyyy-mm-dd hh:mm:ss、yyyy-mm-dd、yyyymmddhhmmss和yyyymmdd |
| point | 二维坐标,表示一个位置;两个坐标值以double存储 |
| blob | 二进制大对象,用于存储文件、图片、音频、视频等;实际长度受服务器max_rpc_msgsize(默认为4M)设置限制 |
| list | 支持int32[]、int64[]、uint32[]、uint64[]、float[]、double[]、string[]、text[]、datetime[]和timestamp[] 注意:设置时必须用引号包裹 |
| set | 支持set(int32)、set(int64)、set(uint32)、set(uint64)、set(float)、set(double)、set(string)、set(text)、set(datetime)和set(timestamp) 注意:设置时必须用引号包裹 |
[1]decimal存储的是准确的数字,因此需指定精度和标度。精度是所有数字的位数,包括整数与小数(不包括小数点),标度是小数点后的数字位数。
返回的数据
从服务器获取数据并处理后,返回数据的数据类型如下:
类型 |
数据结构 |
|---|---|
| NODE | {id: , uuid: , schema: , values: {...}} |
| EDGE | {uuid: , schema: , from: , from_uuid: , to: , to_uuid: , values: {...}} |
| PATH | {length: , nodes: [...], edges: [...]} |
| GRAPH | {nodes: [...], edges: [...]} |
| TABLE | {name: , headers: [...], rows: [...]} |
| ATTR | 除以上类型之外的其他类型 |
示例图集:

NODE
返回name属性值为Alice的点:
find().nodes({name == 'Alice'}) as n
return n{*}
点的数据结构为:
{
"id": "STU001",
"uuid": 1,
"schema": "student",
"values": {
"name": "Alice",
"age": 25
}
}
EDGE
返回UUID为53的边:
find().edges({_uuid == 53}) as e
return e{*}
边的数据结构为:
{
"uuid": 53,
"schema": "studyAt",
"from": "STU001",
"to": "UNI001",
"from_uuid": 1,
"to_uuid": 1001,
"values": {
"start": 2001,
"end": 2005
}
}
PATH
返回从Alice到Oxford的路径:
n({name == 'Alice'}).e().n({name == 'Oxford'}) as p
return p{*}
路径的数据结构为:
{
"length": 1,
"nodes": [{
"id": "STU001",
"uuid": 1,
"schema": "student",
"values": {
"name": "Alice",
"age": 25
}
}, {
"id": "UNI001",
"uuid": 1001,
"schema": "university",
"values": {
"name": "Oxford"
}
}],
"edges": [{
"uuid": 53,
"schema": "studyAt",
"from": "STU001",
"to": "UNI001",
"from_uuid": 1,
"to_uuid": 1001,
"values": {
"start": 2001,
"end": 2005
}
}]
}
GRAPH
返回由从Alice到Oxford的路径转换而成的图:
n({name == 'Alice'}).e().n({name == 'Oxford'}) as p
return toGraph(collect(p))
图的数据结构为:
{
"nodes": [{
"id": "STU001",
"uuid": 1,
"schema": "student",
"values": {
"name": "Alice",
"age": 25
}
}, {
"id": "UNI001",
"uuid": 1001,
"schema": "university",
"values": {
"name": "Oxford"
}
}],
"edges": [{
"uuid": 53,
"schema": "studyAt",
"from": "STU001",
"to": "UNI001",
"from_uuid": 1,
"to_uuid": 1001,
"values": {
"start": 2001,
"end": 2005
}
}]
}
TABLE
返回有所有点的ID和name属性值构成的表:
find().nodes() as n
return table(n._id, n.name)
结果:
| n._id | n.name |
|---|---|
| STU001 | Alice |
| UNI001 | Oxford |
表的数据结构为:
{
"name": "table(n._id, n.name)",
"alias": "table(n._id, n.name)",
"headers": [
"n._id",
"n.name"
],
"rows": [
[
"STU001",
"Alice"
],
[
"UNI001",
"Oxford"
]
]
}
ATTR
返回Alice在Oxford学习了多久:
find().edges({_uuid == 53}) as e
return e.end - e.start
该结果的数据结构为:
{
"values": [
4
]
}
关于如何在RETURN子句中指定有效的返回格式,请参考这里的表格。
Null
在嬴图数据库中,null表示属性值或查询结果不存在。请注意null与0或空字符串不是一回事。具体来说,以下情况会产生null值:
- 插入点或边(
insert()、insert().overwrite())时,未指定的属性会被赋值为null - 创建属性时,相应schema中已有点或边的该新属性会被赋值为null
- 请求一个不存在的属性时,会返回null
- 查询子句(
find()、khop()、n().e().n()等)没有任何结果时,如果使用了前缀OPTIONAL,会返回null(而不是无任何返回值)
当条件判断表达式包含null时:
- 如果有确定的结果,返回真或假
- 否则,返回null
| 表达式 | 结果 |
解释 |
|---|---|---|
| null == 3 | null | Null代表未知或确实的值,因此与另一个值比较时无法得到确定的结果。判断符!=、<、>、>=和<=的结果相同。 |
| null == null | null | 判断符!=、<、>、>=和<=的结果相同。 |
| [1, null, 2] == [1, 3, 2] | null | 判断符!=的结果相同。 |
| [1, null, 2] == [1, null, 2] | null | 判断符!=的结果相同。 |
| [1, null, 2] == [1, null, 3] | 假 | 两个列表的第三个元素不同,因此可以确定结果。判断符!=的结果为真。 |
| [1, null, 2] == [1, null, 2, 3] | 假 | 两个列表的长度不同,因此可以确定结果。判断符!=的结果为真。 |
| null <> [1, 3] | null | 判断符<=>的结果相同。 |
| 1 IN [1, null, 2] | 真 | 判断符NOT IN的结果为假。 |
| 3 IN [1, null, 2] | null | 判断符NOT IN的结果相同。 |
| null IN [ ] | 假 | 给定的列表是空的,因此可以确定结果。判断符NOT IN的结果为真。 |
有null参与的数值运算(+/-/*///%)的结果均为null。
有null参与的聚合函数运算(count()/sum()/max()/min()/avg()/stddev()/collect())均忽略null值进行相应的运算。
与判断null值相关的函数和操作符: