这一篇主要关注两个主题,分别是最短路径和模式匹配
最短路径 Shortest Path
最短路径是指,给定两个顶点,找出用最少的边将两者连接的路径,在机场航班数据集中,我们可以找出两个机场间,中转次数最少的方案。
# 找出BIS机场和JFK机场间的最短路径,并返回该路径上的机场名字
# 这回使用 SHORTEST_PATH 关键字
FOR v IN OUTBOUND
SHORTEST_PATH 'airports/BIS'
TO 'airports/JFK' flights
RETURN v.name
# 输出结果:
[
"Bismarck Municipal",
"Denver Intl",
"John F Kennedy Intl"
]
在地图上直观展现,如下图,两个机场间无直达飞机,需要从丹佛转机:
注意:最短路径可能返回不同的结果,如果有多个最短路径可能结果,会返回其中之一。
有时候,你只想知道最短路径的长度,即边的数量,可以使用LET:
# 之前可知,共3个机场在最短路径上,所以结果返回2
LET airports = (
FOR v IN OUTBOUND
SHORTEST_PATH 'airports/BIS'
TO 'airports/JFK' flights
RETURN v
)
RETURN LENGTH(airports) - 1
使用最短路径时,FILTER是不可以用的,如果想用,需求助于模式匹配.
模式匹配 Pattern Matching
本文不会展开模式匹配的细节,只做简单介绍。
如果遍历深度设置为1..2,遍历选项都选默认的(见备注),则下图中从S出发共有4条路径,如红线所示:
如果我们使用 FOR endVertex, edgeToVertex IN ... 把遍历的末端顶点输出,则会输出A,B,C和另一次C。 对于路径 S->A->C 和 S->B->C,如果我们想根据某些条件,只选择其中的一条路径,则需将完整路径作为语法的第三个变量明确写出,即 FOR vertex, edge, path IN ...
这时就可以在path变量上应用过滤条件,来回答类似于 “从A到B机场用时最短的飞行方案是?” 的问题。
备注:默认的遍历选项:dfs深度优先搜索、 uniqueVertices: 'none'、 uniqueEdge: 'path'
因为这种用法允许用户在遍历时,对整条路径应用复杂的过滤条件,换句话说,允许在图中发现顶点和边的特定组合,即特定模式,所以也叫模式匹配。