我的数据日志引擎的外壳

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?我们没有类似通配符的结构来匹配 任何事-现在。

输入逻辑变量。逻辑变量是大写的单词,xfoo等,由查询解释为通配符 发动机。大写的单词总是被理解为逻辑变量。

>>> edge(a, X)?
⇒ edge('a', 'b')

然而,与只匹配任何内容的通配符不同,逻辑变量 在查询中统一。我们要写edge(x,x)吗?我们会 请求元组的集合,以便边的两个元素 元组相等。

>>> edge(X, X)?
⇒ Ø

我们一个也没有。

但如果我们想找到边缘之间的路径呢?说检查是否 存在从ad的路径。我们需要找到一种方法来统一 逻辑变量在一起-到目前为止,我们只看到 单元组。

输入规则。我们可以定义数据日志引擎可以 产生新的元组。规则被写成一个元组"模式",它可以 包含常量或逻辑变量,后跟 由赋值运算符分隔的"子句"。

规则最好理解为子查询。规则定义了 元组的不定集合,因此在该集合上,查询子句 同时满足。这就是我们实现复杂查询的方法。

规则体中不存在替换或运算符。然而, 规则可以共享相同的元组"模式"。

所以如果我们想说在数据库中找到边之间的路径 可以用两条规则。定义"简单"路径的一个,以及 通过查询 从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)?< /代码> 是一个无意义的查询,因为xy的空间是 未定义。但是在规则体中,相等(和否定 平等声明!)非常有用。

为了方便起见,数据日志解释器支持"收回" 元组和规则的(删除)。边(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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用Selenium Java查找筛选器窗格“铅笔图标”的元素时出现问题   分布式缓存l2上使用infinispan和hibernate的java连接锁   使用Java的DOM XML API解析XML中的符号和   java是解析和操作字符串的有效方法   java发布NewRelicMeterRegistry时如何过滤仪表   多维数组在java中读取文件后将数据值分组   java如何将httpClient配置为jsoup   java BreakIterator在Android中是如何工作的?   找不到maven GAE类:原因:java。lang.ClassNotFoundException应用程序标识cRedential$AppenginecRedential包装   Jlabel调整java大小   调试如何在VScode中的java类依赖项中设置断点   java正在获取文件夹名,而不是。mp3文件{Android}   java如何将从DiffieHellman类生成的AES密钥添加到使用该密钥的类