Standard knowledge graph edges are timeless by default. When you insert "Company X → CEO → Person A," there is no expiration date on that relationship. The graph becomes stale the moment the CEO changes, but it does not know it is stale.
In 2asy.ai, I ran into this building a multilingual knowledge graph for East Asian corporate data. Corporate structures change constantly — leadership transitions, subsidiary changes, regulatory status updates — and every change makes some existing edges incorrect rather than just outdated.
The fix is temporal modeling on the edge layer. Every relationship gets (valid_from, valid_to) as first-class properties. When an event modifies an existing relationship, the old edge gets a closed valid_to date rather than being deleted. Graph traversal queries default to as-of the current date unless the caller explicitly requests full history.
The hard part is supersession logic. A CEO appointment supersedes the previous CEO — it is a one-to-one role, and the new edge invalidates the old one. A new subsidiary relationship does not supersede existing ones — a company can have multiple subsidiaries simultaneously, so the new edge extends rather than replaces. This distinction has to live in the edge schema, not in the insertion code. If it lives in insertion code, every developer who writes an insertion path has to know the business rules. If it lives in the schema, the graph enforces it.
For Graph RAG, this matters at retrieval time. A query for "Samsung's leadership structure in Q3 2024" needs to traverse edges that were valid during that specific window. Without temporal modeling, the graph returns the current structure and nothing in the response signals that it is answering a different question than the one asked.
The retrieval accuracy difference between a temporally-modeled graph and a static graph is not visible on test sets built from current data. It shows up the first time a user asks a historical question and the system answers confidently with the wrong year's data.