Explorar el Código

查询节点关系接口

yuchengwei hace 1 mes
padre
commit
15e76c2fa0
Se han modificado 2 ficheros con 61 adiciones y 9 borrados
  1. 44 0
      router/knowledge_saas.py
  2. 17 9
      service/kg_edge_service.py

+ 44 - 0
router/knowledge_saas.py

@@ -7,6 +7,8 @@ from sqlalchemy.orm import Session
 
 from service.kg_node_service import KGNodeService
 from service.trunks_service import TrunksService
+from service.kg_edge_service import KGEdgeService
+from service.kg_prop_service import KGPropService
 import logging
 
 router = APIRouter(prefix="/saas", tags=["SaaS Knowledge Base"])
@@ -43,6 +45,9 @@ class VectorSearchRequest(BaseModel):
     limit: int = 10
     type: Optional[str] = None
 
+class NodeRelationshipRequest(BaseModel):
+    src_id: int
+
 @router.post("/nodes/paginated_search2", response_model=StandardResponse)
 async def paginated_search(
     payload: PaginatedSearchRequest,
@@ -192,4 +197,43 @@ async def get_trunk(
         logger.error(f"获取trunk详情失败: {str(e)}")
         raise HTTPException(500, detail=StandardResponse.error(str(e)))
 
+@router.get("/nodes/{src_id}/relationships", response_model=StandardResponse)
+async def get_node_relationships(
+    src_id: int,
+    db: Session = Depends(get_db)
+):
+    try:
+        edge_service = KGEdgeService(db)
+        prop_service = KGPropService(db)
+        
+        edges = edge_service.get_edges_by_nodes(src_id=src_id, dest_id=None)
+        relationships = []
+        
+        for edge in edges:
+            dest_node = edge['dest_node']
+            dest_props = [{'prop_title': p['prop_title'], 'prop_value': p['prop_value']} 
+                          for p in prop_service.get_props_by_ref_id(dest_node['id'])]
+            
+            edge_props = [{'prop_title': p['prop_title'], 'prop_value': p['prop_value']}
+                         for p in prop_service.get_props_by_ref_id(edge['id'])]
+            
+            relationships.append({
+                "name": edge['name'],
+                "properties": edge_props,
+                "targetNode": {
+                    "category": dest_node['category'],
+                    "id": str(dest_node['id']),
+                    "name": dest_node['name'],
+                    "properties": dest_props
+                }
+            })
+        
+        return StandardResponse(
+            success=True,
+            data={"relationships": relationships}
+        )
+    except Exception as e:
+        logger.error(f"获取节点关系失败: {str(e)}")
+        raise HTTPException(500, detail=StandardResponse.error(str(e)))
+
 saas_kb_router = router

+ 17 - 9
service/kg_edge_service.py

@@ -85,15 +85,23 @@ class KGEdgeService:
                 edges = self.db.query(KGEdge).filter(or_(*filters)).all()
             from service.kg_node_service import KGNodeService
             node_service = KGNodeService(self.db)
-            return [{
-                'id': edge.id,
-                'src_id': edge.src_id,
-                'dest_id': edge.dest_id,
-                'name': edge.name,
-                'version': edge.version,
-                'src_node': node_service.get_node(edge.src_id),
-                'dest_node': node_service.get_node(edge.dest_id)
-            } for edge in edges]
+            result = []
+            for edge in edges:
+                try:
+                    edge_info = {
+                        'id': edge.id,
+                        'src_id': edge.src_id,
+                        'dest_id': edge.dest_id,
+                        'name': edge.name,
+                        'version': edge.version,
+                        'src_node': node_service.get_node(edge.src_id),
+                        'dest_node': node_service.get_node(edge.dest_id)
+                    }
+                    result.append(edge_info)
+                except ValueError as e:
+                    logger.warning(f"跳过边关系 {edge.id}: {str(e)}")
+                    continue
+            return result
         except Exception as e:
             logger.error(f"查询边失败: {str(e)}")
             raise e