格式、参数
WHERE 可以将数据流中满足条件的数据行保留,不满足条件的数据行舍弃。
语法:
- 格式 1:where
<condition>
- 格式 2:where
<query>
(开发中) - 参数:(见下表)
- 受影响列:
<condition>
、<query>
中的所有别名及其所有同源列;别名非同源时先截断至最短成为同源列后再进行计算
名称 | 类型 | 规范 | 描述 |
---|---|---|---|
<condition> |
filter | 过滤器去掉花括号 | 判断条件,为真的行被保留 |
<query> |
query | / | 查询语句,有查询结果的行被保留 |
WHERE 可以将一部分过滤条件从 Ultipa Filter 中拆解出来,提高语句的可读性;还可以实现与
graph()
命令等效的复杂的子图查询。
详解
find().nodes({shape == "square"}) as n1
find().nodes({shape == "round"}) as n2
where n1.color == n2.color
return n1, n2
上面 UQL 代码中的 WHERE 子句先将两个点查询语句输出的两个非同源列按照最短长度截断为三行,再按行进行筛选:
用条件表达式进行判断
示例:查询从银行卡 CA001 到 CA002 的 3 步转账路径,要求两张中介银行卡中至少有一张级别为 5
n({_id == "CA001"}).e().n({@card} as n1)
.e().n({@card} as n2)
.e().n({_id == "CA002"}) as p
where n1.level == 5 || n2.level == 5
return p{*}
用查询语句进行判断 (开发中)
示例:查找满足下图所示条件的中介银行卡 agent,即 CA002 经由 agent 向 CA001 转账,并且 agent 是 CA003 的 2Hop 以内的邻居:
n({_id == "CA002"}).re().n({@card} as agent).re().n({_id == "CA001"})
where n(agent).e()[*:2].n({_id == "CA003"})
return agent{*}
分析:where 子句对数据列 agent 做进一步过滤,对每一个 agent,查找其到 CA003 的 2 步以内的最短路径是否存在,如果存在,则将该 agent 传给后面的 return。
上面的例子可以用子图模板改写为:
graph([
n({_id == "CA002"}).re().n({@card} as agent).re().n({_id == "CA001"}),
n(agent).e()[*:2].n({_id == "CA003"})
])
return agent{*}