2 个不稳定版本
0.2.0 | 2019 年 7 月 17 日 |
---|---|
0.1.0 | 2019 年 3 月 31 日 |
#167 in WebSocket
375KB
7K SLoC
声明式数据流
基于 微分数据流 的反应式查询引擎。
特性
交互式使用: 声明式接受以 Datalog 启发的绑定语言表达查询,并在运行时动态地将它们转换为微分数据流。这对于嵌入到特定应用程序中的库或作为独立服务(例如,通过包含的 WebSocket 服务器)都同样适用。
反应式关系查询: 声明式提供了一种关系查询语言,完全支持传统的二进制连接、最坏情况下的最优 n 路连接、反连接、各种聚合、谓词、并和投影。查询由规则组成,规则可以相互依赖(或递归地依赖自身)。随着输入的变化,查询结果会增量更新。
[WIP] 反应式 GraphQL 查询: 声明式还提供了对类似 GraphQL 的查询的内建支持,以实现更面向文档的使用模型。
可插拔的接收器和源: 声明式可以扩展为从 Kafka 或 Datomic 等外部系统读取数据,并将结果写回到这些系统,以及从 csv 文件等静态源读取数据。
可插拔的前端: Datalog 和 SQL 等语言可以轻松地实现在声明式之上。虽然可能不是“轻松”,但比没有声明式要容易。提供了一个 Clojure(Script) 前端。
由于微分数据流,所有这些功能都在数据流模型中提供,因此可以扩展到多个独立的工人。与手动编写的微分数据流相比,声明式效率较低,但更具有意见性。特别是,它强制执行一个完全规范化的、类似于 RDF 的数据模型,这在很大程度上受到了如 Datomic 或 LogicBlox 等系统的影响。除此之外,声明式本质上就是微分数据流,可以与静态的手写数据流共存并交互。
构建
该库使用cargo构建。通过包含在本存储库中的rust-toolchain文件强制执行足够新版本的Rust工具链。
声明式数据流使用log crate。可以通过设置环境变量RUST_LOG
为RUST_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