Lesson 02 · 类与推理

类、层次与推理

本体真正的力量,在于能从你没写的三元组里推出事实

上一课你看到三元组在"断言事实"。但真正的杠杆是:一旦有了类与约束,一个推理器(reasoner)能自动生成你没写、但逻辑上必然成立的三元组。这是关系数据库基本不做的事,也是本体在知识图与检索增强生成(Retrieval-Augmented Generation, 简称 RAG)里值钱的根源。[1]


01子类不是"子表",是一个逻辑陈述

在关系模型里,"子类型"常被实现为一张子表或一个判别字段。但在本体里,子类是一条逻辑规则:

子类语义

若 A ⊑ B(A 是 B 的子类),那么A 的每个个体都自动是 B 的个体。这个"自动"是逻辑保证的,不是应用代码写的。

# ① 你断言的 :FinishedGood rdfs:subClassOf :Product . # 成品 ⊑ 产品 :sku-447 rdf:type :FinishedGood . # 447 是成品 # ② 推理器据此补齐 :sku-447 rdf:type :Product . # 它同时也是产品(你没写)

传递性:一次推导,链条生效

子类关系是可传递的:如果 SKU ⊑ FinishedGood(SKU 即库存单元 Stock Keeping Unit)且 FinishedGood ⊑ Product,那么 SKU ⊑ Product。你只需声明"紧邻"的一条,推理器帮你补全整条链。

在供应链计划里这很常见:

:BrandedGood rdfs:subClassOf :FinishedGood . :FinishedGood rdfs:subClassOf :Product . :Product rdfs:subClassOf :SupplyChainObject . # 推理出:BrandedGood ⊑ SupplyChainObject

02domain 与 range:给属性写"类型签名"

别被"定义域/值域"唬住——它就是给属性标一个类型签名,像函数的参数类型:hasCapacity(主语: 资源, 宾语: 产能度量)。声明之后,推理器就能反过来补类型。

先用一个熟悉的例子

属性 hasDriver(有个司机)。问两句:谁能"有司机"?→ 车,所以它的 domain=车(管主语那端);那个司机是什么?→ 人,所以它的 range=人(管宾语/值那端)。

于是我只说一句 :X :hasDriver :alice,推理器就推出 :X rdf:type :Car 和 :alice rdf:type :Person——你没写类型,它补上了。

约束管哪端说人话
domain 定义域主语"谁用这个属性,它就是哪一类"
range 值域宾语 / 值"这个属性连到的对象或值,是哪一类"

换成供应链:是谁在"声明产能"?→ 资源(产线、机台、仓库),所以 hasCapacity 的 domain=资源;产能值是什么?→ 一个度量,所以 range=产能度量。看推理:

# ① 属性约束 :hasCapacity rdfs:domain :Resource . :hasCapacity rdfs:range :CapacityMeasure . # ② 一个具体事实 :line-7 :hasCapacity 1200 . # ③ 推理器据此推出 :line-7 rdf:type :Resource . # 因为用到了 hasCapacity

这就是 Web 本体语言(Web Ontology Language, 简称 OWL)里前缀 rdfs: 的资源:subClassOf / domain / range 都是资源描述框架模式(Resource Description Framework Schema, 简称 RDFS)的标准谓词。

为什么有用:你只需为 hasCapacity 写一次这个"类型签名"。以后任何"有产能的东西"(产线、机台、仓库)都会被自动认成"资源",不用逐个写 rdf:type :Resource——把类型判断交给推理器,而不是写一堆 if/else。
line-7 1200 hasCapacity 规则:hasCapacity 的 domain 是 Resource line-7 a Resource(推理) 推出 domain(Resource)

图 1 · 事实 + 属性约束 → 推理器补出类型。你只写了三行,第四行是它给的。

03推理的可信度,取决于你声明的粒度

你会立刻想到:这会不会推出错误结论?会,如果约束声明得太宽。所以推理不是"魔法",而是可放的承诺:

你声明推理器承诺供应链计划里
A ⊑ BA 的个体也是 B 的个体成品 / 产品 / 供应对象
p domain C用 p 的个体是 C用了 hasCapacity 即资源
p range Cp 的取值是 C提前期的取值是时长
工程直觉:这些约束很像你给对象加的类型断言,但用声明式语言表达、由推理器统一执行——所以后来想"收紧"规则,改声明就好,不必改代码。

04对检索增强生成(RAG)的意义

为什么推理对检索增强生成有价值?因为检索与回答都受益于补全:

05检查你的理解

若 FinishedGood ⊑ Product,且 sku-447 是 FinishedGood,推理器会自动得出什么?

声明 :hasCapacity 的 domain 为 :Resource 后,`:line-7 :hasCapacity 1200` 会推出什么?

子类关系的哪条性质,让"只需声明紧邻,链条自动补全"?

本课主来源 · 值得一读 万维网联盟(W3C):OWL 2 入门 w3.org/TR/owl2-primer 读到"Classes and Class Hierarchies"与"Properties"两节,你会看到 subClassOf、domain、range 的权威定义与例证。

更工程化的深读:见Semantic Web for the Working Ontologist中的"subclass"与"property"相关章节。


[1] 万维网联盟(World Wide Web Consortium, 简称 W3C),资源描述框架模式(RDF Schema, 简称 RDFS)1.1 —— subClassOf / domain / range 是 RDFS 标准谓词,提供最基础的推理语义。

有疑问?问 agent

这一课抓住一个核心:推理器能把你声明过的约束兑现成你没写的事实——前提是声明得对。想自己出一题、或测某种约束会不会推出你要的结果,直接问我。