| TerminusDB | |
|---|---|
| Developer | Gettier |
| Release | 2019 |
| Stable release | |
| Written in | Rust, Prolog |
| Type | Graph database |
| License | |
| Website | https://terminusdb.com |
| Repository | |
TerminusDB is an open source knowledge graph database with version control. It is used to build versioned data products. It is a native revision control database that is architecturally similar to Git. It is listed on DB-Engines.
TerminusDB provides a document API for building graphs via the JSON exchange format. It implements both GraphQL and a datalog variant called WOQL.
TerminusDB is available under the Apache 2.0 license. TerminusDB is implemented in Prolog and Rust.
TerminusDB was founded in Dublin, Ireland. Starting in Trinity College Dublin, the development team behind TerminusDB ran the Horizon 2020 project ALIGNED that worked from February 2015 to January 2018. An open-access e-book entitled Engineering Agile Big-Data Systems was published on completion of the ALIGNED project. Gettier (formerly DFRNT) continues to maintain TerminusDB starting 2025.
Version 1.0 was released in October 2019. TerminusDB was first released under the GPLv3 license with the client libraries released with the Apache 2 license. With v4.0, which was released in December 2020, TerminusDB switched to the Apache 2.0 license. The shift was discussed extensively. The current version is 12.0.
| Version | Release date | Feature notes | Refs |
|---|---|---|---|
| 1.0 | October 2019 |
|
|
| 1.1 | January 2020 |
|
|
| 2.0 | June 2020 |
|
|
| 3.0 | September 2020 |
|
|
| 4.0 | December 2020 |
|
|
| 4.1 | December 2020 |
|
|
| 4.2 | February 2021 |
|
|
| 10.0 | September 2021 |
|
|
| 11.0 | January 2023 |
|
|
| 11.1 | July 2023 |
|
|
| 12.0 | December 2025 |
|
TerminusDB is named after the Roman God of Boundaries, Terminus. It is also named after the home planet of the Foundation in the series of science-fiction novel by Isaac Asimov.
TerminusDB is an in-memory knowledge graph database management system with a rich datalog query language that uses globally unique IRI to address all triples (nodes connected by edges). The design of the underlying data structure, which is implemented in a Rust library, uses succinct data structures and a delta encoding approach drawing inspiration from software source control systems like Git. This allows Git semantics to be used in TerminusDB.
TerminusDB is based on the RDF standard. This standard specifies finite labelled directed graphs which are parameterized in some universe of datatypes. The names for nodes and labels are drawn from a set of IRIs (Internationalized Resource Identifiers). TerminusDB uses the XSD datatypes as its universe of concrete values and time according to ISO 8601 including strong support for Allen's interval algebra. For schema design, TerminusDB used the OWL language until version 10.0. Since version 10 it uses a JSON schema interface allowing users to build schemas using a simple JSON format. This provides a rich modelling language which enables constraints on the allowable shapes in the graph.
TerminusDB has a promise based client for the browser and node.js it is available through the npm registry, or can be directly included in web-sites. It also has a Python client for the TerminusDB RESTful API and a python version of the web object query language, WOQLpy. Additional clients have been contributed including for Rust and Elixir.
GraphQL is implemented to allow users to query TerminusDB projects in such a way that deep linking can be discovered.
WOQL (web object query language) is a datalog-based query language. It allows TerminusDB to treat the database as a document store or a graph interchangeably, and provides query features to make relationship traversals easy. This gives a relatively straightforward human-readable format which can be easily stored in TerminusDB itself.
A datalog query to identify, for each month in H1 [half-open sequence), both the first and last day, where the leap year is recognized.
let v = Vars("ym", "month_start", "month_end")
and(
sequence(v.ym,
literal("2024-01", "xsd:gYearMonth"),
literal("2024-07", "xsd:gYearMonth")),
month_start_date(v.ym, v.month_start),
month_end_date(v.ym, v.month_end)
)