别名的结构类型
别名,英文是 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 个字符
- 必须以字母开头
- 仅允许使用字母,下划线和数字(即 _ 、A-Z、a-z、0-9)
- 不能与《背景知识》中列出的任何保留字重复
自定义别名的结构类型:NODE,EDGE,PATH,ATTR,ARRAY,TABLE
自定义别名的生命周期:别名定义后的任何地方。
在极个别情况下,自定义别名可能无法被其后相隔较远的语句调用,可通过在 WITH 子句重新定义该别名来解决此问题。
系统别名
系统别名是系统默认存在的别名。系统别名有三个,分别是 prev_n
,prev_e
和 this
,无需定义,可直接使用。
系统别名 | 含义 | 结构类型 | 生命周期 |
---|---|---|---|
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
。
别名调用
调用 ATTR,ARRAY 和 TABLE 这三类别名时,将完整的调用其所代表的数据结构。
调用 NODE,EDGE 和 PATH 这三类别名时,根据调用形式的不同可能会调用整个 JSON 结构,或调用仅含一部分键值的 JSON 结构,或仅调用结构中的某个键值。
假设别名 nodes、edges、paths 的类型分别为NODE,EDGE 和 PATH,有如下调用形式:
RETURN 子句中的 NODE、EDGE、PATH 默认携带点、边的 schema 及系统属性(
_uuid
,_id
,_from
,_to
,_from_uuid
,_to_uuid
),下表中不再赘述。
调用形式 | 调用类型 |
调用途径 | 含义 |
---|---|---|---|
nodes |
NODE | 在任何位置调用 | 点,不携带任何自定义属性 |
nodes.<property> |
ATTR | 在任何位置调用 | 点的某个属性(该指定属性不存在时,该调用的值为空,下同) |
nodes.@ |
ATTR | 在任何位置调用 | 点的 schema |
nodes{<property>, ...} |
NODE | 在 RETURN 子句中调用 | 点,携带若干自定义属性 |
nodes{*} |
NODE | 在 RETURN 子句中调用 | 点,携带全部自定义属性 |
edges |
EDGE | 在任何位置调用 | 边,不携带任何自定义属性 |
edges.<property> |
ATTR | 在任何位置调用 | 边的某个属性 |
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 子句中调用 | 路径,其中的点、边携带全部自定义属性 |
使用者可以在后续的阅读中逐步理解以上概念。
更多关于 return
的使用请阅读《数据流、子句》。