neo4j_driver.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from neo4j import GraphDatabase
  2. from neo4j.exceptions import ServiceUnavailable
  3. import os
  4. class Neo4jDriver:
  5. def __init__(self, uri=None, user=None, password=None, encrypted=False):
  6. self._driver = None
  7. # 优先使用传入的参数
  8. if uri is not None:
  9. self.uri = uri
  10. elif user is not None or password is not None or encrypted is not None:
  11. # 如果只传了部分参数,使用环境变量或默认值填充缺失的
  12. self.uri = os.environ.get('NEO4J_URI', "bolt://192.168.3.143:7687")
  13. else:
  14. # 无参数调用时,尝试从Flask配置获取,否则使用环境变量或默认值
  15. self.uri = self._get_config_value('NEO4J_URI', "bolt://192.168.3.143:7687")
  16. if user is not None:
  17. self.user = user
  18. else:
  19. self.user = self._get_config_value('NEO4J_USER', "neo4j")
  20. if password is not None:
  21. self.password = password
  22. else:
  23. self.password = self._get_config_value('NEO4J_PASSWORD', "cituneo4j")
  24. if encrypted is not None:
  25. self.encrypted = encrypted
  26. else:
  27. encrypted_str = self._get_config_value('NEO4J_ENCRYPTED', 'false')
  28. self.encrypted = encrypted_str.lower() == 'true' if isinstance(encrypted_str, str) else encrypted_str
  29. def _get_config_value(self, key, default_value):
  30. """获取配置值,优先从Flask配置获取,否则从环境变量获取,最后使用默认值"""
  31. try:
  32. # 尝试从Flask配置获取
  33. from flask import current_app
  34. if current_app and hasattr(current_app, 'config'):
  35. return current_app.config.get(key, default_value)
  36. except (ImportError, RuntimeError):
  37. # 不在Flask环境中或Flask应用上下文外
  38. pass
  39. # 从环境变量获取
  40. return os.environ.get(key, default_value)
  41. def connect(self):
  42. if not self._driver:
  43. self._driver = GraphDatabase.driver(
  44. self.uri,
  45. auth=(self.user, self.password),
  46. encrypted=self.encrypted
  47. )
  48. return self._driver
  49. def close(self):
  50. if self._driver:
  51. self._driver.close()
  52. self._driver = None
  53. def verify_connectivity(self):
  54. try:
  55. self.connect().verify_connectivity()
  56. return True
  57. except ServiceUnavailable:
  58. return False
  59. def get_session(self):
  60. """获取 Neo4j 会话"""
  61. return self.connect().session()
  62. # 单例实例
  63. neo4j_driver = Neo4jDriver()