"""Neo4j connector Client.""" from contextlib import contextmanager from neo4j import GraphDatabase import config neo4j_driver = GraphDatabase.driver( config.NEO4J_URL, auth=(config.NEO4J_USERNAME, config.NEO4J_PASSWORD), max_transaction_retry_time=config.NEO4J_MAX_RETRY_TIME, ) @contextmanager def db_session(access_mode=None): """Provide a session for series of operations. Session will closed once the whole flask request is done. Commit and rollbacks has to be managed by caller. access_mode: default access mode (read or write) for transactions in this session / flask request as we open session once per request. Usage: # Default usage with db_session() as session: session.run("MATCH (a:Person {name: $name}) RETURN a", name=name) # Auto-commit transaction with db_session() as session: session.run("CREATE (a:Person {name: $name})", name=name) # explicit with db_session() as session: tx = session.begin_transaction() try: result = tx.run("CREATE (n:Person{lastname:'test'})") tx.commit() except CypherError as e: tx.rollback() """ neo4j_db = _get_neo4j_session(access_mode) yield neo4j_db def _get_neo4j_session(access_mode): """Select appropriate driver based on FFlag.""" return neo4j_driver.session(default_access_mode=access_mode)