集合运算符
所有集合运算符的优先级相同,如果一个nGQL语句中有多个集合运算符,Nebula Graph会从左到右进行计算,除非用括号指定顺序。
集合运算符仅适用于原生nGQL。
运算符
UNION DISTINCT
(或使用缩写UNION
)返回两个集合A和B的并集,不包含重复的元素。运算符
UNION ALL
返回两个集合A和B的并集,包含重复的元素。
# 返回两个查询结果的并集,不包含重复的元素。
nebula> GO FROM "player102" OVER follow \
UNION \
GO FROM "player100" OVER follow;
+-------------+
| follow._dst |
+-------------+
| "player100" |
| "player101" |
| "player125" |
+-------------+
# 返回两个查询结果的并集,包含重复的元素。
nebula> GO FROM "player102" OVER follow \
UNION ALL \
+-------------+
| follow._dst |
+-------------+
| "player100" |
| "player101" |
| "player125" |
+-------------+
# UNION也可以和YIELD语句一起使用,去重时会检查每一行的所有列,每列都相同时才会去重。
nebula> GO FROM "player102" OVER follow \
YIELD dst(edge) AS id, properties(edge).degree AS Degree, properties($$).age AS Age \
UNION /* DISTINCT */ \
GO FROM "player100" OVER follow \
YIELD dst(edge) AS id, properties(edge).degree AS Degree, properties($$).age AS Age;
+-------------+--------+-----+
| id | Degree | Age |
+-------------+--------+-----+
| "player100" | 75 | 42 |
| "player101" | 75 | 36 |
| "player101" | 95 | 36 |
| "player125" | 95 | 41 |
+-------------+--------+-----+
运算符
INTERSECT
返回两个集合A和B的交集。left
和right
必须有相同数量的列和数据类型。如果需要转换数据类型,请参见类型转换。
nebula> GO FROM "player102" OVER follow \
YIELD dst(edge) AS id, properties(edge).degree AS Degree, properties($$).age AS Age \
GO FROM "player100" OVER follow \
YIELD dst(edge) AS id, properties(edge).degree AS Degree, properties($$).age AS Age;
+----+--------+-----+
| id | Degree | Age |
+----+--------+-----+
+----+--------+-----+
运算符返回两个集合A和B的差异,即A-B
。请注意left
和right
的顺序,A-B
表示在集合A中,但是不在集合B中的元素。
nebula> GO FROM "player100" OVER follow \
MINUS \
GO FROM "player102" OVER follow;
+-------------+
| follow._dst |
+-------------+
| "player125" |
+-------------+
nebula> GO FROM "player102" OVER follow \
MINUS \
GO FROM "player100" OVER follow;
+-------------+
| follow._dst |
+-------------+
| "player100" |
+-------------+
当查询包含集合运算符和管道符(|)时,的优先级高。例如GO FROM 1 UNION GO FROM 2 | GO FROM 3
相当于GO FROM 1 UNION (GO FROM 2 | GO FROM 3)
。
该查询会先执行红框内的语句,然后执行绿框的UNION
操作。
圆括号可以修改执行的优先级,例如:
nebula> (GO FROM "player102" OVER follow \
YIELD dst(edge) AS play_dst \
UNION \
GO FROM "team200" OVER serve REVERSELY \
该查询中,圆括号包裹的部分先执行,即先执行UNION
操作,再将结果结合管道符进行下一步操作。