语句 ab().src().dest().depth()
可以查询从一个起点到一个终点的路径,支持对点、边进行过滤,还可以去除环路,并返回满足条件的路径。
语法:
- 语句别名:支持,结构为 PATH
- 全部参数:
参数 | 类型 | 规范 | 描述 | 参数别名结构 |
---|---|---|---|---|
src() |
filter | / | 路径起点的过滤条件;多个点满足条件时会报错 | NODE |
dest() |
filter | / | 路径终点的过滤条件;多个点满足条件时会报错 | NODE |
depth() |
range | >0 | 设置路径的深度 depth(N) : N 步 depth(:N) : 1~N 步 depth(M:N) : M~N 步 depth(N).shortest(<>) : N 步内的最短(或最小权重和)路径 |
不支持 |
shortest() |
/ 或 @<schema>.<property> |
数值类的边属性,需 LTE | 不指定边属性时,查询 N 步内最短路径;指定边属性时,查询 N 步内、边属于该 schema、且该属性权重和最小的路径 此时 depth() 参数需填写固定值 |
不支持 |
node_filter() |
filter | / | 中介点(非 src 、非 dest )的过滤条件 |
不支持 |
edge_filter() |
filter | / | 所有边的过滤条件 | 不支持 |
path_ascend() |
@<schema>.<property> |
数值、时间类型的边属性,需 LTE | 查找边属于该 schema、且该属性按步递增的路径 | 不支持 |
path_descend() |
@<schema>.<property> |
数值、时间类型的边属性,需 LTE | 查找边属于该 schema、且该属性按步递减的路径 | 不支持 |
direction() |
string | left, right | 规定边的方向 | 不支持 |
no_circle() |
/ | / | 不返回含有环路成分的路径,环路的定义可参见《背景知识》- 常用术语 | 不支持 |
limit() |
int | -1 或 >=0 | AB 路径查询单次执行时返回结果的条数,-1 表示返回所有结果 | 不支持 |
N 步查询
示例:查找从银行卡 CA001 到 CA002 的 4 步路径,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(4) as p
limit 10
return p{*}
1~N 步查询
示例:查找从银行卡 CA001 到 CA002 的 4 步以内的路径,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(:4) as p
limit 10
return p{*}
M~N 步查询
示例:查找从银行卡 CA001 到 CA002 的 2~4 步的路径,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(2:4) as p
limit 10
return p{*}
无权重最短路径查询
示例:查找从银行卡 CA001 到 CA002 的 4 步以内的最短路径,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(4)
.shortest() as p
limit 10
return p{*}
带权重最短路径查询
示例:查找从银行卡 CA001 到 CA002 的 4 步以内的最短路径,以 @transfer.amount 为权重,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(4)
.shortest(@transfer.amount) as p
limit 10
return p{*}
中介点过滤查询
示例:查找从银行卡 CA001 到 CA002 的 4 步以内的路径,要求中介点不是银行卡,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(:4)
.node_filter({!@card}) as p
limit 10
return p{*}
边过滤查询
示例:查找从银行卡 CA001 到 CA002 的 4 步以内路径,要求边不是转账边,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(:4)
.edge_filter({!@transfer}) as p
limit 10
return p{*}
边属性递增查询
示例:查找从银行卡 CA001 到 CA002 的 4 步以内路径,要求边均为转账边,且属性 time 递增,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(:4)
.path_ascend(@transfer.time) as p
limit 10
return p{*}
边属性递减查询
示例:查找从银行卡 CA001 到 CA002 的 4 步以内路径,要求边均为转账边,且属性 time 递减,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(:4)
.path_descend(@transfer.time) as p
limit 10
return p{*}
右向边查询
示例:查找从银行卡 CA001 到 CA002 的 4 步以内路径,要求边均为转账边,且方向向右,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(:4)
.edge_filter({@transfer}).direction(right) as p
limit 10
return p{*}
左向边查询
示例:查找从银行卡 CA001 到 CA002 的 4 步以内路径,要求边均为转账边,且方向向左,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(:4)
.edge_filter({@transfer}).direction(left) as p
limit 10
return p{*}
去除环路查询
示例:查找从银行卡 CA001 到 CA002 的 5 步路径,去除环路,返回 10 条结果并携带全部信息
ab().src({_id == "CA001"}).dest({_id == "CA002"}).depth(5)
.no_circle() as p
limit 10
return p{*}
单次查询数量限制
示例:查找从银行卡 CA001、CA002 分别到达 CA005 的 5 步路径,每组起止点之间返回 3 条路经,携带全部信息
uncollect ["CA001","CA002"] as n
ab().src({_id == n}).dest({_id == "CA005"}).depth(5)
.limit(3) as p
return p{*}