• GO 语法
    • 示例
    • 沿着多种类型的边进行遍历

    GO 语法

    GONebula Graph 中最常用的关键字,可以指定过滤条件(如WHERE)遍历图数据并获取点和边的属性,还能以指定顺序(ORDER BY ASC | DESC)返回指定数目(LIMIT)的结果。

    GO 的用法与 SQL 中的 SELECT 类似,重要区别是 GO 必须从遍历一系列的节点开始。

    1. GO FROM <node_list>
    2. OVER <edge_type_list>
    3. WHERE (expression [ AND | OR expression ...])
    4. YIELD | YIELDS [DISTINCT] <return_list>
    5. <node_list>
    6. | vid [, vid ...]
    7. | $-.id
    8. <edge_type_list>
    9. edge_type [, edge_type ...]
    10. <return_list>
    11. <col_name> [AS <col_alias>] [, <col_name> [AS <col_alias>] ...]
    • 为逗号隔开的节点 ID,或特殊占位符 $-.id (参看 PIPE 用法)。
    • 为图遍历返回的边类型列表。
    • WHERE 指定被筛选的逻辑条件,WHERE 可用于起点,边及终点,同样支持逻辑关键词AND,OR,NOT,详情参见 WHERE 的用法。
    • YIELD [DISTINCT] 以列的形式返回结果,并可对列进行重命名。详情参看 YIELD用法。DISTINCT 的用法与 SQL 相同。

    示例

    1. nebula> GO FROM 101 OVER serve \
    2. /* 从点 101 出发,沿边 serve,找到点 204,215 */
    3. =======
    4. | id |
    5. =======
    6. | 204 |
    7. -------
    8. | 215 |
    9. -------
    1. nebula> GO FROM 101 OVER serve \
    2. WHERE serve.start_year > 1990 /* 筛选边 serve 的 start_year 属性 */ \
    3. YIELD $$.team.name AS team_name /* 目标点 team 的 serve.start_year 属性 serve.start_year */
    4. ================================
    5. | team_name | serve.start_year |
    6. ================================
    7. | Spurs | 1999 |
    8. --------------------------------
    9. | Hornets | 2018 |
    10. --------------------------------
    1. nebula> GO FROM 100,102 OVER serve \
    2. WHERE serve.start_year > 1995 /* 筛选边属性*/ \
    3. YIELD DISTINCT $$.team.name AS team_name, /* DISTINCT 与 SQL 用法相同 */ \
    4. serve.start_year, /* 边属性 */ \
    5. $^.player.name AS player_name /* 起点 (player) 属性 */
    6. ========================================================
    7. | team_name | serve.start_year | player_name |
    8. ========================================================
    9. | Trail Blazers | 2006 | LaMarcus Aldridge |
    10. --------------------------------------------------------
    11. | Spurs | 2015 | LaMarcus Aldridge |
    12. --------------------------------------------------------
    13. | Spurs | 1997 | Tim Duncan |
    14. --------------------------------------------------------

    沿着多种类型的边进行遍历

    目前 Nebula Graph 还支持 GO 沿着多条边遍历,语法为:

    1. GO FROM <node_list> OVER <edge_type_list | *> YIELD | YIELDS [DISTINCT] <return_list>

    例如:

    1. nebula> GO FROM <node_list> OVER edge1, edge2.... //沿着 edge1 和 edge2 遍历,或者
    2. nebula> GO FROM <node_list> OVER * //这里 * 意味着沿着任意类型的边遍历

    请注意,当沿着多种类型边遍历时,对于使用过滤条件有特别限制(也即 WHERE 语句),比如 WHERE edge1.prop1 > edge2.prop2 这种过滤条件是不支持的。

    对于返回的结果,如果存在多条边的属性需要返回,会把他们放在不同的行。比如:

    1. nebula> GO FROM 100 OVER edge1, edge2 YIELD edge1.prop1, edge2.prop2

    如果 100 这个顶点存在 3 条类型为 edge1 的边, 2 条类型为 edge2 的边,最终的返回结果会有 5 行,如下所示:

    edge1._prop1 edge2._prop2
    10 “”
    20 “”
    30 “”
    0 “nebula”
    0 “vesoft”

    没有的属性当前会填充默认值, 数值型的默认值为 0, 字符型的默认值为空字符串。bool 类型默认值为 false,timestamp 类型默认值为 0 (即 “1970-01-01 00:00:00”),double 类型默认值为 0.0。

    当然也可以不指定 YIELD, 这时会返回每条边目标点的 vid。如果目标点不存在,同样用默认值(此处为 0)填充。比如 GO FROM 100 OVER edge1, edge2,返回结果如下:

    edge1._dst edge2._dst
    101 0
    102 0
    103 0
    0 201
    0 202

    对于 GO FROM 100 OVER * 这样的例子来说,返回结果也和上面例子类似:不存在的属性或者 vid 使用默认值来填充。请注意从结果里面是没有办法分辨每一行属于哪条边, 未来版本会把 edge type 也在结果里面表示出来。