原文地址:这里写链接内容
DDlog是一种语法为datalog式,用来编写DeepDive应用的语言。一个ddlog程序会被编译成deepdive格式下的配置文件,我们通常用这个文件来运行我们的应用。
一个ddlog程序由一组声明组成,这些声明由dots分割,而状态的顺序是无关紧要的。一个声明可以是一个模式声明,一个datalog函数声明,一个函数调用规则,一个监管规则,或者一条推理规则。
1. Schema Declaration 模式声明
每个模式声明(schema declaration)在一个关系(relation)中声明了关系的每一列的类型以及列的顺序。其语法类似于SQL里的schema:
relation_name(
column1_name column1_type,
column2_name column2_type,
...).
relation_name
是数据库中一个指明关系的名字的标识符。类似的, column_name
s 和 column_type
s 是数据库中与列名称和列类型相匹配的字符串。ddlog使用与SQL相同的类型集合。
例如:
sentences(
doc_id text,
sent_id int,
text text,
words text[]).
它定义了一个包含了4列的关系articles:doc_id
, sent_id
, text
, 和 words
, 他们的类型分别是text
, int
, text
, text[]
,其中text[]
代表了 text
数组.
一个在关系名后的问号指出了这是一个包含了随机变量(random variable)的变量关系(variable relation),这些随机变量被包含在因子图(factor graph)中。例如,
has_spouse?(relation_id text).
定义了一个变量关系has_spouse
,并且每个不同的 relation_id
代表了一个不同的变量。
2. Normal datalog Rules 规则
典型的datalog规则可以被用来定义一个关系是如何被其他关系驱动的。一个规则的head被定义的规则,body则是一个合取查询体的合取式(conjunction),由逗号进行分割。析取的情况则被多个由分号分割body表达。
例如,下列程序表示了 元组Q是由R和S派生的,其中R的第二列和S的第一列是统一的,也就是说,这个body是一个等值连接。
Q