技术编程像图一样的数据模型( 五 )


- 在CODASYL中 , 所有的查询是命令式的 , 很难去编写并且因为模式的改变而经常要去重写 。 在图数据库中 , 如果你想的话 , 你可以以命令式的代码写下你的遍历 , 但通常图数据库也支持高级别的声明式语言 , 诸如Cypher或SPARQL 。 基石:Datalog
Datalog是比SPARAL或Cypher更老的语言 , 在1980年代 , 被学术界广泛的研究 。 在软件工程师中很少被知晓 , 尽管不是很重要 , 但他也为后来的建立的查询语言奠定了基础 。
实际上 , Datalog用于一些数据系统:例如 , 它是Datomic的查询语言 , 而Cascalog是用于在Hadoop中查询大型数据集的Datalog实现 。
Datalog的数据模型有点类似于triple-stroes模型 。 但不是将三元组写为(subject, predicate,object) , 而是将其写为predicate(subject, object) , 如下图:
技术编程像图一样的数据模型
本文插图
现在我们已经定义了数据 , 我们可以编写与之前相同的查询 , 如下图所示 。 它看起来与Cypher或SPARQL中的等效项有所不同 , 但请不要失望 。 Datalog是Prolog的子集 , 如果您学习过计算机科学 , 则可能会见过 。
技术编程像图一样的数据模型
本文插图
Cypher和SPARQL通过SELECT跳入 , 但是Datalog一次只迈出了一小步 。 我们定义了一些规则来告诉数据库新的predicate:在这里 , 我们定义了两个新的predicate , within_recursive和migrated 。 这些predicate不是存储在数据库中的三元组 , 而是取自数据或其他规则 。 规则可以引用其他规则 , 就像函数可以调用其他函数或递归调用自己一样 。 这样 , 可以一次构建一小块复杂的查询 。
在规则中 , 以大写字母开头的单词是变量 , 并且像Cypher和SPARQL中一样对predicate进行匹配 。 例如 , name(Location , Name)通过Location = namercia和Name="North America"这样的变量绑定来匹配name(namerica, 'North America) 。


推荐阅读