附录
附录 B · 选型速查表
八张表:判断、选型、清单、纠偏
这一页是给「已经决定要做,需要立刻选点什么」的人用的。所有结论来自前面的章节,这里只保留可查的表。
A. 三十秒判断该不该做
依次回答,遇到「否」就停:
| # | 问题 | 若「否」 | 章 |
|---|---|---|---|
| 1 | 有没有一个具体的、曾经做错的报表或事故? | 别做。 先去修那个问题 | 12 |
| 2 | 这个错误能否用一条可执行约束描述? | 问题不在语义层,在流程或代码 | 2 |
| 3 | 有没有一个业务侧的人能拍板「这条不合规」? | 别做。 没有裁决者,约束不会被遵守 | 13 |
| 4 | 改一条约束,会不会有人被通知/有构建失败? | 没有消费者,做了没人用 | 5 |
| 5 | 上线后每月有 0.2 人月吗? | 只做 A 形态(纯生成物 + 校验),别建平台 | 13 |
| 6 | 三年后这个模型还会被改吗? | 它是文档,不是资产 | 12 |
B. 场景 → 最小可行栈
| 你的场景 | 最小栈 | 不要做 | 人月(首年) |
|---|---|---|---|
| 指标口径不一,报表对不上 | LinkML/纯 YAML 源 + sqltablegen 生成建表 + SHACL 校验指标定义 + 一张对账视图 | 不要上图库、不要上推理机 | 6–10 |
| 跨系统实体对不齐(客户/供应商/物料) | 源模型 + 实体解析脚本 + sh:class 抓悬空引用 + 每周对账 | 不要一开始就做全公司主数据 | 8–14 |
| 模型要发起写操作(Agent/自动化) | SHACL 前置条件 + 动作网关 + 写回 + 审计五字段 | 不要把校验交给 LLM | 12–20 |
| 已有数仓,想「语义化」但不搬数据 | LinkML → YARRRML → R2RML → OBDA(Ontop)(未验证,需 spike) | 不要先建 ETL 把数据搬进图库 | 15–25 |
| 领域术语混乱(同义词、译名) | SKOS 词表 + 归一脚本进 CI + 枚举约束 | 不要用 OWL 表达同义词 | 3–6 |
| 只是想「让模型更懂业务」 | 先别做本体。 上向量 RAG,加元数据过滤 | 不要用本体解决召回问题 | 0–2 |
C. 语言怎么选
| 判据 | 选 | 理由 |
|---|---|---|
| 需要拒绝非法数据 | SHACL | 封闭世界、有违规报告、有退出码。唯一能进 CI 闸门的 |
| 需要推出新事实(分类、传递闭包) | OWL 2 EL/RL | 只在构建期用;RL 无 minCardinality(第 11 章实测) |
| 需要一份源生成多种产物 | LinkML(或同类 YAML 驱动) | 41 个生成器为证(第 11 章) |
| 团队是 SQL/BI 背景、不想学 RDF | 属性图 + 约束 DSL,或直接在数仓里做断言 | 学习成本决定能不能活下去 |
| 只需要术语与同义词 | SKOS | 别用 OWL 表达「同义词」,那是词表不是本体 |
| 需要与 Web/前端集成 | JSON-LD | 事实标准 |
默认可执行方案:RDFS 骨架 + SHACL 约束 + SPARQL 查询。这三件覆盖 80% 的实际需求,且都是 W3C 标准。
D. 存储怎么选
| 数据量 / 场景 | 选 | 备注 |
|---|---|---|
| < 100 万三元组、分析为主 | 文件(Turtle)+ rdflib/内存 | 第 11 章实测 16 万三元组校验 1.4 秒,文件足够 |
| 需要事务、版本、多用户 | TerminusDB / 图库 | 看是否需要 git 式版本语义 |
| 已有关系库、不想搬 | OBDA(Ontop) | 映射错了不报错,必须配对账 |
| 高并发查询、RDF 原生 | Oxigraph / Jena TDB2 / GraphDB | 先压测再定 |
| 只需要「图的样子」给业务看 | 任意图库 + 只读视图 | 别让它成为第二个真实来源 |
一条硬规矩:不要在项目第一年引入第二个真实来源。模型是文件,视图是派生的,源系统仍是源系统。
E. 校验与推理工具
| 用途 | 工具 | 注意 |
|---|---|---|
| SHACL 校验 | pySHACL(Python)、Jena SHACL(Java) | inference 合法值是 "owlrl",不是 "rl" |
| OWL 推理(大规模分类) | ELK、Konclude、HermiT | ELK 快但不支持全部构造;Konclude 自陈可能有 bug |
| OWL RL 规则推理 | owlrl(Python)、Jena rules | 闭包膨胀 2.1–2.3 倍,别放写入路径 |
| 本体质量检查 | ROBOT(生物医学生态,通用)、OOPS! | ROBOT 的 report 可当 lint |
| CI 集成 | pySHACL + 退出码 | 关键是非零退出码,不是输出格式 |
| 文档生成 | WIDOCO、pyLODE | 别用文档替代校验 |
F. 按任务挑工具(从 78 个项目里)
| 你要做的事 | 先看这几个 | 分级 |
|---|---|---|
| 起一个能跑的最小模型 | LinkML、rdflib、pySHACL | S/A |
| 写约束并进 CI | pySHACL、Jena、SHACL Play | S/A |
| 生成建表/文档/API | LinkML(41 个生成器)、ROBOT | S/A |
| 从关系库虚拟出图 | Ontop(OBDA) | A |
| 需要图库 | Oxigraph、TerminusDB、FalkorDB | A/B |
| 借现成词表 | Schema.org、FIBO、QUDT、SKOS 词表 | S/A |
| 给 Agent 做记忆/上下文 | mem0、cognee、graphiti | A/B(注意:都不提供约束) |
| 做 GraphRAG | microsoft/graphrag、LightRAG | B(是邻居,不是本体) |
| 想做「Palantir 式平台」 | 那 11 个平台项目,多数 2026 年新建 | C(观察,勿生产依赖) |
完整分级与理由见第 8 章七个小节。
G. 上线前检查清单
打勾之前不要宣布「上线」:
- [ ] 有 20 条 competency question,且每条能被回答
- [ ] 约束有非零退出码,接进了 CI
- [ ] 违规分三档严重级别(阻断/告警/记录)
- [ ] 豁免带负责人与到期日,到期会升级给人(不是变红等人改)
- [ ] 有一个动作会因为约束失败而被拒绝,且拒绝原因带「找谁」
- [ ] 有一张每周对账表,输出是工单而不是报表
- [ ] 变更能算出影响面(表、报表、API、下游模型)
- [ ] 新增必填字段走两步(先可选、补数据、再必填)
- [ ] 有明确的领域裁决者,且他知道自己签什么
- [ ] 有稳态预算(人月),不是只有首年预算
- [ ] 模型源在版本控制里,有评审记录
- [ ] 有一个人能在原作者离职后改它(这条最容易被跳过)
H. 三个常见错误,一句话纠偏
| 你正在做的事 | 纠偏 |
|---|---|
| 用 OWL 做数据校验,期待它报错 | 换 SHACL。OWL 在开放世界下永远不会说「缺了」 |
| 把整个模型塞进 prompt 让模型遵守 | 只塞当前任务相关的 5–15 条做提示,真正的拦截放在工具侧 |
| 用 LLM 判断数据对不对 | 用校验器判断,用 LLM 解释结果 |
| 第一年就引入图数据库 + 推理机 | 先用文件 + 校验跑到 100 万三元组,再评估要不要换 |
| 用「模型类数量」汇报进展 | 换成「拦截的坏数据条数」和「口径争议关闭时间」 |
| 把本体当 AI 项目立项 | 换成治理语言:口径统一、坏数据拦截、变更可审计 |
一句话
如果你只从这本手册带走一张表,带走 A 表。 六个问题里有一个「否」,剩下的所有选型都是浪费。