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 也在结果里面表示出来。