feat: Add base project structure with API and web components
This commit is contained in:
114
api/app/repositories/neo4j/neo4j_connector.py
Normal file
114
api/app/repositories/neo4j/neo4j_connector.py
Normal file
@@ -0,0 +1,114 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Neo4j连接器模块
|
||||
|
||||
本模块提供Neo4j图数据库的连接和查询功能。
|
||||
从 app/core/memory/src/database/neo4j_connector.py 迁移而来。
|
||||
|
||||
Classes:
|
||||
Neo4jConnector: Neo4j数据库连接器,提供异步查询接口
|
||||
"""
|
||||
|
||||
import os
|
||||
from typing import Any, List, Dict
|
||||
|
||||
from neo4j import AsyncGraphDatabase, basic_auth
|
||||
|
||||
from app.core.config import settings
|
||||
|
||||
|
||||
class Neo4jConnector:
|
||||
"""Neo4j数据库连接器
|
||||
|
||||
提供与Neo4j图数据库的连接和查询功能。
|
||||
使用异步驱动程序以支持高并发操作。
|
||||
|
||||
Attributes:
|
||||
driver: Neo4j异步驱动程序实例
|
||||
|
||||
Methods:
|
||||
close: 关闭数据库连接
|
||||
execute_query: 执行Cypher查询
|
||||
delete_group: 删除指定组的所有数据
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
"""初始化Neo4j连接器
|
||||
|
||||
从配置文件和环境变量中读取连接信息。
|
||||
|
||||
Raises:
|
||||
RuntimeError: 如果NEO4J_PASSWORD环境变量未设置
|
||||
"""
|
||||
# 从全局配置和环境变量获取 Neo4j 配置
|
||||
uri = settings.NEO4J_URI
|
||||
username = settings.NEO4J_USERNAME
|
||||
password = settings.NEO4J_PASSWORD
|
||||
|
||||
if not password:
|
||||
raise RuntimeError(
|
||||
"NEO4J_PASSWORD is not set. Create a .env with NEO4J_PASSWORD or export it before running."
|
||||
)
|
||||
self.driver = AsyncGraphDatabase.driver(
|
||||
uri,
|
||||
auth=basic_auth(username, password)
|
||||
)
|
||||
|
||||
async def close(self):
|
||||
"""关闭数据库连接
|
||||
|
||||
释放数据库连接资源。应在应用程序关闭时调用。
|
||||
"""
|
||||
await self.driver.close()
|
||||
|
||||
async def execute_query(self, query: str, **kwargs: Any) -> List[Dict[str, Any]]:
|
||||
"""执行Cypher查询
|
||||
|
||||
Args:
|
||||
query: Cypher查询语句
|
||||
**kwargs: 查询参数,将作为参数传递给Cypher查询
|
||||
|
||||
Returns:
|
||||
List[Dict[str, Any]]: 查询结果列表,每个元素是一个字典
|
||||
|
||||
Example:
|
||||
>>> connector = Neo4jConnector()
|
||||
>>> results = await connector.execute_query(
|
||||
... "MATCH (n:Person {name: $name}) RETURN n",
|
||||
... name="Alice"
|
||||
... )
|
||||
"""
|
||||
result = await self.driver.execute_query(
|
||||
query,
|
||||
database="neo4j",
|
||||
**kwargs
|
||||
)
|
||||
records, summary, keys = result
|
||||
return [record.data() for record in records]
|
||||
|
||||
async def delete_group(self, group_id: str):
|
||||
"""删除指定组的所有数据
|
||||
|
||||
删除所有属于指定group_id的节点和边。
|
||||
这是一个危险操作,会永久删除数据。
|
||||
|
||||
Args:
|
||||
group_id: 要删除的组ID
|
||||
|
||||
Example:
|
||||
>>> connector = Neo4jConnector()
|
||||
>>> await connector.delete_group("group_123")
|
||||
Group group_123 deleted.
|
||||
"""
|
||||
# 删除节点(DETACH DELETE会同时删除相关的边)
|
||||
await self.driver.execute_query(
|
||||
"MATCH (n) WHERE n.group_id = $group_id DETACH DELETE n",
|
||||
database="neo4j",
|
||||
group_id=group_id
|
||||
)
|
||||
# 删除独立的边(如果有的话)
|
||||
await self.driver.execute_query(
|
||||
"MATCH ()-[r]->() WHERE r.group_id = $group_id DELETE r",
|
||||
database="neo4j",
|
||||
group_id=group_id
|
||||
)
|
||||
print(f"Group {group_id} deleted.")
|
||||
Reference in New Issue
Block a user