目标:建立「本体概念 ↔ 现有表字段」的映射(mapsTo),把语义层桥接到账单表/维度表。
本体管语义,现有表管数据,mapsTo 是桥:
本体概念(GMV) ──mapsTo──> 账单表字段(dwd_bill.bill_amount)
维度成员(华东区) ──mapsTo──> 维度表字段值(dim_region.region_group='华东区')
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 '本体到现有表的映射';
| 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 | - | - |
映射直接写在本体文件里(02 文档的 :mapsToColumn "dwd_bill.bill_amount"),推理时一起加载。语义 + 映射一处维护,简单。
映射存关系表,本体只管语义。映射变更不用动本体,适合指标多、映射频繁调整的场景。
① 本体推理:识别用户问的是「GMV」(等价推理:成交额≡GMV)
② 读映射:查 ontology_mapping,拿到 table_name/column_name/calc_expr/filter_expr
③ 生成 SQL:用映射信息 + 维度展开结果拼 SQL
filter_expr 存口径过滤,SQL 生成时强制拼接calc_expr 存表达式,生成 SQL 时展开