一、五条设计原则(先立法,后建模)
| # | 原则 | 含义 | 违反的后果 |
|---|---|---|---|
| 1 | 溯源优先 | 任何一条结构化事实,必须绑定原文出处(志书版本+卷/篇+页+原文摘录)。无溯源的数据不入库 | 数据不可信→卖不出价;”信史”是方志相对其他数据源的唯一垄断优势,溯源就是它的凭证 |
| 2 | 双时间轴 | 每条事实区分事件时间(事情发生在何时)与记录时间(哪一年的志书这样记载)。二者都建模 | 清代志书对明代事件的记载、新旧志书对同一事件的不同记载,无法区分→数据不可考证 |
| 3 | 允许不确定 | 每个字段可携带不确定度标注(存疑/异说/约数),宁可标”不确定”不可强行确定 | AI抽取必然有错;不建模不确定性,一次数据事故就毁掉”权威”人设 |
| 4 | 对齐不重造 | 地名对齐CHGIS+现行行政区划代码,时间对齐GB/T 7408,元数据对齐江苏著录规范/DC。自己只做别人没做的知识层 | 重造轮子→数据成孤岛→永远无法与学术、政务数据流通 |
| 5 | 事件为中心 | 六类实体中,事件(Event)是原子核心——灾害、建置变更、工程、任免、物产记录都是事件,实体通过事件相互关联 | 若按”实体档案卡”建模(人物一张卡、地名一张卡),得到的是百科全书;按事件建模,得到的才是时间序列数据集——后者才有买家 |
二、总体架构:三层模型
┌────────────────────────────────────────────────────────┐
│ L2 资产层(对外销售的产品形态) │
│ 垂直数据集(水灾事件库/建置沿革库/人物库…) │
│ = L1知识层按主题视图打包 + 授权/许可元数据 │
├────────────────────────────────────────────────────────┤
│ L1 知识层(核心资产,私有) │
│ 六类实体 + 关系 + 事实(五元组)+ 溯源 + 置信度 │
│ 存储:图数据库(关系网络)+ 关系库(结构化查询)双写 │
├────────────────────────────────────────────────────────┤
│ L0 文献层(对甲方交付的形态,兼容现有全部标准) │
│ 原版图像 → OCR双层PDF → 篇章树(编章节目)→ 段落切片 │
│ 元数据对齐:江苏著录规范 / 成都DB5101 / 湖南规范 │
└────────────────────────────────────────────────────────┘
关键机制:L0与L1之间通过”锚点”连接。 L1中每条事实的溯源对象,精确指向L0的段落切片ID。这一条连接同时满足三个需求:甲方要的”点击答案看原文”(C端体验)、买家要的”可考证”(数据定价)、你内部要的”抽取质量回溯”(质检)。锚点是整个体系的承重墙,先建它。
三、L1核心:六类实体的字段定义
3.1 事件 Event(原子核心,最先做)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| event_id | URI | ✔ | 全局唯一,规则:fz:event:{志书代码}:{序号} |
| event_type | 受控词表 | ✔ | 一级分类:自然灾害/建置沿革/工程营造/政事/军事/经济生产/文教/人物活动/物产记录…(词表见附件A,约60个二级类目) |
| title | 文本 | ✔ | 规范化事件名,如”1998年XX江特大洪水” |
| time_start / time_end | 时间对象 | ✔ | 支持精确日期、模糊时间(”是年秋”→季节粒度)、朝代纪年(”万历十四年”→含换算公历+换算置信度) |
| time_granularity | 枚举 | ✔ | 年/季/月/日/约,如实记录原文精度,不伪造精度 |
| place_id | →地点实体 | ✔ | 事发地(多级:流域→县→乡镇→具体地点) |
| actors[] | →人物/机构实体 | — | 参与方,带角色(受灾方/主持者/施工方…) |
| measures{} | 结构化指标组 | — | 按事件类型挂载不同指标模板:水灾→水位/流量/受灾面积/死亡人数/经济损失;建置→变更类型(析置/省并/改名/升格)/上级政区/治所;工程→长度/造价/工期 |
| description_raw | 文本 | ✔ | 原文摘录(溯源锚点绑定处) |
| provenance_id | →溯源对象 | ✔ | 见3.7 |
| confidence | 0—1 + 等级 | ✔ | AI抽取置信度 + 人工复核等级(未检/初检/专家定稿) |
| statements_conflict[] | 数组 | — | 异说登记:不同志书对同一事件的矛盾记载,不裁决、并存呈现(这本身是学术价值) |
指标模板(measure schema)是数据集定价的核心。 每类事件的指标表由资深编辑依据历代志书实际记载能力设计——例如水灾指标只设志书中真实会出现的字段,不照搬现代水文标准。这是”方志编辑知识”转化为”数据结构”的地方,也是通用软件公司做不了的地方。
3.2 地点 Place
| 字段 | 说明 |
|---|---|
| place_id | 全局唯一URI |
| names[] | 历史名称集合(正名+别名+俗名),每个名称带有效时间区间 |
| place_type | 政区(省/府/州/县/乡/村)/ 自然地理(山川湖河)/ 人文地点(城池、衙署、学校、桥梁、寺观) |
| chgis_id | 对齐CHGIS地名ID(可空,逐步补) |
| gb2260_code | 对应现行行政区划代码(建立古今对照,这是政务客户的刚需) |
| location | 经纬度(点)或GeoJSON(面),带定位精度与定位依据 |
| evolution[] | 沿革链:[时间区间, 隶属上级place_id, 事件event_id]——每次变更都指向引发它的事件实体 |
3.3 人物 Person
| 字段 | 说明 |
|---|---|
| person_id | URI |
| names[] | 姓名/字/号/谥/曾用名,各带时间区间 |
| bio_dates | 生卒年(支持”约””不详”),朝代纪年+公历换算 |
| identity_tags | 受控词表:官员/乡贤/艺文/革命人物/科技…(对齐志书”人物传”类目) |
| office_holds[] | 任职记录:[机构, 职务, 起讫时间, 溯源]——任职本身就是事件,双写 |
| place_links[] | 籍贯/寓居/活动地 → place_id |
| disambiguation | 同名消歧字段(生卒+籍贯+事迹指纹),同名不同人是人物库最大质量风险,必须建模 |
3.4 机构 Organization
| 字段 | 说明 |
|---|---|
| org_id | URI |
| names[] | 历用名称(带时间区间)——”教育局→文教局→教育局”这类机构改名沿革是政务查询高频需求 |
| org_type | 政权机构/学校/企业/社团/宗教场所/军事单位 |
| existence | 设立—撤销/延续 时间区间,设立与撤销各关联event_id |
| hierarchy[] | 隶属关系链(带时间区间)——隶属关系随政区变化而变,必须时态化 |
| location | 驻地 → place_id(可多次迁移,带时间区间) |
3.5 指标观测 IndicatorObservation(时序数据的载体)
志书中大量”某年粮食总产X万斤”类记载,不属于事件,单独建一类观测值实体:
| 字段 | 说明 |
|---|---|
| obs_id | URI |
| indicator_id | 受控指标词表(粮食产量/人口/耕地面积/税收/降雨量/物价…约200项起步) |
| value + unit | 数值+单位,原文单位与现代单位双存(”万斤”照录,换算”吨”另存,换算规则登记) |
| time / place | 观测时点与地域范围 |
| scope_note | 统计口径备注(志书口径与现代统计口径的差异说明——数据能否用于建模,全看这个字段是否诚实) |
| provenance_id | 溯源 |
这一类实体直接决定你能否卖给研究机构”某流域1949—2005年粮食产量时间序列”这样的数据集产品。
3.6 文献 Work(L0的元数据壳)
志书/年鉴/旧志本身作为实体:版本、纂修者、成书年代、断限(记述起止年)、篇目树、数字化状态。对齐江苏《地方志著录元数据规范》字段,L0交付物的元数据直接从这里导出——一份维护,两处使用。
3.7 溯源对象 Provenance(承重墙,独立成类)
provenance = {
work_id 哪部志书(→Work实体,含版本)
section_path 篇目路径(卷三·水利志·防汛)
page 页码(对应扫描图像ID)
chunk_id L0段落切片ID(精确锚点)
raw_text 原文摘录(≤200字)
extractor 抽取方式(人工/AI模型名+版本)
reviewed_by 复核人 + 复核时间
}
每条事实(L1任何实体的任何字段)都指向一个provenance对象。没有provenance的字段不允许入库——这是入库校验的硬规则。
四、关系体系(L1的边)
只定义12种核心关系,克制为上(关系爆炸是本体工程第一死因):
| 关系 | 连接 | 时态 | 例 |
|---|---|---|---|
| 发生于 occurred_at | Event→Place | 自带时间 | 洪水发生于XX县 |
| 参与涉及 involved | Event↔Person/Org | 带角色 | 某人主持修堤 |
| 引发 caused | Event→Event | — | 水灾引发赈济 |
| 建置变更 altered | Event→Place/Org | — | 析置事件改变县界 |
| 隶属 belongs_to | Place/Org→Place/Org | ✔ 区间 | XX乡隶属XX县(1958—1984) |
| 曾用名 former_name | Place/Org自关联 | ✔ 区间 | 名称沿革链 |
| 任职 holds_office | Person→Org | ✔ 区间 | 任知县 |
| 籍贯/活动地 linked_place | Person→Place | ✔ | 寓居 |
| 观测于 observed_at | Observation→Place+Time | 内嵌 | — |
| 见于记载 attested_in | 任何实体→Work | — | 溯源的关系化表达 |
| 异说 conflicts_with | Event↔Event | — | 矛盾记载互联 |
| 同指 same_as | 跨库实体 | — | 对齐CHGIS、对齐其他志书同一实体 |
所有带✔的关系必须有 valid_from / valid_to 字段。 时态是历史数据与普通数据的根本区别,CHGIS的核心价值就在于此,必须全盘继承。
五、时间建模细则(最容易出错的地方)
- 时间对象统一结构:
{原文表述, 纪年类型(公历/朝代年号/民国/干支), 换算公历值, 换算方式(自动/人工), 换算置信度, 粒度}; - 模糊时间如实降粒度:”是年秋”→存为当年9月±,粒度=季,禁止伪造成精确日期;
- 朝代纪年换算表内置为受控资源(万历十四年→1586,多来源交叉验证);
- 区间开放语义:valid_to为空=延续至今;”不详”是合法值,不同于空值。
六、与现有标准的对齐映射(验收与流通的两张通行证)
| 你的层 | 对齐对象 | 方式 |
|---|---|---|
| L0元数据 | 江苏《地方志著录元数据规范》、成都DB5101/T 221、湖南加工规范 | Work实体字段与其一一映射,导出即合规 |
| L0加工流程 | 各省数字化加工规范 | 加工合同直接引用其条款,降低投标响应成本 |
| L1地点 | CHGIS地名辞典(tgaz.fudan.edu.cn,有开放API) | place.chgis_id + same_as关系 |
| L1地点 | GB/T 2260行政区划代码 | place.gb2260_code |
| L1时间 | GB/T 7408日期表示 | 公历值字段格式 |
| L1概念模型 | CIDOC-CRM(国际文化遗产本体) | 写一份轻量映射文档(Event≈E5, Actor≈E39/E74…),这张映射表是未来发论文、申标准、谈国际合作的接口。 |