两站之间最短路径
gremlin提供了repeat..until语法来循环执行一个逻辑,直到满足某个条件。通过repeat..until来进行最短路径查询非常适合。
下面语句来查询西单地铁站到东单地铁站的路径,并限制前10个
g.V().has("station","name","西单").repeat(out().simplePath()).until(has("name","东单")).path().by('name').limit(10)
//输出
[
path[西单, 天安门西, 天安门东, 王府井, 东单],
path[西单, 宣武门, 和平门, 前门, 崇文门, 东单],
path[西单, 宣武门, 和平门, 前门, 王府井, 东单],
path[西单, 天安门西, 天安门东, 王府井, 前门, 崇文门, 东单],
path[西单, 宣武门, 和平门, 前门, 崇文门, 北京站, 建国门, 东单],
path[西单, 宣武门, 菜市口, 虎坊桥, 珠市口, 前门, 崇文门, 东单],
path[西单, 宣武门, 菜市口, 虎坊桥, 珠市口, 前门, 王府井, 东单],
path[西单, 复兴门, 长椿街, 宣武门, 和平门, 前门, 崇文门, 东单],
path[西单, 复兴门, 长椿街, 宣武门, 和平门, 前门, 王府井, 东单],
path[西单, 灵境胡同, 西四, 平安里, 北海北, 南锣鼓巷, 东四, 灯市口, 东单]
]
同时,我们也可以用emit代替until来对结果进行过滤
g.V().has("station","name","西单").repeat(out().simplePath()).emit(has("name","东单")).path().by('name').limit(10)
//输出
[
path[西单, 天安门西, 天安门东, 王府井, 东单],
path[西单, 宣武门, 和平门, 前门, 崇文门, 东单],
path[西单, 宣武门, 和平门, 前门, 王府井, 东单],
path[西单, 天安门西, 天安门东, 王府井, 前门, 崇文门, 东单],
path[西单, 宣武门, 和平门, 前门, 崇文门, 北京站, 建国门, 东单],
path[西单, 宣武门, 菜市口, 虎坊桥, 珠市口, 前门, 崇文门, 东单],
path[西单, 宣武门, 菜市口, 虎坊桥, 珠市口, 前门, 王府井, 东单],
path[西单, 复兴门, 长椿街, 宣武门, 和平门, 前门, 崇文门, 东单],
path[西单, 复兴门, 长椿街, 宣武门, 和平门, 前门, 王府井, 东单],
path[西单, 灵境胡同, 西四, 平安里, 北海北, 南锣鼓巷, 东四, 灯市口, 东单]
]
这里使用simplePath是为了让遍历不走回头路。我们也可以吧until放到前面
g.V().has("station","name","西单").until(has("name","东单")).repeat(out().simplePath()).path().by('name').limit(10)
//输出
[
path[西单, 天安门西, 天安门东, 王府井, 东单],
path[西单, 宣武门, 和平门, 前门, 崇文门, 东单],
path[西单, 宣武门, 和平门, 前门, 王府井, 东单],
path[西单, 天安门西, 天安门东, 王府井, 前门, 崇文门, 东单],
path[西单, 宣武门, 和平门, 前门, 崇文门, 北京站, 建国门, 东单],
path[西单, 宣武门, 菜市口, 虎坊桥, 珠市口, 前门, 崇文门, 东单],
path[西单, 宣武门, 菜市口, 虎坊桥, 珠市口, 前门, 王府井, 东单],
path[西单, 复兴门, 长椿街, 宣武门, 和平门, 前门, 崇文门, 东单],
path[西单, 复兴门, 长椿街, 宣武门, 和平门, 前门, 王府井, 东单],
path[西单, 灵境胡同, 西四, 平安里, 北海北, 南锣鼓巷, 东四, 灯市口, 东单]
]
从西单出发,坐5站能到东单的路线
g.V().has("station","name","西单").repeat(out().simplePath()).times(5).has("name","东单").path().by('name')
//输出
[
path[西单, 宣武门, 和平门, 前门, 崇文门, 东单],
path[西单, 宣武门, 和平门, 前门, 王府井, 东单]
]
times用来指定repeat中操作执行的次数。
从西单出发,坐5站以内能到东单的路线
g.V().has("station","name","西单").repeat(out().simplePath()).times(5).emit().has("name","东单").path().by('name')
//输出
[
path[西单, 天安门西, 天安门东, 王府井, 东单],
path[西单, 宣武门, 和平门, 前门, 崇文门, 东单],
path[西单, 宣武门, 和平门, 前门, 王府井, 东单]
]
emit的作用是包括指定次数以内的路径结果,代表”最多五站”的含义。
西单-东单,20站以内有多少种坐法
g.V().has("station","name","西单").repeat(out().simplePath()).times(20).emit().has("name","东单").count()
//输出
[1141]
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/282937.html