管道符¶
nGQL 支持使用管道符(|)将多个查询组合起来。
openCypher 兼容性¶
管道符仅适用于原生 nGQL。
语法¶
nGQL 和 SQL 之间的一个主要区别是子查询的组成方式。
- 在 SQL 中,子查询是嵌套在查询语句中的。
- 在 nGQL 中,子查询是通过类似 shell 中的管道符(
|
)实现的。
示例¶
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
。
性能提示¶
Nebula Graph 中的管道对性能有影响,以A | B
为例,体现在以下几个方面:
-
管道是同步操作。也即需要管道之前的子句
A
执行完毕后,数据才能整体进入管道子句。 -
管道本身是需要序列化和反序列化的,这个是单线程执行的。
-
如果
A
发大量数据给|
,整个查询请求的总体时延可能会非常大。此时可以尝试拆分这个语句:-
应用程序发送
A
, -
将收到的返回结果在应用程序拆分,
-
并发发送给多个 graphd,
-
每个 graphd 执行部分 B。
这样通常比单个 graphd 执行完整地
A | B
要快很多。 -
最后更新:
March 7, 2023