neo4j_models.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. """
  2. Neo4j图数据库模型定义
  3. 提供Neo4j图数据库相关的数据结构定义
  4. """
  5. from typing import Optional, Dict, Any, List
  6. from dataclasses import dataclass
  7. from datetime import datetime
  8. @dataclass
  9. class Neo4jNode:
  10. """Neo4j节点数据模型"""
  11. id: Optional[int] = None
  12. labels: List[str] = None
  13. properties: Optional[Dict[str, Any]] = None
  14. created_at: Optional[datetime] = None
  15. def __post_init__(self):
  16. if self.labels is None:
  17. self.labels = []
  18. if self.properties is None:
  19. self.properties = {}
  20. def to_dict(self) -> Dict[str, Any]:
  21. """转换为字典"""
  22. return {
  23. 'id': self.id,
  24. 'labels': self.labels,
  25. 'properties': self.properties,
  26. 'created_at': self.created_at.isoformat() if self.created_at else None
  27. }
  28. @classmethod
  29. def from_dict(cls, data: Dict[str, Any]) -> 'Neo4jNode':
  30. """从字典创建实例"""
  31. return cls(
  32. id=data.get('id'),
  33. labels=data.get('labels', []),
  34. properties=data.get('properties', {}),
  35. created_at=datetime.fromisoformat(data['created_at']) if data.get('created_at') else None
  36. )
  37. @dataclass
  38. class Neo4jRelationship:
  39. """Neo4j关系数据模型"""
  40. id: Optional[int] = None
  41. type: str = ""
  42. start_node_id: Optional[int] = None
  43. end_node_id: Optional[int] = None
  44. properties: Optional[Dict[str, Any]] = None
  45. created_at: Optional[datetime] = None
  46. def __post_init__(self):
  47. if self.properties is None:
  48. self.properties = {}
  49. def to_dict(self) -> Dict[str, Any]:
  50. """转换为字典"""
  51. return {
  52. 'id': self.id,
  53. 'type': self.type,
  54. 'start_node_id': self.start_node_id,
  55. 'end_node_id': self.end_node_id,
  56. 'properties': self.properties,
  57. 'created_at': self.created_at.isoformat() if self.created_at else None
  58. }
  59. @classmethod
  60. def from_dict(cls, data: Dict[str, Any]) -> 'Neo4jRelationship':
  61. """从字典创建实例"""
  62. return cls(
  63. id=data.get('id'),
  64. type=data.get('type', ''),
  65. start_node_id=data.get('start_node_id'),
  66. end_node_id=data.get('end_node_id'),
  67. properties=data.get('properties', {}),
  68. created_at=datetime.fromisoformat(data['created_at']) if data.get('created_at') else None
  69. )
  70. @dataclass
  71. class Neo4jGraph:
  72. """Neo4j图数据模型"""
  73. nodes: List[Neo4jNode] = None
  74. relationships: List[Neo4jRelationship] = None
  75. metadata: Optional[Dict[str, Any]] = None
  76. def __post_init__(self):
  77. if self.nodes is None:
  78. self.nodes = []
  79. if self.relationships is None:
  80. self.relationships = []
  81. if self.metadata is None:
  82. self.metadata = {}
  83. def to_dict(self) -> Dict[str, Any]:
  84. """转换为字典"""
  85. return {
  86. 'nodes': [node.to_dict() for node in self.nodes],
  87. 'relationships': [rel.to_dict() for rel in self.relationships],
  88. 'metadata': self.metadata
  89. }
  90. @classmethod
  91. def from_dict(cls, data: Dict[str, Any]) -> 'Neo4jGraph':
  92. """从字典创建实例"""
  93. nodes_data = data.get('nodes', [])
  94. relationships_data = data.get('relationships', [])
  95. nodes = [Neo4jNode.from_dict(node_data) for node_data in nodes_data]
  96. relationships = [Neo4jRelationship.from_dict(rel_data) for rel_data in relationships_data]
  97. return cls(
  98. nodes=nodes,
  99. relationships=relationships,
  100. metadata=data.get('metadata', {})
  101. )
  102. __all__ = [
  103. "Neo4jNode",
  104. "Neo4jRelationship",
  105. "Neo4jGraph"
  106. ]