RETURN 可以对别名进行函数运算,将多个返回值组装到一起返回给用户。返回值不同源时不进行裁剪。
语法:return <expression>
as <alias>
, <expression>
as <alias>
, ...
参数:
- <expression>:返回值
- <alias>:返回值的别名,可省略
RETURN 子句通常出现在 UQL 语句的末尾,个别情况时其后可以出现 ORDER BY、LIMIT、SKIP。在 RETURN 子句中对某别名进行去重操作时,不影响其同源别名的长度。
关于 RETURN 子句中如何指定 NODE、EDGE、PATH 结构所携带的属性,请阅读《查询》-《别名系统》一文。
find().nodes() as n1 limit 5
n(3).e()[2].n(as n2) as path
return n1, pnodes(path), distinct(n2.color)
上面 UQL 代码中的 RETURN 子句中有三个返回值,数据结构分别为 NODE,ARRAY,ATTR;第一个返回值与后两个返回值不同源;尽管后两个返回值是同源的,但由于是在 RETURN 子句中,第三个返回值的去重操作没有影响到第二个返回值的数据行:
返回 NODE
示例:返回 10 个点的全部属性值
find().nodes() as n
limit 10
return n{*}
示例:获取 50 个 @card 或 @customer 点,携带 balance、level
find().nodes({@card || @customer}) as n
limit 50
return n{balance, level}
分析:@card 点有 balance、level 两种属性,@customer 点只有 level。返回值仅携带其自身具有的属性。
返回 EDGE
示例:返回 50 条边,不携带任何自定义属性
find().edges() as e
limit 50
return e
返回 PATH
示例:返回 10 条三步路径,不携带点、边的任何自定义属性
n().e()[3].n() as p
limit 10
return p
示例:返回 10 条顾客的银行卡之间的一步转账路径,携带 balance 和 time
n({@customer}).e().n({@card})
.e().n({@card})
.e().n({@customer}) as p
limit 10
return p{balance}{time}
分析:返回值仅携带其自身具有的属性。@card 点将携带 balance,@transfer 边将携带 time,所有点、边均携带系统属性及 schema。
示例:返回 10 条顾客的银行卡之间的一步转账路径,所有点携带全部属性,所有边不携带任何自定义属性
n({@customer}).e().n({@card})
.e().n({@card})
.e().n({@customer}) as p
limit 10
return p{*}{}
示例:返回 10 条顾客的银行卡之间的一步转账路径,所有点、边携带全部属性
n({@customer}).e().n({@card})
.e().n({@card})
.e().n({@customer}) as p
limit 10
return p{*}
返回 ATTR
示例:获取 100 条边,返回它们的 schema 名称、amount(如有)
find().edges() as e
limit 100
return e.@, e.amount
分析:没有 amount 的边在返回值 e.amount 中将返回空值。
示例:统计所有银行卡余额的最大值
find().nodes({@card}) as n
return max(n.balance)
返回 ARRAY
示例:获取 10 个银行卡,将卡号聚合为数组并返回
find().nodes({@card}) as n
limit 10
return collect(n._id)
返回 TABLE
示例:获取 10 条转账边,将边的起点卡号、终点卡号、转账金额合并为表格并返回
n(as n1).e({@transfer} as e).n(as n2)
limit 10
return table(n1._id, n2._id, e.amount)