package main import ( "context" "log" "net/http" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" "knowledge-graph-backend/docs" "knowledge-graph-backend/internal/config" "knowledge-graph-backend/internal/handler" neo4jClient "knowledge-graph-backend/internal/repository/neo4j" "knowledge-graph-backend/internal/service" ) // @title 知识图谱 API // @version 1.0.0 // @description 知识图谱后端服务,提供图数据查询、节点搜索等功能 // @host localhost:3001 // @BasePath / func main() { cfg, err := config.Load() if err != nil { log.Fatalf("Failed to load config: %v", err) } driver := neo4jClient.NewDriver(cfg.Neo4j) defer driver.Close(context.Background()) graphService := service.NewNeo4jService(driver) graphHandler := handler.NewGraphHandler(graphService) searchHandler := handler.NewSearchHandler(graphService) nodeHandler := handler.NewNodeHandler(graphService) // 增删改处理器 nodeCRUDHandler := handler.NewNodeCRUDHandler(graphService) edgeCRUDHandler := handler.NewEdgeCRUDHandler(graphService) router := gin.Default() router.Use(cors.New(cfg.CORS.ToGinConfig())) docs.SwaggerInfo.BasePath = "/" router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // @Summary 健康检查 // @Description 检查服务是否正常运行 // @Produce json // @Success 200 {object} map[string]string "成功" // @Router /health [get] router.GET("/health", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "status": "ok", "message": "Knowledge Graph API is running", "version": "1.0.0", }) }) api := router.Group("/api") { api.GET("/graph", graphHandler.GetGraphData) api.GET("/graph/stats", graphHandler.GetStats) api.GET("/graph/simpleJson", graphHandler.GetSimpleGraphData) api.GET("/search", searchHandler.SearchNodes) // 节点查询路由 api.GET("/nodes/:id", nodeHandler.GetNodeByID) api.GET("/nodes/:id/neighbors", nodeHandler.GetNeighbors) // 节点增删改路由 api.POST("/nodes", nodeCRUDHandler.CreateNode) api.PUT("/nodes/:id", nodeCRUDHandler.UpdateNode) api.DELETE("/nodes/:id", nodeCRUDHandler.DeleteNode) // 边增删改路由 api.POST("/edges", edgeCRUDHandler.CreateEdge) api.DELETE("/edges/:id", edgeCRUDHandler.DeleteEdge) } log.Println("Knowledge Graph API Server running on http://localhost:" + cfg.Server.Port) log.Println("Data file loaded from: " + cfg.Data.FilePath) log.Println("Available endpoints:") log.Println(" GET /health - Health check") log.Println(" GET /api/graph - Get all graph data") log.Println(" GET /api/graph/stats - Get graph statistics") log.Println(" GET /api/graph/simpleJson - Get simplified graph data (for LLM)") log.Println(" GET /api/search?q=query - Search nodes") log.Println(" GET /api/nodes/:id - Get node by ID") log.Println(" GET /api/nodes/:id/neighbors - Get node neighbors") log.Println(" POST /api/nodes - Create new node") log.Println(" PUT /api/nodes/:id - Update node") log.Println(" DELETE /api/nodes/:id - Delete node") log.Println(" POST /api/edges - Create new edge") log.Println(" DELETE /api/edges/:id - Delete edge") if err := router.Run(":" + cfg.Server.Port); err != nil { log.Fatalf("Failed to start server: %v", err) } }