2 个不稳定版本

0.2.0 2019 年 7 月 17 日
0.1.0 2019 年 3 月 31 日

#167 in WebSocket

MIT 许可证

375KB
7K SLoC

声明式数据流

基于 微分数据流 的反应式查询引擎。

crates

文档

特性

交互式使用: 声明式接受以 Datalog 启发的绑定语言表达查询,并在运行时动态地将它们转换为微分数据流。这对于嵌入到特定应用程序中的库或作为独立服务(例如,通过包含的 WebSocket 服务器)都同样适用。

反应式关系查询: 声明式提供了一种关系查询语言,完全支持传统的二进制连接、最坏情况下的最优 n 路连接、反连接、各种聚合、谓词、并和投影。查询由规则组成,规则可以相互依赖(或递归地依赖自身)。随着输入的变化,查询结果会增量更新。

[WIP] 反应式 GraphQL 查询: 声明式还提供了对类似 GraphQL 的查询的内建支持,以实现更面向文档的使用模型。

可插拔的接收器和源: 声明式可以扩展为从 Kafka 或 Datomic 等外部系统读取数据,并将结果写回到这些系统,以及从 csv 文件等静态源读取数据。

可插拔的前端: Datalog 和 SQL 等语言可以轻松地实现在声明式之上。虽然可能不是“轻松”,但比没有声明式要容易。提供了一个 Clojure(Script) 前端

由于微分数据流,所有这些功能都在数据流模型中提供,因此可以扩展到多个独立的工人。与手动编写的微分数据流相比,声明式效率较低,但更具有意见性。特别是,它强制执行一个完全规范化的、类似于 RDF 的数据模型,这在很大程度上受到了如 Datomic 或 LogicBlox 等系统的影响。除此之外,声明式本质上就是微分数据流,可以与静态的手写数据流共存并交互。

此存储库包含库本身、一个 服务器 和一个 命令行界面

构建

该库使用cargo构建。通过包含在本存储库中的rust-toolchain文件强制执行足够新版本的Rust工具链。

声明式数据流使用log crate。可以通过设置环境变量RUST_LOGRUST_LOG=declarative_dataflow=<level>来启用特定级别的日志记录。

文档

crate文档可在crates.io上找到。

重要的架构决策记录在docs/adr/子目录中。

可以通过运行cargo doc --no-deps来构建此包的文档,并通过运行cargo doc --no-deps --open在浏览器中查看。请参阅declarative_dataflow::plan::Plan以获取有关可用操作符的文档。测试目录tests/包含使用示例。

客户端

声明式数据流服务器接受较低级别的关系查询计划表示,这意味着它是前端无关的。但是,手动编写查询计划相当繁琐,并且不映射到任何有趣的高级语义。因此,目前我们提供了一个用Clojure编写的Datalog前端

有关支持的查询计划的概述,请参阅文档

进一步阅读/观看

关于此项目高级动机的帖子.

[视频] Reactive Datalog For Datomic,记录于Clojure/conj 2018。

[视频] 3DF: Reactive Datalog For Datomic,记录于:clojureD 2019。

Clockworks博客上有关于声明式的一些帖子。

依赖关系

~6–8MB
~81K SLoC