V4.1
格式、参数
CALL 可以在一个 UQL 语句中插入一个以 WITH 子句为开头、以 RETURN 子句为结尾的子查询语句,从而对每个输入行的查询结果进行独立的运算,而非对所有输入行的所有查询结果进行统一的运算。子查询可以帮助 GROUP BY、ORDER BY、LIMIT、SKIP 等子句以及聚合函数、去重函数对 UQL 中语句的单次执行结果进行处理。
语法:
- 格式:
call {
with<columnA1>
,<columnA2>
, ...
...
return<columnB1>
,<columnB2>
, ...
} - 参数:(见下表)
- 受影响列:
<columnA>
及其所有同源列;别名非同源时先截断至最短成为同源列后再进行计算
名称 | 类型 | 规范 | 描述 |
---|---|---|---|
<columnA> |
NODE,EDGE,PATH,ATTR,ARRAY,TABLE | / | UQL 主查询语句中的数据列 |
<columnB> |
NODE,EDGE,PATH,ATTR,ARRAY,TABLE | / | UQL 子查询语句的返回值,不能与主查询中的别名重名,可被其后的主查询语句调用 |
详解
find().nodes([1, 5]) as nodes
call {
with nodes
n(nodes).e()[:2].n() as p
limit 2
return p as path
}
return path
上面 UQL 代码中的 CALL 子句将主查询中的数据列分解为多个子查询,并对每次查询结果分别进行行数限制:

子查询内进行单次查询
示例:不使用 GROUP BY 子句,查询顾客 CU001、CU002、CU003 各自拥有多少张银行卡
uncollect ["CU001", "CU002", "CU003"] as user
call {
with user
n({_id == user}).e({@has}).n({@card} as n)
return count(n) as number
}
return user, number
解析:在 CALL 子句内,每个 user 的 n 分别进行聚合运算得到 number,相当于对所有 user 的 n 根据 user 分组并在组内进行聚合。
子查询内进行多次查询
示例:查找 10 笔转账金额大于 8,000 的边并为每一条边评分,如果边的起点、终点与银行卡 CA029 有过两步之内的转账行为,则为起点、终点加 0.5 分,起点、终点的得分总和即为该边的评分
n({@card} as n1).re({@transfer.amount > 8000} as e).n({@card} as n2).limit(10)
call {
with n1, n2
optional n(n1 as a1).e({@transfer})[:2].n({_id == "CA029"}).limit(1)
with CASE a1 when 0 then 0 else 0.5 END as c1
optional n(n2 as a2).e({@transfer})[:2].n({_id == "CA029"}).limit(1)
with CASE a2 when 0 then 0 else 0.5 END as c2
return c1+c2 as c
}
return e{*}, c
解析:n1、n2 分别为每条边 e 的起点和终点,CALL 子句对流入其内的每一条 e 的 n1、n2 都分别计算出分值 c1、c2,再求和为 c,c 即为每条 e 的总分值,其长度与 n1、n2、e 的长度相等。