Spaces:
Sleeping
Sleeping
| # backend/app/core/graph_db.py | |
| from neo4j import AsyncGraphDatabase, AsyncDriver | |
| from app.core.config import settings | |
| import logging | |
| logger = logging.getLogger(__name__) | |
| class Neo4jConnection: | |
| def __init__(self): | |
| self.driver: AsyncDriver | None = None | |
| self.connect() | |
| def connect(self): | |
| if not settings.NEO4J_URI or not settings.NEO4J_PASSWORD: | |
| logger.warning("Neo4j credentials missing. Graph features will be disabled.") | |
| return | |
| try: | |
| # Initialize the ASYNC driver with robust AuraDB pooling settings | |
| self.driver = AsyncGraphDatabase.driver( | |
| settings.NEO4J_URI, | |
| auth=(settings.NEO4J_USERNAME, settings.NEO4J_PASSWORD), | |
| keep_alive=True, | |
| max_connection_lifetime=30 * 60, # Recycle connections every 30 mins | |
| max_connection_pool_size=50, # Prevent connection exhaustion | |
| connection_acquisition_timeout=2 * 60 | |
| ) | |
| logger.info("Successfully initialized Async Neo4j AuraDB driver with pooling!") | |
| except Exception as e: | |
| logger.error(f"Failed to connect to Neo4j: {str(e)}") | |
| self.driver = None | |
| async def close(self): | |
| if self.driver: | |
| await self.driver.close() | |
| logger.info("Neo4j driver connection closed.") | |
| # Instantiate globally | |
| neo4j_db = Neo4jConnection() |