别名是分配给特定类型数据集合的唯一名称(标识符)。您可在整个查询中使用别名来引用这些数据,从而实现数据检索、操作和进一步处理。
声明和引用
别名可通过紧跟某些语句之后使用关键词as声明(即语句别名),也可在语句方法中声明(即方法别名)。该别名代表由语句检索或生成的数据。
您可在后续查询中引用别名以进一步使用该数据,或将其返回给客户端。
示例
请参阅各语句的语法以确定是否支持语句别名和方法别名。
为语句find().edges()声明别名e,并在语句RETURN中引用:
find().edges({@direct}) as e
return e.time
由于edges()方法不支持声明别名,以下查询会引发语法错误:
find().edges({@direct} as e)
return e
为语句autonet()声明别名paths,为其方法src()声明别名start,最后在语句RETURN中引用:
autonet().src({age < 60} as start).dest({@event}).depth(3) as paths
return start, paths
为语句find().nodes()声明别名a,在语句WITH中引用以计算最小年龄,并将结果声明为minAge,随后在另一个find().nodes()语句中引用minAge,获取该年龄对应的账户信息,并将其声明为b,最后在RETURN语句中引用别名b,输出账户名称:
find().nodes({@account}) as a
with min(a.age) as minAge
find().nodes({@account.age == minAge}) as b
return b.name
路径模板语句中,在首个n()中声明别名start,在最后一个n()中将其引用,从而形成一个简单回路:,
n(as start).e()[3].n({_id == start._id}) as p
return p limit 1
命名规范
别名命名规范如下:
- 1~64个字符
- 不能以波浪号
~开头 - 不能包含反引号
`或任何保留关键字。
尽量不要使用属性名作为别名。如果需要,请使用系统别名this来消除歧义。
别名类型
别名类型与其代表的数据类型保持一致。
本条查询中,别名users代表点,因此其类型是NODE;别名ages代表属性ages的属性值,因此与age的数据类型相同:
find().nodes({@user}) as users
return users.age as ages
引用别名
可根据别名类型,在部分语句中直接引用别名,或从别名中提取指定数据以供使用。
下表展示了引用不同别名类型时的示例:
| 别名 (别名类型) |
别名引用 | 代表的数据 | 数据类型 |
|---|---|---|---|
n( NODE) |
n |
点 | NODE |
n.name |
属性name的值 |
与name相同 |
|
n.@ |
点的schema | string |
|
e( EDGE) |
e |
边 | EDGE |
e.time |
属性time的值 |
Same with time |
|
e.@ |
边的schema | string |
|
p( PATH) |
p |
路径 | PATH |
lists( list) |
lists |
列表 | list |
lists[2] |
第3个元素 | 与该元素相同 | |
lists[0:3] |
由第1个元素到第4个元素组成的列表 | list |
|
lists[:5] |
由第1个元素到第6个元素组成的列表 | list |
|
lists[2:] |
由第3个元素到最后一个元素组成的列表 | list |
|
points( point) |
points |
点,每个点有两个坐标 | point |
points.x |
x坐标值 | double |
|
points.y |
y坐标值 | double |
语句
RETURN支持更多别名引用格式。
系统别名
系统别名专为特殊目的设计,无需声明即可使用。UQL提供三种系统别名:路径模板中的prev_n和prev_e,用于步间过滤;过滤条件中的this,在引用别名时,可用来区分与属性重名的别名。
prev_n
别名prev_n专用于点模板或边模板,用来指代路径中当前点或边的前一个点。
(1)在多边模板e()[]中使用prev_n:

(2)在有中介点的多边模板e().nf()[]中使用prev_n:

请注意,prev_n引用的点必须有属性y。
本例查找5步右向路径,从一个card点开始,保证每步到达另一个level更高的card点,最后到达一个account点:

n({@card}).re().nf({@card.level > prev_n.level})[5].n({@account}) as p
return p{*}
prev_e
别名prev_e专用于点模板或边模板,用来指代路径中当前点或边的前一条边。
(1)在多边模板e()[]中使用prev_e:

在路径模板的首个e()[]中使用prev_e,由于第一条边前没有其他边供prev_n引用,因此无结果返回。
(2)在有中介点的多边模板e().nf()[]中使用prev_e:

在路径模板的首个e().nf()[]中使用prev_e,由于第一条边前没有其他边供prev_n引用,因此无结果返回。
请注意,prev_e引用的边必须有属性y。
本例查找card点间的4步右向交易路径,交易时间越来越晚:

n({@card}).re({@transfers.time > prev_e.time})[4].n({@card}) as p
return p{*}
this
在点或边过滤器中使用别名this,可消除别名与点属性或边属性重名带来的歧义。
以下示例声明了别名balance,鉴于balance同样为点属性,因此在过滤器中使用this.balance用以指定点属性balance。
... as balance
find().nodes({this.balance > 5000})
...
如果上例使用了{balance > 5000},则指的是别名balance。
默认别名
语句find().nodes()提供了默认别名nodes以代表检索到的点。同样,语句find().edges()也提供了默认别名edges来代表检索到的边。
您可直接引用默认别名,无需声明。
find().nodes({@account})
return nodes{*}
如果声明了自定义别名,默认别名将会失效。