别名与数据结构
别名,英文是 alias,用来对 UQL 执行过程中产生的数据流进行命名,使其可以被后面的语句调用。
别名可以代表的 6 种数据结构:
数据结构 |
别名定义举例 | 句中别名 |
数据结构示例 |
---|---|---|---|
NODE | n(as nodes).e().n() | nodes | {id: , uuid: , schema: , values: {...}} |
EDGE | n().e({time > prev_e.time})[3].n() | prev_e | {uuid: , schema: , from: , from_uuid: , to: , to_uuid: , values: {...}} |
PATH | n().e().n() as paths | paths | {nodes: [<NODE> , <NODE> , ...], edges: [<EDGE> , <EDGE> , ...]} |
ATTR | uncollect ["Alice","Paal"] as name uncollect ["1993-06-12","1989-03-26"] as birthday |
name birthday |
无内部结构的原子型数据,如字符串,数字等 |
ARRAY | n().e()[3].n() as paths with pedges(paths) as edgeUUIDs |
edgeUUIDs |
[<ATTR> , <ATTR> , ...] |
TABLE | uncollect ["Alice","Paal"] as name uncollect ["1993-06-12","1989-03-26"] as birthday with table(name, birthday) as record |
record |
{headers: [], table_rows: [<ARRAY> , <ARRAY> , ...]} |
UQL 执行过程中如果有数据流未定义别名,或者定义了别名但未使用,可能会影响语句的合法性。在编写 UQL 语句时请避免遗漏定义别名或定义冗余别名。
自定义别名
自定义别名由开发者通过别名关键词 as
进行定义。上面表格中出现的 nodes,paths,name,birthday,edgeUUIDs 以及 record 都是自定义别名。
一个 UQL 语句中的不同查询、运算结果不允许重名,其尽量避免与同一语句中要使用的点或边的属性名重名,若无法避免,必要时可使用系统别名 this
消除歧义。
- 1 ~ 64 个字符
- 不能以波浪号 '~' 开头
- 不能包含反单引号 '`'
- 不能与《背景知识》中列出的所有保留字重复
- (别名中含有除数字、字母、下划线之外的字符时,在 UQL 语句中使用时需要用反引号(`)包裹)
自定义别名的数据结构:NODE,EDGE,PATH,ATTR,ARRAY,TABLE
自定义别名的生命周期:别名定义后的任何地方。
系统别名
系统别名是系统默认的别名,无需定义,可直接使用。系统别名有三个:
系统别名 |
含义 | 数据结构 |
生命周期 |
---|---|---|---|
this |
当前点/边 | NODE 或 EDGE | 所有查询语句的点、边参数过滤器中 |
prev_n |
当前点/边的前一个点 | NODE | 基础模板内的过滤器中 |
prev_e |
当前点/边的前一个边 | EDGE | 基础模板内的过滤器中 |
更多介绍见《路径与子图模板》-《prev_n》、《路径与子图模板》-《prev_e》。
在实际应用中,this
的使用相对较少,通常仅用于消除歧义;歧义是指点、边的属性名称和自定义别名重复,此时若要引用当前点、边的属性,则必须使用 this
。
... as balance
find().nodes({this.balance > 5000})
注:本例中 nodes()
中的 this.balance
表示当前节点的属性 balance;由于其前一句中定义的别名 balance 在当前语句内有效,如果在 nodes()
中直接使用 balance
则会与点属性 balance 的含义相冲突,因此需使用 this
。
别名调用
假设别名 nodes、edges、paths、attr、array、table 的结构分别为 NODE,EDGE,PATH,ATTR,ARRAY 和 TABLE,有如下调用形式:
调用格式 | 调用结构 |
调用位置 | 调用内容 |
---|---|---|---|
nodes |
NODE | 在任何位置调用 | 点,不携带任何自定义属性 |
nodes.<property> |
ATTR | 在任何位置调用 | 点的某个属性(属性不存在时,调用结果为null ) |
nodes.@ |
ATTR | 在任何位置调用 | 点的 schema |
nodes{<property>, ...} |
NODE | 在 RETURN 子句中调用 | 点,携带若干自定义属性 |
nodes{*} |
NODE | 在 RETURN 子句中调用 | 点,携带全部自定义属性 |
edges |
EDGE | 在任何位置调用 | 边,不携带任何自定义属性 |
edges.<property> |
ATTR | 在任何位置调用 | 边的某个属性(属性不存在时,调用结果为null ) |
edges.@ |
ATTR | 在任何位置调用 | 边的 schema |
edges{<property>, ...} |
EDGE | 在 RETURN 子句中调用 | 边,携带若干自定义属性 |
edges{*} |
EDGE | 在 RETURN 子句中调用 | 边,携带全部自定义属性 |
paths |
PATH | 在任何位置调用 | 路径,其中的点、边不携带任何自定义属性 |
paths{<property>, ...}{<property>, ...} |
PATH | 在 RETURN 子句中调用 | 路径,其中的点、边各自携带若干自定义属性 |
paths{*}{<property>, ...} |
PATH | 在 RETURN 子句中调用 | 路径,其中的点携带全部自定义属性,边携带若干自定义属性 |
paths{<property>, ...}{*} |
PATH | 在 RETURN 子句中调用 | 路径,其中的点携带若干自定义属性,边携带全部自定义属性 |
paths{*} |
PATH | 在 RETURN 子句中调用 | 路径,其中的点、边携带全部自定义属性 |
attr |
ATTR | 在任何位置调用 | 原子型数据本身 |
array |
ARRAY | 在任何位置调用 | 数组本身 |
array[n] |
ATTR | 在任何位置调用 | 数组中下标为 n 的元素 |
array[n1:n2] |
ARRAY | 在任何位置调用 | 由下标为 n1~n2 的元素构成的数组 |
array[:n] |
ARRAY | 在任何位置调用 | 由下标为 0~n 的元素构成的数组 |
array[n:] |
ARRAY | 在任何位置调用 | 由下标为 n~<长度-1> 的元素构成的数组 |
table |
TABLE | 在 RETURN 子句中调用 | 表格本身 |
RETURN 子句中的 NODE、EDGE、PATH 结构默认携带点、边的 schema 及系统属性(_uuid, _id, _from, _to, _from_uuid, _to_uuid)。
更多关于 RETURN 子句的使用请阅读《数据流|子句》。