跳转至

复合查询(子句结构)

复合查询将来自不同请求的数据放在一起,然后进行过滤、分组或者排序等,最后返回结果。

Nebula Graph支持三种方式进行复合查询(或子查询):

  • (OpenCypher语句)连接各个子句,让它们在彼此之间提供中间结果集。
  • (nGQL扩展)多个查询可以合并处理,以英文分号(;)分隔,返回最后一个查询的结果。
  • (nGQL扩展)可以用管道符(|)将多个查询连接起来,上一个查询的结果可以作为下一个查询的输入。

OpenCypher兼容性

在复合查询中,请不要混用OpenCypher语句和nGQL扩展语句,例如MATCH ... | GO ... | YIELD ...,混用两种语句,行为是未定义的。

  • 如果您使用OpenCypher语句(MATCHRETURNWITH等),请不要使用管道符或分号组合子句。
  • 如果您使用nGQL扩展语句(FETCHGOLOOKUP等),必须使用管道符或分号组合子句。

复合查询不支持事务

例如一个查询由三个子查询A、B、C组成,A是一个读操作,B是一个计算操作,C是一个写操作,如果在执行过程中,任何一个操作执行失败,则整个结果是未定义的:没有回滚,而且写入的内容取决于执行程序。

说明: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 follow._dst AS id | \
        GO FROM $-.id OVER serve YIELD $$.team.name AS Team, \
        $^.player.name AS Player;
        +---------+-------------+
        | Team    | Player      |
        +---------+-------------+
        | Nuggets | Tony Parker |
        +---------+-------------+
    

最后更新: 2021年3月23日