from datetime import date from neo4j import GraphDatabase def upsert_fact_with_supersession( driver: GraphDatabase, entity_id: str, property_name: str, new_value: str, valid_from: date, source_doc_id: str, ) -> None: """ Write a new fact, terminating any currently-open assertion for the same property. Old assertions are retained for audit; only valid_to is set. """ with driver.session() as session: session.run(""" // Terminate the previous open assertion for this property MATCH (e:Entity {id: $entity_id})-[:HAS_FACT]->(f:Fact) WHERE f.property_name = $property_name AND f.valid_to IS NULL SET f.valid_to = date($valid_from) - duration('P1D') """, entity_id=entity_id, property_name=property_name, valid_from=str(valid_from)) session.run(""" // Insert the new assertion with open valid_to MATCH (e:Entity {id: $entity_id}) CREATE (e)-[:HAS_FACT]->(f:Fact { property_name: $property_name, value: $new_value, valid_from: date($valid_from), valid_to: null, source_doc_id: $source_doc_id }) """, entity_id=entity_id, property_name=property_name, new_value=new_value, valid_from=str(valid_from), source_doc_id=source_doc_id)