Datalog-ng¶
包含您的 Launchpad 蓝图的 URL
https://blueprints.launchpad.net/congress/+spec/datalog-ng
Congress 需要一种易于使用的声明式语言来表达策略。本设计规范描述了 Datalog-ng,它是标准 Datalog 的一个版本,具有一些额外特性,这些特性对于通用数据查询和操作以及特别是声明式网络至关重要。
问题描述¶
Congress 需要一种表达力强的策略语言,既易于使用,又能高效地进行信息处理和声明式网络。Datalog 是一种声明式语言,它为查询图和关系结构提供了更高级别的抽象。它定义了一种高效、递归的查询执行和增量数据更新机制,基于关系模型。本设计规范指定了 Datalog-ng 的形式 EBNF 语法,Datalog-ng 是 Datalog 的扩展,它 1) 使表在查询中更容易被引用,2) 定义了添加和删除策略数据库中事实的语法,3) 定义了规则、查询和约束的语法。
提议的变更¶
本规范提出了一种 Datalog 的泛化,称为 Datalog-ng,它适用于声明式网络。语法将以扩展巴科斯-诺尔形式 (EBNF) 2 定义。EBNF 规范与平台无关,并且正式定义了语言的语法。请注意,EBNF 的全部表达能力将不会被使用;这使得能够访问更广泛的工具,这些工具可能无法理解所有 EBNF 标准。因此,可以使用更多种类的工具来实现解析器、解释器和/或编译器。有关正式定义语法的优势,请参阅 3。
变更 #1:表引用 1 指出:“从概念上讲,Datalog 描述策略是根据一组表来表达的。” 表格是一种传递信息、便于查询、编辑和报告的简单方法。策略规则可以被认为是来自一个或多个表的输入如何转换为一个或多个表中的输出。表是完整的对象,因此我们可以不仅重用表(即实际数据),还可以重用创建数据的策略。但是,具有大量列的表很难使用,因为没有简单的方法来引用它们的名称,甚至不知道它们有多少列。此外,策略无法知道表中的更改,因此也可能因此而中断。
变更 #2:事实语义 Datalog(和 Datalog-ng)通过将事实添加到数据库中并从数据库中删除事实来工作。但是,没有标准的策略作者来引入与这些操作相关的语义的方法。例如,如果一个策略规则删除了一个事实,它可能会对其他将要使用该规则的策略规则产生不利影响。
变更 #3:查询和规则语义 需要添加形式语义来标准化查询和规则的表达和评估方式。目前没有查询语义,但添加起来很容易。
变更 #4:约束 目前,Datalog 中无法表达约束。例如,如果表 A 有四列,并且其中一列不能为空,那么无法检查将三个值插入到一行中是否会失败。同样,如果存在语义约束(例如,第 3 行必须使用一组枚举值之一),或者数据类型约束,则不正确的条目将很难或不可能检查,并且在应用时会失败。这可能会延迟,因为它的难度和可能引入问题。
变更 #5:安全性 目前,无法保证规则的安全性。例如,以下查询是不安全的
foo(X, Y, Z) :- rel1(X, y) & X < Z
foo(X, Y, Z) :- rel1(X, Y) & NOT rel2(X, Y, Z)
foo(X, Y) :- rel1(X)
变更 #6:语法改进 Datalog 功能强大,但有些难以使用。将定义一组“语法糖”来使 Datalog 更易于使用,特别是对于本地 Python 开发人员而言。
备选方案¶
N/A
策略¶
传统的策略规则采用具有两个或三个子句的语句形式 5;它们被称为 ECA(事件-条件-动作)和 CA(条件-动作)
ON <event-clause> IF <condition-clause> THEN <action-clause>
or
IF <condition-clause> THEN <action-clause>
在 ECA 和 CA 中,每个子句都可以是原子的布尔组合。但是,还有其他类型的策略规则:• 目标策略 • 实用函数 • 承诺 6 涵盖前两个,而 7 是 Mark 关于承诺理论的最新出版物。上述所有三个在形式和功能上都不同于 ECA 和 CA 策略规则。Datalog-ng 可以模拟这些形式的策略规则的意图,这正是 Congress 所需要的——能够声明性地指定意图。
策略操作¶
Congress 策略规则的用途 潜在的候选包括
监控
报告(包括过滤选定的值,以便用户不会被大量数据淹没)
响应式地配置设备(例如,违反了阈值)
主动地配置设备(例如,趋势分析预测未来将违反阈值)
前三个是直接的;后者可能会推迟到 Kilo 版本之后。
策略规则实现替代方案 Datalog 的优点在于它是第一阶逻辑的声明式子集。声明式语言表达任务的逻辑,而不指定执行任务的控制流。第一阶逻辑是一种形式逻辑系统,其中每个语句由一个主题和一个谓词组成。谓词只能引用单个主题。句子使用与布尔代数中使用的相同规则进行组合和操作。存在两个量词:“对于所有”和“对于某些”(高阶逻辑具有额外的量词,例如“对于对象的每个属性”)。
因此,Datalog 比简单的命题逻辑更强大,但不如第一阶逻辑强大。但是,它提供了一种难以比拟的强大和简单性的结合。
数据源¶
本节将描述数据的来源。它将定义生成这些数据的示例项目。
数据接收器 本节将描述谁正在消耗数据。它将定义消耗这些数据的示例项目。
未来扩展 由于 Datalog-ng 基于第一阶逻辑的子集,它还提供形式推理和分析。这很可能是此规范的下一个版本的讨论主题,但应牢记在心,以便我们不会以任何方式限制此功能。
数据模型影响¶
N/A
REST API 影响¶
N/A
安全影响¶
策略可能包含 proverbial 的“王国之钥”。因此,如果有人入侵系统并开始发布策略,游戏就结束了。因此,应使用某种类型的访问控制与基于策略的系统一起使用。
通知影响¶
N/A
其他最终用户影响¶
Datalog-ng 适用于开发人员和管理员,不适用于最终用户。
性能影响¶
N/A
其他部署者影响¶
为了使之安全地工作,我认为我们需要在一个安全的环境中运行,例如基于角色的访问控制 (RBAC)。
开发者影响¶
实现将为策略编写者提供更丰富的选项集
实现¶
负责人¶
- 主要负责人
straz
- 其他贡献者
thinrichs, sarob
工作项¶
以下是本规范中将如何解决上述更改的简短描述。
变更 #1:表引用 将通过在策略语法中引入命名空间以及支持语法来支持表引用,以允许通过名称和/或相对位置引用表和表元素。
变更 #2:事实语义 将添加新的语法来区分添加事实和删除事实。这将使可选规则能够识别这些操作并根据需要执行其他任务。
变更 #3:查询和规则语义 此更改涉及添加专用语法以区分规则和查询。
变更 #4:约束 可以强制执行许多类型的约束。以下定义假设表表示一个实体,例如路由器或网络。请注意,这些类型的约束对于能够安全地从不同命名空间引用不同的表至关重要。
实体完整性:一行具有唯一的标识符,称为主键。主键是唯一的,并且不能为空。这使得可以识别实体中的每一行。
引用完整性:有时,表引用其他表。外键是表中一组属性,它唯一标识另一个表的一行,即来自一个表中出现在另一个表中的主键。引用完整性定义了一个表对另一个表的依赖关系。
值约束:数据对其可以取的值具有约束。例如,物理底盘只能安装在单个机架中。
域约束:给定域中的实体属性在一种或多种方式上受到限制。例如,同一行中两个列的值之和小于或等于另一个值。这通常包括数据类型、数据值和值的默认设置。
第二组示例来自安全应用程序。在这种观点下,约束是一种需要满足的断言。典型的例子是策略应该能够指定用户(或应用程序)可以访问的资源以及该用户可以对该资源集执行的一组操作。例如,指定给定目录下的所有子目录和文件的权限在 Datalog 中是难以处理的,因为资源集可能是无限的,并且 Datalog 没有函数符号。
这将使用约束域来定义,并且是 Datalog-ng 语言的可选部分。如果变得太困难,可能会推迟到 Kilo 之后。
变更 #5:安全性 如果规则的头部中的所有变量也出现在规则体中的正的、非算术字面量中,则规则是安全的。这保证了规则的终止。语法应该包括安全检查来保护开发人员免受自身伤害。:-)
变更 #6:语法改进 将定义一组语法改进来简化 Datalog-ng 的使用,特别是使其语法对 Python 开发人员更友好。示例包括更可识别的注释(例如,熟悉的“//”或“/../”而不是本机 Datalog ‘%’),能够使用单引号和/或双引号,以及英语等效于某些命令(例如,‘!’ 或 ‘NOT’ 或 ‘not’)。
依赖项¶
此规范可能会分解为多个蓝图以供实施。规范和/或蓝图列表将列在此规范的顶部。
测试¶
N/A
文档影响¶
N/A
参考资料¶
以下是此规范的参考资料。
- 1
Congress 设计,http://goo.gl/YFd2Fr
- 2
ISO/IEC,“信息技术 - 语法元语言 - 扩展 BNF”,14977,12/15/1996
- 3
Strassner,“EBNF 的简要介绍”,TBD
- 4
Congress 策略研讨会,TBD
- 5
J. Strassner,“基于策略的网络管理”,Morgan Kaufman Publishing,978-1558608597,9/2003
- 6
J. Strassner, J. Kephart,“自治系统和网络 – 理论与实践”,NOMS 2006 教程
- 7
M. Burgess, J. Bergstra,“承诺理论 - 介绍”,xtAxis Press,2014