What bitemporal means
Two time axes on every fact:
- Valid time (
valid_from/valid_to): when the fact was true in the world - Recorded time (
recorded_from/recorded_to): when we observed/wrote the fact
Most databases conflate these. StaticOwl tracks them separately — which is what makes "the disclosure said X on March 14th" answerable even if you corrected the disclosure on March 20th.
Examples
Editing an article
You write a draft on May 1st (valid_from=2026-05-01, recorded_from=2026-05-01). Publish on May 3rd (valid_from=2026-05-03, recorded_from=2026-05-03). Edit on May 5th. Each version is a separate graph node, all preserved.
Late correction
You realize on May 10th that the article had a typo as of May 3rd. You correct it via db.correctValidFrom. The corrected version has valid_from=2026-05-03, recorded_from=2026-05-10, _supersedes_prior=true. Now:
db.history(article)shows both: original (recorded May 3, valid May 3) and corrected (recorded May 10, valid May 3, supersedes original)- A reader querying "what did this article say on May 3rd, as observed today?" gets the corrected version
- A reader querying "what did this article say on May 3rd, as observed on May 4th?" gets the original (with the typo)
That's bitemporal. Auditors love it.
What this enables
- Replay:
MATCH (n) AT '2026-03-14T14:30:00Z' RETURN nreturns the world as it was at that moment - Diff:
db.diff(t1, t2)returns added / removed / changed entities and properties between two timestamps - Property history:
db.propertyHistory(entityId, 'fieldName')returns intervals of values over time - Compliance corrections: separate operation, no destructive edits