F1赛车大概是所有赛车运动里最复杂、数据最密集的物种。每辆车都在实时回传海量遥测数据,赛道上的传感器也在比赛周末不停采集。天气、轮胎温度、弯心出弯速度……凡是能测的,赛事工程师都会一周接一周地做分析。数据,是这项运动往前冲的核心推力之一。

偏偏我就是个喜欢翻数据的人,最近正好又在学图数据库和Neo4j。一个念头忽然冒出来:既然有好莱坞演员版本的“凯文·贝肯六度分隔”,那F1车手之间能不能也连成一条链?和演员不同的是,F1从1950年开跑至今,车手总数要小得多,队友关系却足够清晰——只要抓住“队友”这个关键纽带,说不定就能画出最短路径。

打开网易新闻 查看精彩图片

于是我问了一个很具体的题:维斯塔潘和八届世界冠军方吉奥,他们之间隔着多少位中间车手?方吉奥1958年就退役了,那时连维斯塔潘的父亲都还没出生。这种跨时代的连接,无论如何都要靠一串队友关系才能接上。

我第一反应是写SQL,用递归CTE一层层展开队友关联表。因为根本不知道最终要跳几步,只能不断重复自连接,重复路径像雪崩一样涌进来,结果应用直接锁死。关系型数据库处理这类不定深度的链式查询,真不是它长项。

图数据库的思路恰好相反。在Neo4j里,关系本身就是一等公民,不用等到查询时再临时拼凑。车手是节点,队友关系是边,沿途追踪就是一次直接的图遍历。正是这个底层设计,把刚才让SQL卡壳的难题,变成了一句Cypher就能解决的一行查询。

下面这篇文章,就带着你从零开始,把1950年以来所有F1车手装进一张属性图里。不要求你有任何图数据库经验,结束之后,你会在本地跑通整张车手关系网,亲自输出那条从维斯塔潘到方吉奥的最短路径。