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.
SynaLemma vs Apache Ossie at a glance
| Criterion | SynaLemma | Apache Ossie |
|---|---|---|
| What it is | A language with a compiler and a verifier | A YAML specification for exchanging definitions |
| Runs queries | Yes: compiles to SQL for seven engines | No: each tool that reads the file decides |
| Definitions build on each other | Yes: rules use other rules | No: a metric cannot reference another metric |
| Relationships | Any relationship a rule states | Many-to-one foreign keys |
| Hierarchies and multi-hop chains | Native recursion, verified to terminate | Not expressible |
| What checks the definitions | A symbolic verifier, plus assertions on the data | Validation against the schema and references |
| For agents | The analyst writes rules the verifier checks | Free-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.
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"); Sources
Checked against each product's public documentation on the review date. To report an error: contact@synalinks.com.
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.
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.