Skip to content

v3.0.1 — Temporal Ops in Changeset + Graph-Scoped Temporal Storage

Choose a tag to compare

@tom-dyar tom-dyar released this 11 Sep 18:39
· 305 commits to main since this release
15f3d78

Breaking change — storage layout

All five temporal ^KG globals now use graphKey as first subscript, matching the
structural adjacency convention from v2.15. Existing deployments with temporal data
must migrate before upgrading:

Do ##class(Graph.KG.TemporalIndex).MigrateToGraphScoped()

New deployments and deployments with no temporal data are unaffected.

What's new

Temporal ops in Changeset

Changeset.create_temporal_edge() commits a temporal edge write inside the same
TSTART/TCOMMIT transaction as all other ops in the changeset — structural and
temporal mutations are atomic.

cs = Changeset(actor="ingest", actor_type="ingest")
cs.upsert_node("svc-auth")
cs.upsert_node("svc-db")
cs.create_temporal_edge(
    "svc-auth", "CALLS", "svc-db",
    ts=1_750_000_100,
    weight=0.7,
    graph="acme",          # optional; None = default graph
)
result = engine.ledger.commit(cs)

Temporal edges appear in ledger.diff() with entity_kind="temporal_edge".
Replaying a changeset with an idempotency_key is safe — mode="update" (default)
is last-write-wins.

Graph-scoped temporal queries

All temporal engine methods now accept a graph parameter, scoping reads and writes
to a named graph:

engine.create_edge_temporal("a", "P", "b", timestamp=ts, weight=1.0, graph="acme")
engine.get_edges_in_window("a", "P", ts_start, ts_end, graph="acme")

Omitting graph (or passing None) uses the default graph — existing single-tenant
callers require no changes.

Install

pip install iris-vector-graph==3.0.1