跳转至

管道符Graph

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

openCypher 兼容性Graph

管道符仅适用于原生 nGQL。

语法Graph

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

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

示例Graph

nebula> GO FROM "player100" OVER follow \
        YIELD dst(edge) AS dstid, properties($$).name AS Name | \
        GO FROM $-.dstid OVER follow YIELD dst(edge);

+-------------+
| dst(EDGE)   |
+-------------+
| "player100" |
| "player102" |
| "player125" |
| "player100" |
+-------------+

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

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

性能提示Graph

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

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

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

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

    1. 应用程序发送A

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

    3. 并发发送给多个 graphd,

    4. 每个 graphd 执行部分 B。

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


最后更新: January 14, 2022