ArangoDB Graphs 系列——04 高级图查询

334 阅读2分钟

这一篇主要关注两个主题,分别是最短路径和模式匹配

最短路径 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"
]

在地图上直观展现,如下图,两个机场间无直达飞机,需要从丹佛转机:

截屏2022-04-14 下午4.24.15.png

注意:最短路径可能返回不同的结果,如果有多个最短路径可能结果,会返回其中之一。

有时候,你只想知道最短路径的长度,即边的数量,可以使用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条路径,如红线所示:

截屏2022-04-14 下午4.38.38.png

如果我们使用 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'

因为这种用法允许用户在遍历时,对整条路径应用复杂的过滤条件,换句话说,允许在图中发现顶点和边的特定组合,即特定模式,所以也叫模式匹配。