概述
过滤器(Filter)用于在获取点、边数据时根据它们的schema和属性值设置条件。
过滤器在查询子句中代表点或边的方法中使用,例如nodes()
和edges()
方法。
语法
UQL的过滤器是一个用花括号{ }
包裹的表达式,通常调用点、边的schema和属性。
示例:获取@user
点,以及rating
属性值大于3的@movie
点。
find().nodes({@user || @movie.rating > 3}) as n
return n{*}
过滤器一般返回bool类型的值(真或假)或null,并且只有判断结果为真的点或边才会被返回。
有时,过滤器中表达式的结果不是bool值也不是null,此时过滤器根据结果的类型和具体的值将结果转换为bool值:
类型 | 何时转为真 | 何时转为假 |
---|---|---|
int32,uint32,int64,uint64,float,double | 非零值 | 零值 |
string,text | 首个字符不是0 | 首个字符是0 |
datetime | 非0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
timestamp | 非1970-01-01 08:00:00 +08:00 | 1970-01-01 08:00:00 +08:00 |
point | 从不 | 任意值 |
list | 从不 | 任意值 |
示例:获取@user
点,并且要求点的age
属性值减33的结果不为0。
find().nodes({@user.age - 33}) as n
return n{*}
示例
一般过滤
在任意查询子句中,通过将点、边的schema和属性值与常量或别名进行比较来对点、边进行过滤。
find().nodes({@user.registeredOn >= "2021-09-01 09:00:00"}) as u1
with max(u1.age) as maxAge
find().nodes({@user.age == maxAge}) as u2
return u2
n(as start).e()[3].n({level == start.level}) as p
return p
注意:第二个点模板n()
使用了前面一个点模板中定义的别名。
一般情况下,属性可以直接在过滤器中使用,无需创建索引。不过,创建不同类型的索引可以有效地对查询过程进行加速,具体请参考加速机制。
步间过滤
在基于模板查询子句中,可使用系统别名prev_n和prev_e实现步间过滤。
n({@card}).e({@transfersTo.time > prev_e.time})[3].n({@card}) as p
return p
prev_n
和prev_e
调用的属性(即此例中的time属性)必须进行LTE加速。
有些路径查询命令(如ab()
)支持的方法path_ascend()
和path_descend()
也能实现类似步间过滤的效果,它们也要求使用的属性必须LTE。不过,这两个方法的内容不是以过滤器的形式书写的。
ab().src({_id == "A"}).dest({_id == "E"}).depth(:3).path_ascend(@default.weight) as p
return p{*}
全文过滤
在任意查询子句中,可使用已创建的全文索引对点、边进行过滤。
find().nodes({~content CONTAINS "graph computing parallel"}) as n
return n{*}