既然自定义别名及引用可以将路径中不同位置出现的节点声明为相同的点,那么子图(由多条路径交汇而形成的)也可以通过类似的方式得以声明并被查询到。
我们所谈论的正是UQL的子图查询命令graph(),其内可以定义多条模板路径,用别名声明这些路径之间的交汇点,即构成了一组子图过滤条件。
考虑这样一个伪冒开卡申请的识别功能:有人刻意使用虚假的开卡主体信息进行开卡申请,以达到大量开卡的目的,但是像邮箱、手机号、登录设备号等这些信息是不容易或者没办法作假的,于是有很多看似不同的申请主体实际上都使用了相同的邮箱、手机号、登录设备号。那么我们可以构建并查询这样一张子图,在该子图中有两份申请,都指向了相同的邮箱、手机号、登录设备号:

伪冒开卡申请识别
子图查询语句编写的关键是将子图拆分为多个路径,并声明它们的交汇节点。本例中可以将子图拆分为三条路径,即:申请1-邮箱-申请2、申请1-手机号-申请2、申请1-登录设备号-申请2,而这三条路径的起点和终点,也就是申请1和申请2即为路径的两个交汇点。
子图查询需要注意的是对查询结果的再处理。由于路径的拆分、或过滤条件的编写等原因,子图查询的结果可能会有冗余,这时如果无法在将查询语句写到最优,那就会需要手动去重。
相较于环路,子图已经超出了路径的范畴。环路尚且可以用“一笔画”的方式画出,但子图是绝对不可能的。用UQL进行子图查询也并非只有graph()命令可以使用,在不是很复杂的情况下,使用多个路径查询并配合子句with、where的使用,同样能达到子图查询的目的。