别名是分配给特定类型数据集合的唯一名称(标识符)。您可在整个查询中使用别名来引用这些数据,从而实现数据检索、操作和进一步处理。
声明和引用
别名可通过紧跟某些语句之后使用关键词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)在单点模板n()
中使用prev_n
:
在路径模板的首个n()
中使用prev_n
,由于该点前没有其他点供prev_n
引用,因此无结果返回。
(2)在单边模板e()
中使用prev_n
:
(3)在多边模板e()[]
中使用prev_n
:
(4)在多边包含中间点的模板e().nf()[]
中使用prev_n
:
请注意,prev_n
引用的点必须具备其调用的属性y
。
本例查找路径,其起点为@actor
,终点为@movie
,且点@movie
的rating
属性需大于前一个点@actor
的score
属性:
n({@actor}).e().n({@movie.rating > prev_n.score}) as p
return p{*}
prev_e
别名prev_e
专用于点模板或边模板,用来指代路径中当前点或边的前一条边。
(1)在单点模板n()
中使用prev_e
:
在路径模板的首个n()
中使用prev_e
,由于该点前没有其他边供prev_n
引用,因此无结果返回。
(2)在单边模板e()
中使用prev_e
:
在路径模板的首个e()
中使用prev_e
,由于该边前没有其他边供prev_n
引用,因此无结果返回。
(3)在多边模板e()[]
中使用prev_e
:
在路径模板的首个e()[]
中使用prev_e
,由于第一条边前没有其他边供prev_n
引用,因此无结果返回。
(4)在多边包含中间点的模板e().nf()[]
中使用prev_e
:
在路径模板的首个e().nf()[]
中使用prev_e
,由于第一条边前没有其他边供prev_n
引用,因此无结果返回。
请注意,prev_e
引用的边必须具备其调用的属性y
。
本例查找@card
点间的4步路径,由交易的出边组成,且交易时间按升序排列:
n({@card}).re({@transfers}).n({@card})
.re({@transfers.time > prev_e.time})[3]
.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{*}
如果声明了自定义别名,默认别名将会失效。