LIMIT

    • 在原生nGQL语句中,一般需要在LIMIT子句前使用管道符,可以直接在LIMIT语句后设置或者省略偏移量参数。

    • 在openCypher兼容语句中,不允许在LIMIT子句前使用管道符,可以使用SKIP指明偏移量。

      Note

      在原生nGQL或openCypher方式中使用LIMIT时,使用ORDER BY子句限制输出顺序非常重要,否则会输出一个不可预知的子集。

    历史版本兼容性

    Nebula Graph 2.6.0中,GO语句支持了新的LIMIT语法。部分LIMIT相关的算子支持计算下推。

    原生nGQL中的通用LIMIT语法与SQL中的LIMIT原理相同。LIMIT子句接收一个或两个参数,参数的值必须是非负整数,且必须用在管道符之后。语法和说明如下:

    示例:

    1. # 从结果中返回最前面的3行数据。
    2. nebula> LOOKUP ON player |\
    3. LIMIT 3;
    4. +-------------+
    5. | VertexID |
    6. +-------------+
    7. | "player100" |
    8. | "player101" |
    9. | "player102" |
    10. +-------------+
    11. # 从排序后结果中返回第2行开始的3行数据。
    12. nebula> GO FROM "player100" OVER follow REVERSELY \
    13. YIELD properties($$).name AS Friend, properties($$).age AS Age \
    14. | ORDER BY $-.Age, $-.Friend \
    15. | LIMIT 1, 3;
    16. +-------------------+-----+
    17. | Friend | Age |
    18. +-------------------+-----+
    19. | "Aron Baynes" | 32 |
    20. +-------------------+-----+

    GO语句中的LIMIT除了支持原生nGQL中的通用语法外,还支持根据边限制输出结果数量。

    语法:

    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,则只会匹配上第三步的红色边和它们两端的点。

    1. nebula> GO 3 STEPS FROM "player100" \
    2. OVER * \
    3. YIELD properties($$).name AS NAME, properties($$).age AS Age \
    4. LIMIT [3,3,3];
    5. +-----------------+--------------+
    6. | NAME | Age |
    7. +-----------------+--------------+
    8. | "Spurs" | UNKNOWN_PROP |
    9. | "Tony Parker" | 36 |
    10. | "Manu Ginobili" | 41 |
    11. +-----------------+--------------+
    12. nebula> GO 3 STEPS FROM "player102" \
    13. OVER * \
    14. LIMIT [rand32(5),rand32(5),rand32(5)];
    15. +------------+-------------+---------------------+
    16. | serve._dst | follow._dst | any_shape_edge._dst |
    17. +------------+-------------+---------------------+
    18. | "team204" | | |
    19. | "team215" | | |
    20. | | "player100" | |

    openCypher兼容语句中的LIMIT

    MATCH等openCypher兼容语句中使用LIMIT不需要加管道符。语法和说明如下:

    参数说明
    offset偏移量,即定义从哪一行开始返回。索引从0开始。默认值为0,表示从第一行开始返回。
    number_rows返回的总行数量。

    offsetnumber_rows可以使用表达式,但是表达式的结果必须是非负整数。

    Note

    两个整数组成的分数表达式会自动向下取整。例如8/6向下取整为1。

    LIMIT可以单独使用,返回指定数量的结果。

    1. ORDER BY Age LIMIT 5;
    2. +-------------------------+-----+
    3. | Name | Age |
    4. +-------------------------+-----+
    5. | "Luka Doncic" | 20 |
    6. | "Ben Simmons" | 22 |
    7. | "Kristaps Porzingis" | 23 |
    8. | "Giannis Antetokounmpo" | 24 |
    9. | "Kyle Anderson" | 25 |
    10. +-------------------------+-----+
    11. nebula> MATCH (v:player) RETURN v.name AS Name, v.age AS Age \
    12. ORDER BY Age LIMIT rand32(5);
    13. +-------------------------+-----+
    14. | Name | Age |
    15. +-------------------------+-----+
    16. | "Luka Doncic" | 20 |
    17. | "Ben Simmons" | 22 |
    18. | "Kristaps Porzingis" | 23 |
    19. | "Giannis Antetokounmpo" | 24 |
    20. +-------------------------+-----+

    SKIP可以单独使用,用于设置偏移量,返回指定位置之后的数据。

    1. nebula> MATCH (v:player{name:"Tim Duncan"}) --> (v2) \
    2. RETURN v2.name AS Name, v2.age AS Age \
    3. ORDER BY Age DESC SKIP 1 LIMIT 1;
    4. +-----------------+-----+
    5. | Name | Age |
    6. +-----------------+-----+

    最后更新: November 2, 2021