从教材用语到论文中的名称
1986年3月的数据库系统原理研讨会论文集,是Datalog名称传播的重要节点。大卫·迈尔、大卫·S.沃伦等人在2018年合写的历史回顾中,把该届会议中阿弗拉蒂等人和班西翁等人的论文,列为他们查到的最早使用这一名称的正式文献;到1986年中,Datalog作为数据库语言名称已经确立。
迈尔与沃伦原本为合写教材寻找一个称呼,用来介绍不含函数符号的Prolog子语言。迈尔提出Datalog后,把它带进俄勒冈研究生中心的课堂和与斯坦福研究者的交流。作者们还找到哈里·波特1985年10月手稿中的用例,而教材《Computing with Logic》直到1988年1月才出版。1986年对应名称在正式研究文献中的使用与确立,并不是这些思想或程序执行能力的共同起点。
参考:[1]
把逻辑规则放到大型数据库上
这项研究关心一个具体难题:数据库能够高效存取大量记录,但当时常用的关系查询框架不便表达任意层次的递归关系;逻辑编程能够写出递归规则,执行时却容易受搜索顺序影响,也未必适合磁盘上规模很大的数据。
在美国得克萨斯州奥斯汀,微电子与计算机技术公司(MCC)的沙洛姆·楚尔和卡洛·扎尼奥洛设计了相关语言LDL。他们在1986年论文中指出,Prolog通常逐个处理记录,关系数据库则能一次处理整组数据,并选择不同连接方法。团队希望通过编译把规则转为关系查询,让程序员表达所需关系,而由系统承担更多执行控制。
两条规则怎样找出可达地点
以一个简化的有向道路网为例,输入事实为edge(a,b)、edge(b,c)和edge(c,d),表示三条单向直接连接。用reach(X,Y)表示从X可到Y,可以写两条规则:reach(X,Y) :- edge(X,Y)。以及reach(X,Y) :- edge(X,Z), reach(Z,Y)。前一条认定直接连接可达,后一条把一段直接连接与已有的可达路径接起来。
起初可以得到a到b、b到c、c到d;再次应用规则,就会得到a到c和b到d,随后得到a到d。询问reach(a,Y)时,答案是b、c、d。这里的X、Y、Z是变量,a等是常量;“:-”右边列出条件,左边给出条件成立时可推出的事实。这个例子表达的是所有可达关系,而不是命令机器按某个固定次序逐站行驶。
参考:[2]
把求值工作交给系统
基本Datalog不含能够不断构造嵌套对象的函数符号。配合适当的安全性限制,有限输入能产生的事实仍然有限;反复应用规则,直到不再增加新事实,就得到固定点。道路例子的edge保存输入,reach则由规则推导。
实现时,半朴素求值利用每轮新增的事实,减少重复计算;魔集方法把查询中已确定的参数传入规则,限制与问题无关的推导。用户只询问从a出发的路径时,系统便不必照最直接的方法,先求出所有地点之间的可达关系。
参考:[2]
MCC怎样检验语言设计
楚尔和扎尼奥洛在1986年8月的京都超大型数据库会议论文中报告,这一版LDL设计已经完成,两个原型应用已用该语言编码。地图导航应用保存街道的邻接关系及其他地点信息,再用规则表达改善搜索的启发方法。订单录入应用则用规则处理货物调配、库存维护和“新订单”等交易。这比只展示一个递归查询更接近完整业务程序。
论文把编译分为规则集的编译和具体查询的编译优化:规则先形成谓词连接图,查询从相关入口进入,再处理递归与筛选。作者同时写明,数据库更新功能仍较简单;复合更新如何提交中间结果、如何重复使用更新定义,还是研究中的问题。论文所称设计完成,有明确的版本边界,并不是一种通用Datalog产品的统一上市。
参考:[3]
斯坦福原型暴露出的工程问题
斯坦福大学的早期NAIL!系统采用另一种衔接方式。参与后继系统开发的马西亚·德尔、森下真一和杰弗里·菲普斯在1994年论文中回顾,NAIL!前端先把Nail规则译成ICODE,后端解释器再产生SQL,交给商业关系数据库执行。规则产生的短期、小型临时关系,却要承受类似磁盘持久关系的管理开销;多层解释和逐条取回答案也拖慢运行。
这些经验后来促成Glue-Nail的重新设计。命名、论文和原型并行推进的早期历史,说明Datalog是在教学、数据库研究和系统实验之间逐渐形成的共同语言名称,而非一次集中发布的单一软件。