Repository navigation
v3.0.1 — Temporal Ops in Changeset + Graph-Scoped Temporal Storage
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