知识卡片
Datalog用可组合复用的规则逐步构建复杂查询
内容
Cypher和SPARQL都是”一步到位”式的查询——写一条SELECT/MATCH语句直接描述想要的结果;
Datalog的思路完全不同:它一次只前进一小步,通过定义”规则”把新的谓语告诉数据库,
而不是直接写最终查询。规则的写法是”如果能在符号:-右侧找到匹配所有谓语的绑定,
就把左侧的结论添加进数据库(把变量替换成匹配到的值)”。这意味着复杂查询可以拆分成
多个小规则、层层构建:比如先定义一个”within_recursive”规则表示”沿着属于关系传递
下去”的可变长度路径关系,这个规则可以像函数递归调用自己一样反复应用,直到穷举出所有
可达的位置层级关系;再定义一个”migrated”规则,直接引用(复用)已经定义好的
within_recursive规则,组合出”出生地在某国、居住地在某国”这个更高层的查询能力。这种
规则可以引用其他规则、像函数调用函数一样组合的特性,是Datalog相较于Cypher/SPARQL
最本质的不同之处——对一次性的简单查询,Datalog这种”先搭积木再拼接”的方式确实不如
直接写一条查询语句方便,但当数据关联关系变得非常复杂、且很多查询会反复用到同一组
中间概念(如”位置层级归属关系”)时,把这些中间概念沉淀成可复用的规则,能避免在
每条查询里重复表达同样的逻辑,这是它在处理复杂数据场景时更有优势的地方。
参考来源
- 位置:《数据密集型应用系统设计》第二章《数据模型与查询语言》"基础:Datalog"
(源文件:_epub-src/ch2_split_004.html)
- 结论依据:原文说明Cypher和SPARQL用SELECT立即跳转而Datalog一次只进行一小步,
通过定义规则(如within_recursive、migrated)来逐步构建查询,规则可以引用其他
规则、像函数递归调用一样组合,并指出这种方式对简单一次性查询不便但能更好处理
复杂数据,直接支撑本卡片结论。
- 原始内容:Cypher和SPARQL使用SELECT立即跳转,但是Datalog一次只进行一小步。我们
定义规则,以将新谓语告诉数据库……规则可以引用其他规则,就像函数可以调用其他函数
或者递归地调用自己一样……虽然对于简单的一次性查询,显得不太方便,但是它可以更好
地处理数据很复杂的情况。