backend_chatbot / app /utils /neo4j_utils.py
helal94hb1's picture
feat: Initial commit for Hugging Face deployment
58de15f
# app/utils/neo4j_utils.py (Corrected Import)
import logging
# --- MODIFICATION HERE ---
# Import base components from neo4j
from neo4j import AsyncGraphDatabase, AsyncDriver
# Import specific error class from neo4j.exceptions
from neo4j.exceptions import Neo4jError
# --- END MODIFICATION ---
from typing import Optional
# Import settings for credentials
from app.core.config import settings
logger = logging.getLogger(__name__)
# Global variable to hold the driver instance (singleton pattern)
_driver: Optional[AsyncDriver] = None
async def get_driver() -> Optional[AsyncDriver]:
"""
Initializes and returns the singleton Neo4j AsyncDriver instance.
Reads credentials from settings. Returns None on failure.
"""
global _driver
if _driver is None:
uri = settings.NEO4J_URI
username = settings.NEO4J_USERNAME
password = settings.NEO4J_PASSWORD
if not uri or not username or not password:
logger.error("Neo4j connection details (URI, USERNAME, PASSWORD) missing in configuration.")
return None
logger.info(f"Initializing Neo4j Async Driver for URI: {uri}")
try:
_driver = AsyncGraphDatabase.driver(uri, auth=(username, password))
await _driver.verify_connectivity()
logger.info("Neo4j Driver initialized and connection verified.")
# --- MODIFICATION HERE: Catch the correctly imported Neo4jError ---
except Neo4jError as e:
# --- END MODIFICATION ---
logger.exception(f"Failed to initialize Neo4j Driver or verify connection: {e.message} (code: {e.code})")
_driver = None
except Exception as e:
logger.exception(f"An unexpected error occurred during Neo4j Driver initialization: {e}")
_driver = None
return _driver
async def close_driver():
"""Closes the Neo4j AsyncDriver connection if it exists."""
global _driver
if _driver is not None:
logger.info("Closing Neo4j Async Driver...")
try:
await _driver.close()
_driver = None
logger.info("Neo4j Driver closed successfully.")
except Exception as e:
logger.exception(f"Error closing Neo4j Driver: {e}")
# Optional: Dependency for API endpoints if needed later
# ... (keep commented out for now) ...