概述
使用语句RETURN可以指定需包含在最终输出中的项。各项由一个表达式定义,可以包括别名、属性、函数、常量等。
所有UQL查询,除图集管理、数据修改和其他特定用途的查询外,必须以RETURN语句结尾。只有LIMIT语句可以跟在RETURN语句之后,为各返回项保留指定数量的记录,并舍弃其余记录。
语法
RETURN <item1> as <alias1?>, <item2?> as <alias2?>, ...
详情
RETURN语句必须包含至少一个项目。- 各返回项的默认别名是返回项表达式本身。可使用别名重命名返回项。
- 在每个返回项表达式中,可以引用前面的语句中声明的别名。更多细节请参阅在RETURN中引用别名。
- 每个返回项对应以下结果类型的一种:
RESULT_TYPE_NODERESULT_TYPE_EDGERESULT_TYPE_PATHRESULT_TYPE_ATTRRESULT_TYPE_TABLE
示例图集

在一个空图集中,逐行运行以下语句,创建示例图集:
create().node_schema("Student").node_schema("Course").edge_schema("Take")
create().node_property(@Student,"name").node_property(@Student,"gender").node_property(@Course,"name").node_property(@Course,"credit",int32).edge_property(@Take, "year", int32).edge_property(@Take, "term")
insert().into(@Student).nodes([{_id:"s1", name:"Alex", gender:"male"}, {_id:"s2", name:"Susan", gender:"female"}])
insert().into(@Course).nodes([{_id:"c1", name:"Art", credit:13}, {_id:"c2", name:"Literature", credit:15}])
insert().into(@Take).edges([{_from:"s1", _to:"c1", year: 2024, term: "Spring"}, {_from:"s2", _to:"c1", year: 2023, term: "Fall"}, {_from:"s2", _to:"c2", year: 2023, term: "Spring"}])
返回点
返回每个点的schema和所有属性:
find().nodes({@Course}) as n
return n{*}
结果:n
| _id | _uuid | schema | values |
|---|---|---|---|
| c1 | Sys-gen | Course | {name: "Art", credit: 13} |
| c2 | Sys-gen | Course | {name: "Literature", credit: 15} |
返回每个点的schema和系统属性:
find().nodes({@Course}) as n
return n
结果:n
| _id | _uuid | schema |
|---|---|---|
| c1 | Sys-gen | Course |
| c2 | Sys-gen | Course |
返回边
返回每条边的schema和所有属性:
find().edges() as e
return e{*}
结果:e
_uuid |
_from |
_to |
_from_uuid |
_to_uuid |
schema |
values |
|---|---|---|---|---|---|---|
| Sys-gen | s2 | c1 | UUID of s2 | UUID of c1 | Take | {year: 2023, term: "Fall"} |
| Sys-gen | s2 | c2 | UUID of s2 | UUID of c2 | Take | {year: 2023, term: "Spring"} |
| Sys-gen | s1 | c1 | UUID of s1 | UUID of c1 | Take | {year: 2024, term: "Spring"} |
返回每条边的schema和所有系统属性:
find().edges() as e
return e
结果:e
| _uuid | _from | _to | _from_uuid | _to_uuid | schema |
|---|---|---|---|---|---|
| Sys-gen | s2 | c1 | UUID of s2 | UUID of c1 | Take |
| Sys-gen | s2 | c2 | UUID of s2 | UUID of c2 | Take |
| Sys-gen | s1 | c1 | UUID of s1 | UUID of c1 | Take |
返回路径
返回每条路径中的点和边(包括点和边的schema和属性信息),以及路径长度:
n().re({@Take.term == "Spring"}).n() as p
return p{*}
结果:

返回每条路径中的点和边(包括点和边的schema和系统属性信息),以及路径长度:
n().re({@Take.term == "Spring"}).n() as p
return p
结果:

返回schema
n({_id == "s2"}).e(as e).n(as n)
return e.@, n.@
结果:
| e.@ | n.@ |
|---|---|
| Take | Course |
| Take | Course |
返回属性
使用英文句号.,可以从代表点或边的别名中提取指定属性值。如果未发现点或边的指定属性,则返回null值。
n({@Student.name == "Susan"}).re().n({@Course} as c)
return c.name, c.credit, c.type
结果:
| c.name | c.credit | c.type |
|---|---|---|
| Literature | 15 | null |
| Art | 13 | null |
可使用一组花括号{}从点、边或路径中提取多个属性信息。更多信息请参阅在RETURN中引用别名。
n({@Student.name == "Susan"}).re().n({@Course} as c)
return c{name, credit}
结果:c
| _id | _uuid | name | credit |
|---|---|---|---|
| c1 | Sys-gen | Literature | 15 |
| c2 | Sys-gen | Art | 13 |
返回表
可使用table()函数,指定返回项作为列,构建输出表。
n({@Student} as s).re().n({@Course} as c)
return table(s.name, c.name)
结果:
| s.name | c.name |
|---|---|
| Susan | Art |
| Susan | Literature |
| Alex | Art |
返回各项别名
n({@Student} as s).re(as t).n({@Course} as c)
return s.name as Student, c.name as Course, t.year as TakenIn
结果:
| Student | Course | TakenIn |
|---|---|---|
| Alex | Art | 2024 |
| Susan | Art | 2023 |
| Susan | Literature | 2023 |
返回去重记录
可使用DISTINCT运算符对记录去重。
n().e(as e).n()
return distinct e.year
结果:
| e.year |
|---|
| 2023 |
| 2024 |
返回聚合结果
聚合函数,如sum()和max(),可以直接应用于RETURN语句。
n({@Student.name == "Susan"}).re().n({@Course} as c)
return sum(c.credit)
结果:
| sum(c.credit) |
|---|
| 28 |
根据CASE返回结果
CASE函数可以直接应用于RETURN语句。
n({@Course} as n)
return n.name as Course, case when n.credit > 14 then "Y" else "N" end as Recommended
结果:
| Course | Recommended |
|---|---|
| Art | N |
| Literature | Y |
返回指定条记录
可使用LIMIT语句限制返回的记录条数:
find().nodes({@Course}) as n
return n.name limit 1
结果:
| n.name |
|---|
| Art |
返回有序记录
可使用ORDER BY语句,根据指定值对记录排序。查询中,ORDER BY必须出现在RETURN statement之前。
n({@Course} as n)
order by n.credit desc
return n{*}
结果:n
| _id | _uuid | schema | values |
|---|---|---|---|
| c2 | Sys-gen | Course | {name: "Literature", credit: 15} |
| c1 | Sys-gen | Course | {name: "Art", credit: 13} |
返回异源数据
如果RETURN语句中引用的别名是异源的,则会生成笛卡尔积。更多详情请参阅异源数据。
find().nodes({@Course}) as c
find().nodes({@Student}) as s
return c.name, s.name
结果:
| c.name | s.name |
|---|---|
| Literature | Susan |
| Literature | Alex |
| Art | Susan |
| Art | Alex |
在RETURN中引用别名
NODE类型
find().nodes({@city}) as n
return n
别名n是NODE类型,以下示例为RETURN语句引用别名时的情况:
引用格式 |
每条记录返回的数据 | 结果类型 |
|---|---|---|
n |
点schema和系统属性(_id,_uuid) |
RESULT_TYPE_NODE |
n{*} |
点schema和所有属性 | RESULT_TYPE_NODE |
n.name |
点属性name |
RESULT_TYPE_ATTR |
n{name, age} |
点schema,系统属性和属性name与age |
RESULT_TYPE_NODE |
n.@ |
点schema | RESULT_TYPE_ATTR |
EDGE类型
find().edges({@transfers}) as e
return e
别名e是EDGE类型,以下示例为RETURN语句引用别名时的情况:
引用格式 |
每条记录返回的数据 | 结果类型 |
|---|---|---|
e |
边schema和系统属性(_uuid,_from,_to,_from_uuid,_to_uuid) |
RESULT_TYPE_EDGE |
e{*} |
边schema和所有属性 | RESULT_TYPE_EDGE |
e.time |
边属性time |
RESULT_TYPE_ATTR |
e{time, amount} |
Edge schema, system properties, and properties time, amount. |
RESULT_TYPE_EDGE |
e.@ |
Edge schema. | RESULT_TYPE_ATTR |
PATH类型
n().e()[:5].n() as p
return p
别名p是PATH类型,以下示例为RETURN语句引用别名时的情况:
引用格式 |
每条记录返回的数据 | 结果类型 |
|---|---|---|
p |
路径中的点和边(包括点和边的schema和系统属性),以及路径长度 | RESULT_TYPE_PATH |
p{*} |
路径中的点和边(包括点和边的schema和所有属性),以及路径长度 | RESULT_TYPE_PATH |
p{name}{time, amount} |
路径中的点和边(包括每个点的schema、系统属性和属性name;包括每条边的schema、系统属性、属性time和属性amount),以及路径长度 |
RESULT_TYPE_PATH |
p{*}{time, amount} |
路径中的点和边(包括每个点的schema和所有属性;包括每条边的schema、系统属性、属性time和属性amount),以及路径长度 |
RESULT_TYPE_PATH |
p{name}{*} |
路径中的点和边(包括每个点的schema、系统属性和属性name;包括每条边的schema和所有属性),以及路径长度 |
RESULT_TYPE_PATH |
p{name} |
路径中的点和边(包括点和边的schema、系统属性和属性name),以及路径长度 |
RESULT_TYPE_PATH |
List类型
uncollect [[1,2,3,4,5], [4,5,6,7,8]] as lists
return lists
别名lists代表的每条记录都是list类型,以下示例为RETURN语句引用别名时的情况:
引用格式 |
每条记录返回的数据 | 结果类型 |
|---|---|---|
lists |
一个列表 | RESULT_TYPE_ATTR |
lists[2] |
列表中的第3个元素 | 与元素类型一致;本例中为RESULT_TYPE_ATTR |
lists[0:3] |
由原列表第1个到第4个元素构成的新列表 | RESULT_TYPE_ATTR |
lists[:5] |
由原列表第1个到第6个元素构成的新列表 | RESULT_TYPE_ATTR |
lists[2:] |
由原列表第3个元素到结尾构成的新列表 | RESULT_TYPE_ATTR |
Point类型
find().nodes({@city}) as n
with n.location as points
return points
属性location为point类型,别名points用来代表属性location,以下示例为RETURN语句引用别名时的情况:
引用格式 |
每条记录返回的数据 | 结果类型 |
|---|---|---|
points |
具有x、y坐标的数据,如POINT(25 33) |
RESULT_TYPE_ATTR |
points.x |
x坐标值 | RESULT_TYPE_ATTR |
points.y |
y坐标值 | RESULT_TYPE_ATTR |
其他原子类型
原子类型,又称基础数据类型,如整数、小数和字符串,均无法拆分成更小成分。原子类型的别名只能被直接引用,因为无法从其表示的数据中进一步提取信息。
find().nodes({@city}) as n
with n.name as names
return upper(names)