# 03 · 本体数据映射实现

> 目标：建立「本体概念 ↔ 现有表字段」的映射（mapsTo），把语义层桥接到账单表/维度表。

## 1. 映射设计

本体管语义，现有表管数据，mapsTo 是桥：

```
本体概念（GMV）    ──mapsTo──>  账单表字段（dwd_bill.bill_amount）
维度成员（华东区） ──mapsTo──>  维度表字段值（dim_region.region_group='华东区'）
```

## 2. 映射表结构（DDL）

```sql
CREATE TABLE ontology_mapping (
    mapping_id   BIGINT COMMENT '映射ID',
    onto_concept STRING COMMENT '本体概念IRI（如 :GMV）',
    concept_type STRING COMMENT '类型：metric/dimension/measure',
    table_name   STRING COMMENT '物理表名',
    column_name  STRING COMMENT '物理字段名',
    filter_expr  STRING COMMENT '口径过滤表达式',
    calc_expr    STRING COMMENT '计算表达式'
) COMMENT '本体到现有表的映射';
```

## 3. 映射示例数据（映射到现有账单表）

| onto_concept | concept_type | table_name | column_name | calc_expr | filter_expr |
|-------------|-------------|------------|-------------|-----------|-------------|
| :GMV | metric | dwd_bill | bill_amount | SUM(bill_amount) | status='paid' AND refunded=false |
| :订单数 | metric | dwd_bill | bill_count | SUM(bill_count) | status='paid' |
| :客单价 | metric | dwd_bill | - | SUM(bill_amount)/SUM(bill_count) | status='paid' AND refunded=false |
| :地区 | dimension | dwd_bill | region_id | - | - |
| :大区 | dimension | dim_region | region_group | - | - |

## 4. 映射实现方式

### 4.1 本体内嵌（MVP 推荐）

映射直接写在本体文件里（02 文档的 `:mapsToColumn "dwd_bill.bill_amount"`），推理时一起加载。语义 + 映射一处维护，简单。

### 4.2 独立映射表（生产推荐）

映射存关系表，本体只管语义。映射变更不用动本体，适合指标多、映射频繁调整的场景。

## 5. 查询时的映射使用

```
① 本体推理：识别用户问的是「GMV」（等价推理：成交额≡GMV）
② 读映射：查 ontology_mapping，拿到 table_name/column_name/calc_expr/filter_expr
③ 生成 SQL：用映射信息 + 维度展开结果拼 SQL
```

## 6. 关键注意

- **双向可查**：能从本体概念查字段（生成 SQL），也能从字段反查概念（血缘溯源）
- **口径过滤放映射**：`filter_expr` 存口径过滤，SQL 生成时强制拼接
- **复合指标特殊**：客单价无单一字段，`calc_expr` 存表达式，生成 SQL 时展开
- **维度映射要关联维度表**：地区维度映射到 dim_region（通过 region_id join），这是层级推理的基础
