概述
使用语句ab().src().dest().depth()
可以获取两组点之间的路径,该语句将src()
中的每个点与dest()
中的每个点配对,进行路径查找。如果src()
指定了n
个点,dest()
指定了m
个点,那么共有n * m
组点需要考虑。
ab().src(<filter?>).dest(<filter?>).depth(<range>)
- 语句别名:类型为
PATH
- 方法:
方法 |
参数 |
描述 | 可选 |
别名类型 |
---|---|---|---|---|
src() |
<filter?> |
将过滤条件包裹在{} 中,或使用别名指定遍历的起点集。 留空时会作用在所有点上 |
否 | NODE |
dest() |
<filter?> |
将过滤条件包裹在{} 中,或使用别名指定遍历的终点集。留空时会作用在所有点上 |
否 | NODE |
depth() |
<range> |
遍历步数,即路径中的边数(N ≥1):
|
否 | N/A |
shortest() |
<weight?> |
留空则查询不加权的最短路径;若使用@<schema>.<property> 格式指定某个数值型边属性,则查询加权后的最短路径。加权属性不可有负值,而不具备指定属性的边将被忽略。仅支持使用depth(N) 来查找N 步内的最短路径 |
是 | N/A |
node_filter() |
<filter?> |
将针对路径里中介点的过滤条件包裹在{} 中。留空则不应用任何过滤条件 |
是 | N/A |
edge_filter() |
<filter?> |
将针对路径中边的过滤条件包裹在{} 中。留空则不应用任何过滤条件 |
是 | N/A |
path_ascend() |
<property> |
使用@<schema>.<property> 格式指定某个数值型边属性,查找从src() 到dest() 该属性值递增的路径;没有该属性的边将被忽略 |
是 | N/A |
path_descend() |
<property> |
使用@<schema>.<property> 格式指定某个数值型边属性,查找从src() 到dest() 该属性值递减的路径;没有该属性的边将被忽略 |
是 | N/A |
direction() |
<leftRight> |
指定路径中所有边的方向,可以为left 或right |
是 | N/A |
no_circle() |
/ | 剔除包含环路的路径;一种情况例外,就是当src() 和dest() 指定了相同点且而该点不是中介点,仍将返回相关路径 |
是 | N/A |
limit() |
<N> |
限制每个点对返回的路径数量(N ≥-1);-1 表示返回所有路径 |
是 | N/A |
示例图集
在一个空图集中,逐行运行以下语句,创建示例图集:
create().edge_property(@default, "weight", int32)
insert().into(@default).nodes([{_id:"A"}, {_id:"B"}, {_id:"C"}, {_id:"D"}, {_id:"E"}, {_id:"F"}])
insert().into(@default).edges([{_from:"A", _to:"C", weight:1}, {_from:"E", _to:"B" , weight:1}, {_from:"A", _to:"E" , weight:4}, {_from:"D", _to:"C" , weight:2}, {_from:"E", _to:"D" , weight:3}, {_from:"B", _to:"A" , weight:2}, {_from:"F", _to:"A" , weight:4}])
查找多种长度路径
N步内路径
查找起点为A
或C
,终点为D
或E
的3步内路径:
ab().src({_id in ["A", "C"]}).dest({_id in ["D", "E"]}).depth(:3) as p
return p
A <- B <- E -> D
A -> C <- D
A -> E -> D
C <- A -> E -> D
C <- D
A <- B <- E
A -> C <- D <- E
A -> E
C <- A <- B <- E
C <- A -> E
C <- D <- E
N步路径
查找起点为A
或C
,终点为D
或E
的3步路径:
ab().src({_id in ["A", "C"]}).dest({_id in ["D", "E"]}).depth(3) as p
return p
A <- B <- E -> D
C <- A -> E -> D
A -> C <- D <- E
C <- A <- B <- E
N到M步路径
查找起点为A
或C
,终点为D
或E
的2到3步路径:
ab().src({_id in ["A", "C"]}).dest({_id in ["D", "E"]}).depth(2:3) as p
return p
A <- B <- E -> D
A -> C <- D
A -> E -> D
C <- A -> E -> D
A <- B <- E
A -> C <- D <- E
C <- A <- B <- E
C <- A -> E
C <- D <- E
查找无权重最短路径
查找起点为A
,终点为D
的5步内最短路径:
ab().src({_id == "A"}).dest({_id == "D"}).depth(5).shortest() as p
return p
A -> C <- D
A -> E -> D
查找加权最短路径
查找起点为A
,终点为D
,根据属性@default.weight
加权计算的5步内最短路径,并计算路径的总权重:
ab().src({_id == "A"}).dest({_id == "D"}).depth(5).shortest(@default.weight) as p
call {
with p
uncollect pedges(p) as edges
return sum(edges.weight) as weights
}
return p, weights
结果:
p | weights |
---|---|
A -> C <- D |
3 |
过滤中介点
查找起点为F
,终点为E
,且不经过点D
的5步内路径:
ab().src({_id == "F"}).dest({_id == "E"}).depth(:5).node_filter({_id != "D"}) as p
return p
F -> A <- B <- E
F -> A -> E
过滤边
查找起点为A
,终点为E
,且每条边的weight
属性大于1的3步内路径:
ab().src({_id == "A"}).dest({_id == "E"}).depth(:3).edge_filter({weight > 1}) as p
return p
A -> E
升序或降序边属性值
查找起点为A
,终点为E
,边属性@default.weight
升序的3步内路径:
ab().src({_id == "A"}).dest({_id == "E"}).depth(:3).path_ascend(@default.weight) as p
return p
A -> C <- D <- E
A -> E
查找起点为A
,终点为E
,边属性@default.weight
降序的3步内路径:
ab().src({_id == "A"}).dest({_id == "E"}).depth(:3).path_descend(@default.weight) as p
return p
A <- B <- E
A -> E
设置边方向
查找起点为A
或C
,终点为E
,边方向指向左的2到4步路径:
ab().src({_id in ["A", "C"]}).dest({_id == "E"}).depth(2:3).direction(left) as p
return p
A <- B <- E
C <- A <-B <- E
C <- D <- E
剔除带有环路的路径
查找起点为A
,终点为E
,且不包含任何环路的4步路径:
ab().src({_id == "A"}).dest({_id == "C"}).depth(4).no_circle() as p
return p
A <- B <- E -> D -> C
如果不适用no_circle()
方法,将返回3条路径:
ab().src({_id == "A"}).dest({_id == "C"}).depth(4) as p
return p
A <- B <- E <- A -> C
A <- B <- E -> D -> C
A -> E -> B -> A -> C
使用limit()
查找起点为A
或C
,终点为E
的3步内路径,且每个点对只返回一条路径:
ab().src({_id in ["A", "C"]}).dest({_id == "E"}).depth(:3).limit(1) as p
return p{*}
A <- B <- E
C <- A <- B <- E
使用OPTIONAL
本条查询中,ab()
语句执行两次,每次使用n
中的一条记录。使用OPTIONAL
前缀后,如果没有查询到数据,则返回null
:
find().nodes({_id in ["A","C"]}) as n
OPTIONAL ab().src(n).dest({_id == "D"}).depth(1) as p
return p
null
C <- D
若不使用OPTIONAL
前缀,则仅返回一条结果:
find().nodes({_id in ["A","C"]}) as n
ab().src(n).dest({_id == "D"}).depth(1) as p
return p
C <- D