复合查询(子句结构)¶
复合查询将来自不同请求的数据放在一起,然后进行过滤、分组或者排序等,最后返回结果。
NebulaGraph 支持三种方式进行复合查询(或子查询):
- (opencypher 兼容语句)连接各个子句,让它们在彼此之间提供中间结果集。
- (原生 nGQL)多个查询可以合并处理,以英文分号(;)分隔,返回最后一个查询的结果。
- (原生 nGQL)可以用管道符(|)将多个查询连接起来,上一个查询的结果可以作为下一个查询的输入。
OpenCypher 兼容性¶
在复合查询中,请不要混用 opencypher 兼容语句和原生 nGQL 语句,例如MATCH ... | GO ... | YIELD ...
。
- 如果使用 openCypher 兼容语句(
MATCH
、RETURN
、WITH
等),请不要使用管道符或分号组合子句。
- 如果使用原生 nGQL 语句(
FETCH
、GO
、LOOKUP
等),必须使用管道符或分号组合子句。
复合查询不支持事务¶
例如一个查询由三个子查询 A、B、C 组成,A 是一个读操作,B 是一个计算操作,C 是一个写操作,如果在执行过程中,任何一个操作执行失败,则整个结果是未定义的:没有回滚,而且写入的内容取决于执行程序。
Note
openCypher 没有事务要求。
示例¶
- opencypher 兼容语句
# 子句连接多个查询。 nebula> MATCH p=(v:player{name:"Tim Duncan"})--() \ WITH nodes(p) AS n \ UNWIND n AS n1 \ RETURN DISTINCT n1;
- 原生 nGQL(分号)
# 只返回边。 nebula> SHOW TAGS; SHOW EDGES; # 插入多个点。 nebula> INSERT VERTEX player(name, age) VALUES "player100":("Tim Duncan", 42); \ INSERT VERTEX player(name, age) VALUES "player101":("Tony Parker", 36); \ INSERT VERTEX player(name, age) VALUES "player102":("LaMarcus Aldridge", 33);
- 原生 nGQL(管道符)
# 管道符连接多个查询。 nebula> GO FROM "player100" OVER follow YIELD dst(edge) AS id | \ GO FROM $-.id OVER serve YIELD properties($$).name AS Team, \ properties($^).name AS Player; +-----------+-----------------+ | Team | Player | +-----------+-----------------+ | "Spurs" | "Tony Parker" | | "Hornets" | "Tony Parker" | | "Spurs" | "Manu Ginobili" | +-----------+-----------------+
最后更新:
September 4, 2023