所有数据类型
分类 |
支持的类型 | 支持属性定义 |
---|---|---|
数值 | 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 | 除以上类型之外的其他类型 |
示例图集:
![](https://img.ultipa.cn/draw/draw_46f284aa23ee41a2852ec40f720d0b4f.jpg?v='1708402593851')
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值相关的函数和操作符: