首先思考一个零售场景中非常常见的搜索:查询从账户U001向账户U002进行的7步以内的银行卡转账路径。

基于模板的不定长路径查询及步间过滤
相信经过了前面一节的讲解,上面图示中的那行UQL语句已经足够不言自明:不定长路径部分就在re()[:7],它指定搜索深度不超过7层;当然,还可以将其修改为re()[5:7],代表从5层到7层的路径深度;或者re()[7],也就是正好7层;还可以是re()[*:7],表示不超过7层的最短路径。
这是一个通过控制模板参数个数而实现的递归,不仅如此,它还能在模板之间进行步间过滤。步间过滤(inter-step filtering)是指用与点、边相邻的元数据的属性值对该点、边进行过滤。引用相邻元数据时使用prev_n、prev_e两种系统别名,分别表示当前元数据的前一个点、前一条边(所谓路径中的“前”是指向路径起点的方向,“后”则是指向路径终点的方向)。
上图中不定长部分re()[:7]中所填写的过滤条件 {@tansfer.time > prev_e.time} 就是一个步间过滤,该过滤条件要求路径中的每条边上的交易时间都晚于其前面一条边上的交易时间,这是因为当路径中的交易时间成升序排序时,才是一条真正意义上的 “转账路径”。
需要说明的是,UQL中的不定长路径设置不仅在模板查询中可以找到,在任何一种图遍历相关的UQL命令中都能找到它的身影,只是书写形式略有不同——非模板查询中的的不定长设置是参数 depth()。