#datalog #analysis #engine #relation #programs #intended #iteration

datafrog

轻量级Datalog引擎,旨在嵌入到其他Rust程序中

4个版本 (稳定)

2.0.1 2019年1月2日
2.0.0 2018年12月27日
1.0.0 2018年12月5日
0.1.0 2018年5月24日

#288 in 嵌入式开发

Download history 17163/week @ 2024-03-14 16523/week @ 2024-03-21 15888/week @ 2024-03-28 14852/week @ 2024-04-04 15306/week @ 2024-04-11 15999/week @ 2024-04-18 15004/week @ 2024-04-25 15391/week @ 2024-05-02 14483/week @ 2024-05-09 13721/week @ 2024-05-16 16045/week @ 2024-05-23 14309/week @ 2024-05-30 15517/week @ 2024-06-06 15445/week @ 2024-06-13 15781/week @ 2024-06-20 13000/week @ 2024-06-27

62,141 每月下载量
用于 11 个crate(4个直接使用)

Apache-2.0/MIT

59KB
1K SLoC

datafrog

Datafrog是一个轻量级Datalog引擎,旨在嵌入到其他Rust程序中。

Datafrog没有运行时,依赖于您构建并重复应用更新规则。它试图帮助您正确完成此操作。以下是一个使用Datafrog编写可达性查询的示例(省略了填充初始关系 nodesedges 的部分)。

extern crate datafrog;
use datafrog::Iteration;

fn main() {

    // Create a new iteration context, ...
    let mut iteration = Iteration::new();

    // .. some variables, ..
    let nodes_var = iteration.variable::<(u32,u32)>("nodes");
    let edges_var = iteration.variable::<(u32,u32)>("edges");

    // .. load them with some initial values, ..
    nodes_var.insert(nodes.into());
    edges_var.insert(edges.into());

    // .. and then start iterating rules!
    while iteration.changed() {
        // nodes(a,c)  <-  nodes(a,b), edges(b,c)
        nodes_var.from_join(&nodes_var, &edges_var, |_b, &a, &c| (c,a));
    }

    // extract the final results.
    let reachable: Vec<(u32,u32)> = variable.complete();
}

如果您想了解更多关于它是如何工作的,请查看这篇博客文章

作者

Datafrog最初由Frank McSherry开发,后来转移到rust-lang-nursery组织。感谢Frank!

无运行时依赖