UQL支持多种值和类型来表示图数据库中的数据。理解这些值和类型对实现有效查询和数据操作至关重要。
属性值类型
属性值类型指属性值的数据类型。嬴图支持以下属性值类型:
数值
| 类型 | 描述 | 
|---|---|
| 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位 | 
| DOUBLE | 64位双精度浮点数,支持最多15位有效数字(包括所有的非零数字和夹在非零数之间的零,例如 0.0123456789012345) | 
| DECIMAL | 指定精度(1到65,指所有数字位数)和标度(0到30,指小数点后的数字位数)的数字;例如, DECIMAL(10,4)代表精度最大为10、标度最大为4的数字 | 
文本
| 类型 | 描述 | 
|---|---|
| STRING | 用引号包裹的一串字符,不超过 60000字节;创建属性时的默认类型 | 
| TEXT | 用引号包裹的一串字符,长度不限 | 
时间点
| 类型 | 描述 | 
|---|---|
| DATE | 不带时区的日期值,例如 2025-01-01、20250101 | 
| LOCAL DATETIME | 不带时区的日期和时间值;例如 2025-01-01 12:20:02、20250101T122002.55254 | 
| LOCAL TIME | 不带时区的时间值,例如 12:20:02、122002.55254 | 
| ZONED DATETIME | 带时区的日期和时间值,例如 2025-01-01 12:20:02-1030、20250101T122002.55254+0900 | 
| ZONED TIME | 带时区的时间值,例如 12:20:02-1030、122002.55254+0900 | 
| TIMESTAMP | 自 1970-01-01 00:00:00 UTC起计算的秒数时间戳,例如,1751422921对应的时间是2025-07-02 02:22:01 UTC如果提供日期和时间格式的值,系统会根据本地、客户端或SDK设置的时区自动将其转换成时间戳;同样,当以日期和时间格式展示时间戳时,也会根据设置的时区进行转换 | 
| DATETIME | 不带时区的日期和时间值,范围是 1000-01-01 00:00:00.000000到9999-12-31 23:59:59.499999;这是嬴图扩展提供的属性类型,与GQL标准中的LOCAL DATETIME类似,但支持更灵活的赋值格式,例如:
 | 
日期
- 格式:yyyy-[m]m-[d]d或yyyymmdd
- 范围:-9999-12-31到9999-12-31
时间
- 格式:hh:mm:ss[.fraction]或hhmmss[.fraction]
- 范围:00:00:00.000000000到23:59:59.999999999
日期和时间
- 格式:使用空格或字母T连接日期和时间
- 范围:-9999-01-01 00:00:00.000000000到9999-12-31 23:59:59.999999999
时区
- 格式:以UTC偏移量表示,即±hh:mm或±hhmm,直接写在时间后面
- 范围:UTC-15:00到UTC+15:00
时间段
| 类型 | 描述 | 
|---|---|
| DURATION(YEAR TO MONTH) | 以年和月为单位衡量的时间段,例如 P2Y5M(2年5个月)、-P1Y2M(负的1年2个月)
 | 
| DURATION(DAY TO SECOND) | 以日、小时、分钟、秒和可选的小数秒为单位衡量的时间段,例如 P3DT4H(3天4小时)、-P1DT2H3M4.12S(负的1天2小时3分钟4.12秒)
 | 
布尔
| 类型 | 描述 | 
|---|---|
| BOOL | 包括两个可能的值: 
 | 
空间
| 类型 | 描述 | 
|---|---|
| POINT | 地理坐标系中的一个二维坐标 (latitude, longitude),坐标值以DOUBLE类型存储 | 
| POINT3D | 笛卡尔坐标系中的一个三维坐标 (x, y, z),坐标值以DOUBLE类型存储 | 
记录
| 类型 | 描述 | 
|---|---|
| RECORD | 一组字段,每个字段有名称和对应的值 | 
二进制
| 类型 | 描述 | 
|---|---|
| BLOB | 存储二进制数据,可用于存储图像、音频、视频或其他非结构化文件 | 
列表和集合
| 类型 | 描述 | 
|---|---|
| <subType>[] | 同一类型元素的有序集合;子类型支持除 BOOL外的以上所有类型 | 
| SET(<subType>) | 不重复的同一类型元素的无序集合;子类型支持除 BOOL外的以上所有类型 | 
构造值类型
构造值类型是包含复合元素的数据类型。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值。
- 可选匹配:当find()、khop()等语句使用OPTIONAL关键字时,若没有找到结果,语句生成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值归为一组。
