管道符

nGQL支持使用管道符(|)将多个查询组合起来。

openCypher兼容性

管道符仅适用于原生nGQL。

语法

nGQL和SQL之间的一个主要区别是子查询的组成方式。

  • 在SQL中,子查询是嵌套在查询语句中的。

  • 在nGQL中,子查询是通过类似shell中的管道符(|)实现的。

示例

  1. nebula> GO FROM "player100" OVER follow \
  2. YIELD follow._dst AS dstid, $$.player.name AS Name | \
  3. GO FROM $-.dstid OVER follow;
  4. +-------------+
  5. | follow._dst |
  6. +-------------+
  7. | "player101" |
  8. +-------------+

用户可以使用YIELD显式声明需要返回的结果,如果不使用YIELD,默认返回目标点ID。

必须在YIELD子句中为需要的返回结果设置别名,才能在管道符右侧使用引用符$-,例如示例中的$-.dstid

性能提示

Nebula Graph 2.5.0 中的管道对性能有影响,以A | B为例,体现在以下几个方面:

  1. 管道是同步操作。也即需要管道之前的子句A执行完毕后,数据才能整体进入管道子句。

  2. 管道本身是需要序列化和反序列化的,这个是单线程执行的。

  3. 如果A发大量数据给 |,整个查询请求的总体时延可能会非常大。此时可以尝试拆分这个语句:

    1. 应用程序发送A

    2. 将收到的返回结果在应用程序拆分,

    3. 并发发送给多个 graphd,

    4. 每个 graphd 执行部分 B。

    这样通常比单个graphd 执行完整地A | B要快很多。