┌─────────────────────────────────────────────────┐
│ Controller 层:QueryController(REST API) │
│ POST /api/query → 自然语言问题 │
├─────────────────────────────────────────────────┤
│ Service 层:MetricQueryService(编排) │
│ 槽位提取 → 本体推理 → SQL 生成 → 校验 → 查询 → 归因│
├──────────────┬──────────────┬───────────────────┤
│ ontology 模块 │ sql 模块 │ llm 模块 │
│ 本体加载+推理 │ 模板+DSL生成 │ DeepSeek 调用 │
│ (Jena) │ +口径校验 │ 槽位提取+归因 │
├──────────────┴──────────────┴───────────────────┤
│ query 模块:MaxComputeQueryService(复用已有) │
└─────────────────────────────────────────────────┘
↓
数据层:现有 MaxCompute 账单表 + 维度表
数据流(一次查询):
问题 → [llm] 槽位提取 → [ontology] 等价识别/维度展开 → [sql] 模板+参数 → [sql] 口径校验
→ [query] MaxCompute 执行 → [llm] 归因分析 → 响应
metric-ontology-query/
├── pom.xml
└── src/main/
├── java/com/example/metric/
│ ├── MetricQueryApplication.java # 启动类
│ ├── controller/
│ │ └── QueryController.java # REST API
│ ├── service/
│ │ └── MetricQueryService.java # 编排核心
│ ├── ontology/
│ │ ├── OntologyService.java # 本体加载 + 推理
│ │ └── OntologyProperties.java # 本体/配置路径
│ ├── sql/
│ │ ├── SqlGenerator.java # SQL 生成(模板+DSL)
│ │ ├── CaliberValidator.java # 口径校验
│ │ └── MetricDefinition.java # 指标定义模型
│ ├── llm/
│ │ ├── LlmService.java # DeepSeek 调用
│ │ └── QueryIntent.java # 槽位模型
│ └── query/
│ └── MaxComputeQueryService.java # 复用已有封装
└── resources/
├── ontology/metric.ttl # 本体骨架
├── config/metrics.yaml # 指标配置
└── application.yml
| 模块 | 职责 | 依赖 |
|---|---|---|
| controller | 接收 HTTP 请求,返回结果 | service |
| service | 编排查询流程 | ontology、sql、llm、query |
| ontology | 本体加载、推理(等价/层级/派生) | Jena |
| sql | 模板/DSL 生成 SQL、口径校验 | ontology(读映射) |
| llm | 槽位提取、归因分析 | DeepSeek API |
| query | MaxCompute 执行 | 已有 SDK 封装 |
关键约束:模块间只通过接口交互,service 是唯一的编排入口,ontology 不依赖 sql/llm(本体是独立的语义层)。
metric.ttl 只放概念类、关系、公理(推理关系),不放口径表达式和映射metrics.yaml 放指标的口径、映射、计算逻辑,新增指标只加配置MaxComputeQueryService,不重复造轮子