LIMIT¶
LIMIT
子句限制输出结果的行数。LIMIT
在原生 nGQL 语句和 openCypher 兼容语句中的用法有所不同。
- 在原生 nGQL 语句中,一般需要在
LIMIT
子句前使用管道符,可以直接在 LIMIT 语句后设置或者省略偏移量参数。
-
在 openCypher 兼容语句中,不允许在
LIMIT
子句前使用管道符,可以使用SKIP
指明偏移量。Note
在原生 nGQL 或 openCypher 方式中使用
LIMIT
时,使用ORDER BY
子句限制输出顺序非常重要,否则会输出一个不可预知的子集。
历史版本兼容性
Nebula Graph 2.6.0 中,GO
语句支持了新的LIMIT
语法。部分LIMIT
相关的算子支持计算下推。
原生 nGQL 语句中的 LIMIT¶
在原生 nGQL 中,LIMIT
有通用语法和GO
语句中的专属语法。
原生 nGQL 中的通用 LIMIT 语法¶
原生 nGQL 中的通用LIMIT
语法与SQL
中的LIMIT
原理相同。LIMIT
子句接收一个或两个参数,参数的值必须是非负整数,且必须用在管道符之后。语法和说明如下:
... | LIMIT [<offset>,] <number_rows>;
参数 | 说明 |
---|---|
offset |
偏移量,即定义从哪一行开始返回。索引从0 开始。默认值为0 ,表示从第一行开始返回。 |
number_rows |
返回的总行数。 |
示例:
# 从结果中返回最前面的 3 行数据。
nebula> LOOKUP ON player |\
LIMIT 3;
+-------------+
| VertexID |
+-------------+
| "player100" |
| "player101" |
| "player102" |
+-------------+
# 从排序后结果中返回第 2 行开始的 3 行数据。
nebula> GO FROM "player100" OVER follow REVERSELY \
YIELD properties($$).name AS Friend, properties($$).age AS Age \
| ORDER BY $-.Age, $-.Friend \
| LIMIT 1, 3;
+-------------------+-----+
| Friend | Age |
+-------------------+-----+
| "Danny Green" | 31 |
| "Aron Baynes" | 32 |
| "Marco Belinelli" | 32 |
+-------------------+-----+
GO 语句中的 LIMIT¶
GO
语句中的LIMIT
除了支持原生 nGQL 中的通用语法外,还支持根据边限制输出结果数量。
语法:
<go_statement> LIMIT <limit_list>;
limit_list
是一个列表,列表中的元素必须为自然数,且元素数量必须与GO
语句中的STEPS
的最大数相同。下文以GO 1 TO 3 STEPS FROM "A" OVER * LIMIT <limit_list>
为例详细介绍LIMIT
的这种用法。
- 列表
limit_list
必须包含 3 个自然数元素,例如GO 1 TO 3 STEPS FROM "A" OVER * LIMIT [1,2,4]
。 LIMIT [1,2,4]
中的1
表示系统在第一步时自动选择 1 条边继续遍历,2
表示在第二步时选择 2 条边继续遍历,4
表示在第三步时选择 4 条边继续遍历。- 因为
GO 1 TO 3 STEPS
表示返回第一到第三步的所有遍历结果,因此下图中所有红色边和它们的原点与目的点都会被这条GO
语句匹配上,而黄色边表示GO
语句遍历时没有选择的路径。如果不是GO 1 TO 3 STEPS
而是GO 3 STEPS
,则只会匹配上第三步的红色边和它们两端的点。
在 basketballplayer 数据集中的执行示例如下:
nebula> GO 3 STEPS FROM "player100" \
OVER * \
YIELD properties($$).name AS NAME, properties($$).age AS Age \
LIMIT [3,3,3];
+-----------------+--------------+
| NAME | Age |
+-----------------+--------------+
| "Spurs" | UNKNOWN_PROP |
| "Tony Parker" | 36 |
| "Manu Ginobili" | 41 |
+-----------------+--------------+
nebula> GO 3 STEPS FROM "player102" \
OVER * \
LIMIT [rand32(5),rand32(5),rand32(5)];
+------------+-------------+
| serve._dst | follow._dst |
+------------+-------------+
| "team204" | |
| "team215" | |
| | "player100" |
+------------+-------------+
openCypher 兼容语句中的 LIMIT¶
在MATCH
等 openCypher 兼容语句中使用 LIMIT 不需要加管道符。语法和说明如下:
... [SKIP <offset>] [LIMIT <number_rows>];
参数 | 说明 |
---|---|
offset |
偏移量,即定义从哪一行开始返回。索引从0 开始。默认值为0 ,表示从第一行开始返回。 |
number_rows |
返回的总行数量。 |
offset
和number_rows
可以使用表达式,但是表达式的结果必须是非负整数。
Note
两个整数组成的分数表达式会自动向下取整。例如8/6
向下取整为 1。
单独使用 LIMIT¶
LIMIT
可以单独使用,返回指定数量的结果。
nebula> MATCH (v:player) RETURN v.name AS Name, v.age AS Age \
ORDER BY Age LIMIT 5;
+-------------------------+-----+
| Name | Age |
+-------------------------+-----+
| "Luka Doncic" | 20 |
| "Ben Simmons" | 22 |
| "Kristaps Porzingis" | 23 |
| "Giannis Antetokounmpo" | 24 |
| "Kyle Anderson" | 25 |
+-------------------------+-----+
nebula> MATCH (v:player) RETURN v.name AS Name, v.age AS Age \
ORDER BY Age LIMIT rand32(5);
+-------------------------+-----+
| Name | Age |
+-------------------------+-----+
| "Luka Doncic" | 20 |
| "Ben Simmons" | 22 |
| "Kristaps Porzingis" | 23 |
| "Giannis Antetokounmpo" | 24 |
+-------------------------+-----+
单独使用 SKIP¶
SKIP
可以单独使用,用于设置偏移量,返回指定位置之后的数据。
nebula> MATCH (v:player{name:"Tim Duncan"}) --> (v2) \
RETURN v2.name AS Name, v2.age AS Age \
ORDER BY Age DESC SKIP 1;
+-----------------+-----+
| Name | Age |
+-----------------+-----+
| "Manu Ginobili" | 41 |
| "Tony Parker" | 36 |
+-----------------+-----+
nebula> MATCH (v:player{name:"Tim Duncan"}) --> (v2) \
RETURN v2.name AS Name, v2.age AS Age \
ORDER BY Age DESC SKIP 1+1;
+---------------+-----+
| Name | Age |
+---------------+-----+
| "Tony Parker" | 36 |
+---------------+-----+
同时使用 SKIP 与 LIMIT¶
同时使用SKIP
与LIMIT
可以返回从指定位置开始的指定数量的数据。
nebula> MATCH (v:player{name:"Tim Duncan"}) --> (v2) \
RETURN v2.name AS Name, v2.age AS Age \
ORDER BY Age DESC SKIP 1 LIMIT 1;
+-----------------+-----+
| Name | Age |
+-----------------+-----+
| "Manu Ginobili" | 41 |
+-----------------+-----+