Apache Ossie alternative

The Apache Ossie alternative: a language with a compiler and a verifier

Synalog definitions build on each other, compile to SQL on seven engines and are verified before they run.

At a glance

SynaLemma vs Apache Ossie at a glance

SynaLemma vs Apache Ossie at a glance
CriterionSynaLemmaApache Ossie
What it is A language with a compiler and a verifierA YAML specification for exchanging definitions
Runs queries Yes: compiles to SQL for seven enginesNo: each tool that reads the file decides
Definitions build on each other Yes: rules use other rulesNo: a metric cannot reference another metric
Relationships Any relationship a rule statesMany-to-one foreign keys
Hierarchies and multi-hop chains Native recursion, verified to terminateNot expressible
What checks the definitions A symbolic verifier, plus assertions on the dataValidation against the schema and references
For agents The analyst writes rules the verifier checksFree-text hints (ai_context) for a model to read

Why teams look for an Apache Ossie alternative

  • A file format only. Ossie does not run queries; each tool decides how to turn it into SQL (Ossie).

  • No composition. A metric cannot reference another metric, and datasets cannot build on each other (spec).

  • Many-to-one only. Every relationship is a many-to-one foreign key (relational semantics).

  • Schema validation only. A valid file says nothing about what its metrics compute.

SynaLemma vs Apache Ossie: key differences

1. A compiler

One Synalog program compiles to SQL for PostgreSQL, BigQuery, Databricks, Trino, Presto, DuckDB and SQLite.

2. Definitions that build on each other

Rules use other rules, so a definition is written once and reused.

3. Recursion and time

Hierarchies, multi-hop chains, negation and reasoning over time, in the same language.

4. A verifier and assertions

Every rule is proved well-formed, safe and terminating, and assertions check the data with counterexamples.

Example: a definition and its assertions

Revenue per customer, with three assertions. Customer 12 is missing from the customers table; the engine names the row.

shop.l
Order(order_id:, customer_id:, amount:, status:) :- orders(order_id:, customer_id:, amount:, status:);
Customer(customer_id:, country:) :- customers(customer_id:, country:);

@Assert(Revenue,
      one_row_per_customer: "∀ c r s, Revenue c r → Revenue c s → r = s",
      known_customer:       "∀ c r, Revenue c r → ∃ k, Customer c k",
      positive:             "∀ c, Revenue c > 0");
Revenue(customer_id:, revenue? += amount) distinct :-
  Order(customer_id:, amount:, status: "delivered");
$ synalog shop.l verify
✓ Revenue.one_row_per_customer holds ✗ Revenue.known_customer is violated: ∀ c r, Revenue c r → ∃ k, Customer c k 1 counterexample: +----+----+ | c | r | +----+----+ | 12 | 20 | +----+----+ 1 row ✓ Revenue.positive holds

Sources

Checked against each product's public documentation on the review date. To report an error: contact@synalinks.com.

FAQ

Apache Ossie alternative: FAQ

What is the difference between Apache Ossie and Synalog?

Ossie is a YAML format for exchanging definitions; it does not run queries. Synalog is a language with a compiler and a verifier.

Can an Ossie metric reference another metric?

Not in Ossie's current version. In Synalog, rules use other rules.

Is a semantic layer file enough for AI agents?

No. A file gives a model hints. SynaLemma verifies every definition an agent writes before it is used.

See it on your data

Bring a question your current stack can't answer.

In 30 minutes, we show SynaLemma answering it, with the rule behind the number and the checks it passed.