Ontology Lab
每个实验 = 一个可运行的 artifact:建了什么类、写了什么限制、Reasoner 推导出了什么。
学 Ontology 不只是"看",是"做"——这里是 ONTAO 的工程实践记录。
Lab #001 — Pizza Ontology(结构剖析 + Reasoner 实战)
- 日期:2026-08-30
- 来源:曼彻斯特大学经典教程本体(owlcs/pizza-ontology,pizza.owl v1.5)
- 工具:owlready2(Python 本体库)+ HermiT(推理器)
- 一句话:用最简单的领域(披萨),跑通 OWL 的全部核心语法
学了什么(语法清单)
Class / SubClass / Property / Restriction
some(至少一个)/ only(全部都是)/ min(数量下限)/ not(否定)/ and(合取)
EquivalentClass(等价类定义)/ Reasoning(推理)
实测结构盘点
| 项 | 数量 | 说明 |
|---|---|---|
| Class | 99 | Pizza / NamedPizza / 43 种配料 / 4 种饼底 / 分类类(VegetarianPizza 等) |
| ObjectProperty | 8 | hasTopping↔isToppingOf、hasBase↔isBaseOf、hasIngredient↔isIngredientOf、hasCountryOfOrigin、hasSpiciness |
| Individual | 0 | 纯类层级(TBox),个体由学习者自己建 |
关键定义(推理的燃料)
| 类 | 等价定义(EquivalentClass) | 含义 |
|---|---|---|
| VegetarianPizza | Pizza ∧ ¬(hasTopping some MeatTopping) ∧ ¬(hasTopping some FishTopping) | 披萨 + 没有任何肉/鱼配料 |
| CheeseyPizza | Pizza ∧ hasTopping some CheeseTopping | 披萨 + 至少一种芝士 |
| MeatyPizza | Pizza ∧ hasTopping some MeatTopping | 披萨 + 至少一种肉 |
| InterestingPizza | Pizza ∧ hasTopping min 3 | 披萨 + 至少 3 种配料 |
Reasoner 实战记录
实验 1:建个体"番茄+芝士+蘑菇披萨"(饼底薄脆)
→ 推理出:CheeseyPizza(有芝士 ✅)、InterestingPizza(3 种配料 ✅)、ThinAndCrispyPizza(饼底匹配 ✅)
实验 2:加一个肉配料(Pepperoni)
→ 推理出:MeatyPizza(hasTopping some MeatTopping 满足 ✅)
实验 3(⭐ 机制层发现:开放世界假设 OWA)
纯素披萨一直没被推为 VegetarianPizza——不是 bug!
OWL 是开放世界:推理器只知道"有这 3 个配料",但不能假设"只有这 3 个"(可能还有未知配料)。所以 ¬(hasTopping some MeatTopping) 无法被证明——不知道 ≠ 不存在。
对比:数据库是封闭世界(查不到 = 不存在);OWL 是开放世界(查不到 = 未知)。
这对 ONTAO 的意义:规则要机器可证明,必须明确世界假设;SHACL 才是封闭世界的规则语言。
实验 4(closure 闭合公理):显式声明 hasTopping only (番茄|芝士|蘑菇) 闭合世界后:
→ 个体被推为 VegetarianPizzaEquivalent1/2 ✅
→ 但仍推不出 VegetarianPizza!因为 MeatTopping 与 VegetarianTopping 没有显式不相交声明(disjoint),OWL 语义下二者可重叠。
教训:ONTAO 规则要能被推理器证明,disjointness(不相交声明)不可省——这是教程没明说、要自己撞出来的机制层知识。
核心领悟
OWL 分类不是静态标签——类是约束(TBox),个体是事实(ABox),推理器按约束检查事实,动态得出/撤销分类。这就是"机器可理解的语义体系"的运作机制。
与 ONTAO 的映射(路线第二步预告)
| ONTAO | OWL | 说明 |
|---|---|---|
| 对象 | Class / Individual | 完全对应 |
| 关系 | Object Property | 完全对应 |
| 属性 | Datatype Property | 完全对应 |
| 规则 | OWL axioms / SHACL | 规则要机器可证明有讲究(OWA/disjoint) |
| 状态 / 动作 / 权限 | 超出 OWL | ONTAO 的 Operational 部分,需在 OWL 之上补层 |
复跑命令
pip3 install --user owlready2
sudo apt-get install -y default-jre-headless # HermiT 需要 Java
python3 analyze_pizza.py # 结构剖析(99 类 / 8 属性 / 等价类)
python3 reasoner_demo.py # Reasoner 实战(建个体 → 推理 → 加肉 → closure 实验)
路线图(进行中)
| # | 实验 | 状态 |
|---|---|---|
| 001 | Pizza Ontology — 结构 + 推理 | ✅ 完成 |
| 002 | Ad Pizza — 广告变现领域从零建模(AdAccount / Traffic / AdUnit / Impression / Revenue) | ⏳ 下一步 |
| 003 | OWL API — 程序化操作本体(Java 10 课) | ⬜ |
| 004 | Gene Ontology — 复杂本体工程(imports / property chain / disjointness) | ⬜ |
| 005 | FIBO — 企业级业务本体研究(金融行业) | ⬜ |
每完成一个 Lab,更新本页 + 沉淀到 ONTAO 学习仓库。