修改密码

请输入密码
请输入密码 请输入8-64长度密码 和 email 地址不相同 至少包括数字、大写字母、小写字母、半角符号中的 3 个
请输入密码
提交

修改昵称

当前昵称:
提交

搜索
v4.0
    v4.0

    CALL 子查询(V4.1)

     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)
    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 1 END as c1
      optional n(n2 as a2).e({@transfer})[:2].n({_id == "CA029"}).limit(1) 
      with CASE a2 when 0 then 0 else 1 END as c2
      return (c1+c2)*0.5 as c
    }
    return e{*}, c
    

    解析:CALL 子句对流入其内的每一行 n1、n2 都计算出一个 c,c 的长度与 n1、n2 的同源列 b 的长度相等。

    请完成以下信息后可下载此书
    *
    公司名称不能为空
    *
    公司邮箱必须填写
    *
    你的名字必须填写
    *
    你的电话必须填写
    *
    你的电话必须填写