我的数据日志引擎的外壳
arrdem.datalog.shell的Python项目详细描述
datalog.shell
我的数据日志引擎的外壳。
什么是数据日志?
数据日志是一个完整的 用于表示关系数据和查询的声明性语言, 通常使用prolog的语法子集编写。其最 与其他关系语言(如sql)相比,这是一个有趣的特性 它是否具有生产规则。
简而言之,数据日志数据库由规则和元组组成。元组是
写的a(b,"c",126,…。
,不需要声明,例如表,
可能是任意的甚至可变的长度。这个元组的元素
是可以写为裸词或引用的字符串。
在解释器(或文件)中,我们可以这样定义一个小图形-
$ datalog
>>> edge(a, b).
⇒ edge('a', 'b')
>>> edge(b, c).
⇒ edge('b', 'c')
>>> edge(c, d).
⇒ edge('c', 'd')
但我们怎么能质疑呢?我们可以通过输入元组来发出查询
以结尾?
而不是
例如,我们可以查询数据库中是否存在某些元组-
>>> edge(a, b)?
⇒ edge('a', 'b')
>>> edge(d, f)?
⇒ Ø
>>>
我们确实定义了edge(a,b)。
所以我们的查询返回那个元组。然而
元组边(d,f)。
未定义,因此我们的查询不会生成
结果。不是什么都不打印,而是表示
为了清晰起见,打印了空的设置。
这是对的,但没意思。我们怎么能找到说所有的边缘
从a
?我们没有类似通配符的结构来匹配
任何事-现在。
输入逻辑变量。逻辑变量是大写的单词,x
,
foo
等,由查询解释为通配符
发动机。大写的单词总是被理解为逻辑变量。
>>> edge(a, X)?
⇒ edge('a', 'b')
然而,与只匹配任何内容的通配符不同,逻辑变量
在查询中统一。我们要写edge(x,x)吗?
我们会
请求元组的集合,以便边的两个元素
元组相等。
>>> edge(X, X)?
⇒ Ø
我们一个也没有。
但如果我们想找到边缘之间的路径呢?说检查是否
存在从a
到d
的路径。我们需要找到一种方法来统一
逻辑变量在一起-到目前为止,我们只看到
单元组。
输入规则。我们可以定义数据日志引擎可以 产生新的元组。规则被写成一个元组"模式",它可以 包含常量或逻辑变量,后跟 由赋值运算符分隔的"子句"。
规则最好理解为子查询。规则定义了 元组的不定集合,因此在该集合上,查询子句 同时满足。这就是我们实现复杂查询的方法。
规则体中不存在替换或运算符。然而, 规则可以共享相同的元组"模式"。
所以如果我们想说在数据库中找到边之间的路径
可以用两条规则。定义"简单"路径的一个,以及
通过查询
从x
到无约束z
的边,然后将其与
路径(z,y)
>>> path(X, Y) :- edge(X, Y).
⇒ path('X', 'Y') :- edge('X', 'Y').
>>> path(X, Y) :- edge(X, Z), path(Z, Y).
⇒ path('X', 'Y') :- edge('X', 'Z'), path('Z', 'Y').
>>> path(a, X)?
⇒ path('a', 'b')
⇒ path('a', 'c')
⇒ path('a', 'd')
我们还可以询问所有路径-
>>> path(X, Y)?
⇒ path('b', 'c')
⇒ path('a', 'b')
⇒ path('c', 'd')
⇒ path('b', 'd')
⇒ path('a', 'c')
⇒ path('a', 'd')
数据日志还支持否定。在规则中,以
~
变成否定语句。这让我们可以表达
存在的关系,或蚂蚁。注意,这只有在
使封闭世界假设成为封闭世界假设
数据日志还支持作为特殊关系的二进制等式。=(X,Y)?< /代码>
是一个无意义的查询,因为
x
和y
的空间是
未定义。但是在规则体中,相等(和否定
平等声明!)非常有用。
为了方便起见,数据日志解释器支持"收回"
元组和规则的(删除)。边(a,b)!< CO会收回的
常量元组,但我们不能收回路径(a,b)!
因为元组是
由规则生成。但是我们可以收回规则-边(x,y)!< /代码>
这将从数据库中删除两个边缘生产规则。
数据日志解释器还支持从
一个或多个文件,每个文件由--db<;filename>;
命令指定
行参数。
用法
pip安装--用户arrdem.datalog.shell
这将把数据日志
解释器安装到您的用户本地
pythonbin
目录,并下拉corearrdem.datalog
引擎
同样,
状态
据我所知,这是一个完整的传统数据日志实现。
支持二进制=
作为内置关系,支持
规则(前缀为~
)
规则,并支持规则的递归求值 防止无限递归。
交互式解释器支持定义(以结尾的术语)。
撤回(以
结尾的术语)!
)和查询(以结尾的术语?
),请参见
口译员的帮助
响应以获取更多详细信息。
限制
递归可能有一些完整性错误。我还没有遇到过,但是我 对于 规则尚未制定。
当前的否定子句实现不能传播正的 信息。这意味着否定子句只能与 带有肯定从句。不清楚这是否是一个必要的限制。
到目前为止还没有查询规划器-甚至没有根据
与限制性评价的关系。这意味着查询的复杂性是
o(数据集*术语计数)
,这显然不太理想。
许可证
从https://git.arrdem.com/arrdem/datalog-py" rel="nofollow">https://git.arrdem.com/arrdem/datalog py
镜像根据麻省理工学院的许可证出版。请参见license.md