数据流
数据流是指 UQL 运行时产生的一行一行的数据。在一段 UQL 语句中,链式语句(针对点、边、路径的插入、修改、查询)和子句都可以接收、输出数据流。
数据流中可以同时有多个数据列存在,各列的长度即为各列数据的行数。数据列通常需要定义别名才能被后面的语句使用,一个数据列的结构类型等同于其别名的结构类型(NODE、EDGE、PATH、ATTR、ARRAY、TABLE),可参考《查询》章节中关于别名的介绍。
同源列
从一个语句(链式语句或子句)输出的一个或多个数据列,以及作为该语句的输入的一个或多个数据列(如有),这些列都是同源列。在 UQL 执行期间(RETURN 子句中进行去重操作时除外),同源列的长度是相等的,各列处于同一行中的数据有对应关系。
示例:下图中的模板查询语句查到了 5 条路径,路径的终点和长度(边数)这两个数据列和路径为同源列,也都含有 5 条数据:

如果对同源列中的某一列进行了去重(列长度变小)操作,此时可能会对其它同源列的长度产生影响,详情见后面 WITH 及 RETURN 的介绍。
非同源列
从无关联的两个或更多语句输出的数据列是非同源列。非同源列的长度通常不相同,行内的数据也没有对应关系。
示例:下图中的两个 K 邻查询语句产生的两个数据列为非同源列,长度分别为 3 和 5:

数据流与链式语句
数据流作为链式语句的输入时,该语句执行的次数就是该数据流的长度,每次执行使用流中的一行数据(系统会根据实际情况进行优化)。
示例:下图中的模板查询语句查到了若干条路径,这些路径的终点去重后共有 4 个节点,可以认为其后的删除语句共执行 4 次,每次删除一个节点:

由于使用数据流作为输入而执行了多次的查询语句,产生的数据列的长度等于其每次查询到的结果的总数。
示例:下图中的模板查询语句查到了蓝、红两个节点,可以认为其后的点查询语句执行第一次时查到两个蓝色节点,执行第二次时查到三个红色节点,共 5 条数据:

示例:下图中的两个模板查询语句产生了两个非同源列,长度分别为 3 和 2。按照最短长度 2 对较长的数据流进行裁剪,最终共有两行数据传入了第三个查询语句中,并得到了 3 条查询结果:

非同源列进入链式语句时,会按照最短列的长度对各列进行裁剪,即语句的执行次数等于最短列的长度。在 UQL 执行过程中对非同源列进行裁剪并没有太大的实际意义,更多情况下,非同源列需要被处理为同源列后再进入后面的语句,详情见后面 WITH 的介绍。
数据流与子句
不同的子句对数据流的处理能力不同。有些子句只能处理同源列,如 GROUP BY、ORDER BY、LIMIT、SKIP、UNCOLLECT,有些子句可以处理同源列,也可以处理非同源列,如 WITH、RETURN、WHERE;无论是否为同源列,经子句处理之后都是同源列。详情见后面各个子句的介绍。
绝大数多数子句都需要明确指定待处理的数据列;个别子句(如 SKIP、LIMIT)则不需要明确指定,它们的处理对象是它们所紧随的子句的处理结果。