命令、参数
用基础模板组装成路径并进行查询,可以对路径中的每个点、边进行过滤、对环路进行去除,比此前介绍的 AB 路径查询、K 邻居查询等更为灵活。
语法:
- 命令:无
- 必选参数:基础模板
- 其他参数:(见下表)
- 语句别名类型:PATH
参数 | 类型 | 规范 | 描述 | 参数别名类型 |
---|---|---|---|---|
no_circle() |
/ | / | 不返回含有环路成分的路径,环路成分的定义可参见《背景知识》中的术语介绍 | 不支持自定义别名 |
limit() |
int | -1 或 >=0 | 模板路径查询单次执行时返回结果的条数,-1 表示返回所有结果 | 不支持自定义别名 |
路径模板支持使用前缀
optional
,此时如果查询结果为空,则返回一条伪路径 0-0-...-0,即路径上的所有点、边 UUID 均为 0。
1 步查询
示例:参考下图所示的路径结构,查询某顾客的银行卡给另一个顾客的银行卡转账的行为,返回 10 条结果并携带全部信息
n({@customer}).re({@has}).n({@card})
.re({@transfer}).n({@card})
.le({@has}).n({@customer}) as p
limit 10
return p{*}
N 步查询
示例:参考下图所示的路径结构,查询顾客 CU001 的银行卡向外 3 步转账的路径,返回 10 条结果并携带全部信息
n({_id == "CU001"}).re({@has}).n({@card})
.re({@transfer})[3].n({@card}) as p
limit 10
return p{*}
1~N 步查询
示例:查询顾客 CU001 的银行卡向外 1~3 步转账的路径,返回 10 条结果并携带全部信息
n({_id == "CU001"}).re({@has}).n({@card})
.re({@transfer})[:3].n({@card})
.le({@has}).n({@customer}) as p
limit 10
return p{*}
M~N 步查询
示例:查询顾客 CU001 的银行卡向外 2~3 步转账的路径,返回 10 条结果并携带全部信息
n({_id == "CU001"}).re({@has}).n({@card})
.re({@transfer})[2:3].n({@card})
.le({@has}).n({@customer}) as p
limit 10
return p{*}
无权重最短路径查询
示例:参考下图所示的路径结构,查询由顾客 CU001 向顾客 CU002 转账的 3 步以内的最短路径,返回 10 条结果并携带全部信息
n({_id == "CU001"}).re({@has}).n({@card} as n1)
n({_id == "CU002"}).re({@has}).n({@card} as n2)
with n1, n2
n(n1).re({@transfer})[*:3].n(n2) as p
limit 10
return p{*}
分析:本例先使用两个模板路径查询分别找到 CU001 和 CU002 两个顾客的银行卡,再用此二人的银行卡作为转账路径的起点、终点进行最短路径查询。
环路查询
示例:参考下图所示的路径结构,查询顾客 CU001 的银行卡参与的 4 步之内的单一方向转账环路,返回 10 条结果并携带全部信息
n({_id == "CU001"}).re({@has}).n({@card} as n)
.re({@transfer})[:4].n(n) as p
limit 10
return p{*}
去除环路查询
示例:查询顾客 CU001 的银行卡参与的 4 步之内的单一方向转账路径,去除环路,返回 10 条结果并携带全部信息
n({_id == "CU001"}).re({@has}).n({@card})
.re({@transfer})[:4].n({@card})
.no_circle() as p
limit 10
return p{*}
单次查询数量限制
示例:查找从银行卡 CA001、CA002、CA005 到银行卡 CA016 的 3 步以内的路径,每组起止点之间返回 2 条路经,携带全部信息
find().nodes({_id in ["CA001", "CA002", "CA005"]}) as n
n(n).e()[:3].n({_id == "CA016"})
.limit(2) as p
return p{*}
OPTIONAL
示例:查找从银行卡 CA001、CA002、CA005 到银行卡 CA016 的 3 步以内的路径,每组起止点之间返回 2 条路经,携带全部信息,没有路径则返回伪路径
find().nodes({_id in ["CA001", "CA002", "CA005"]}) as n
optional n(n).e()[:3].n({_id == "CA016"})
.limit(2) as p
return p{*}
0~N 步查询 4.1
示例:查找浏览或购买过商品 P001 的顾客,再到他们 0~2 步的其他顾客,携带全部信息
n({_id == "P001"}).e().n({@customer})
.e()[0:2].n({@customer}) as p
return p{*}
分析:在 0~N 步查询中如果期待 0 步生效,需要该边前后的两个单点模板 n() 中具有相同的过滤条件。
步间过滤
示例:查找从银行卡 CA001 到 CA002 的 4 步以内的转出账路径,要求转账时间 time 递增,返回 10 条结果并携带全部信息
n({_id == "CA001"}).re({@transfer.time > prev_e.time})[:4].n({_id == "CA002"}) as p
limit 10
return p{*}