2026-04-09 12:38:43 +02:00
2026-04-09 12:38:43 +02:00
2026-04-09 12:38:43 +02:00
2026-04-09 12:38:43 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 12:38:43 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 11:37:46 +02:00
2026-04-09 12:38:43 +02:00
2026-04-09 11:37:46 +02:00

Query Engine

An experimental Rust project for building query-engine components.

Right now the repository is centered on a chase-based reasoning core plus a small interactive frontend. The broader target shape is a query engine with clearer front-end, planning, optimization, and execution boundaries.

Current scope

  • Chase-based rule evaluation over facts, rules, and substitutions
  • Restricted-chase style materialization with active-trigger checks
  • Provenance-oriented explanations for derived answers
  • Script, REPL, and local web UI for experimentation

Intended direction

The medium-term direction is to evolve this project from a copied chase-rs codebase into a more general query-engine playground with:

  • explicit front-end and parsing layers
  • internal planning representations
  • clearer separation between logical meaning and execution strategy
  • support for multiple query-engine experiments instead of only chase logic

The current code does not yet implement a SQL front end, logical plan, or physical plan. The repository naming, docs, and user-facing surfaces now reflect that more honestly.

Quickstart

Rust API

use query_engine::{Atom, Instance, Term, chase};
use query_engine::chase::rule::RuleBuilder;

let instance: Instance = vec![
    Atom::new("Parent", vec![Term::constant("alice"), Term::constant("bob")]),
    Atom::new("Parent", vec![Term::constant("bob"), Term::constant("carol")]),
]
.into_iter()
.collect();

let rule1 = RuleBuilder::new()
    .when("Parent", vec![Term::var("X"), Term::var("Y")])
    .then("Ancestor", vec![Term::var("X"), Term::var("Y")])
    .build();

let rule2 = RuleBuilder::new()
    .when("Ancestor", vec![Term::var("X"), Term::var("Y")])
    .when("Parent", vec![Term::var("Y"), Term::var("Z")])
    .then("Ancestor", vec![Term::var("X"), Term::var("Z")])
    .build();

let result = chase(instance, &[rule1, rule2]);

assert!(result.terminated);
assert_eq!(result.instance.facts_for_predicate("Ancestor").len(), 3);

CLI

cargo run -- repl
cargo run -- gui
cargo run -- script examples/scripts/ancestor.chase

REPL language

fact Parent(alice, bob).
rule Parent(?X, ?Y) -> Ancestor(?X, ?Y).
run.
query Ancestor(?X, ?Y)?
explain Ancestor(alice, carol)?
show facts
show rules
reset
help

Development

For non-trivial changes, run:

cargo test
cargo clippy --all-targets --all-features -- -D warnings
cargo fmt --check

Notes

This repository is still centered on a rule-engine core. The longer-term goal is to grow it into a broader query-engine project without claiming SQL, logical-planning, or physical-planning support before those layers exist.

License

This project is licensed under BSD-3.

Description
Material for building a (generic) query engine (with a hybrid chase-SQL querying interface)
Readme BSD-3-Clause 739 KiB
Languages
Rust 98.7%
Makefile 1%
Nix 0.3%