这个领域没有唯一正确的建模方式。最佳方案取决于你设想的应用和你预期的扩展。
Ontology development is necessarily an iterative process。本体开发必然是一个迭代过程。
你组织的概念应当贴近领域里的对象和关系。这些概念通常就是人们描述这个领域时用的名词和动词。
Ontology Development 101: A Guide to Creating Your First Ontology, 作者是 Stanford 大学的 Natalya F. Noy 和 Deborah L. McGuinness。 OpenAlex 记录到这篇文献的引用数是 4593 次
Stardog 反复劝人不要建「super ontology」,也就是不要指望建一套包罗万象的本体,并给这个主张配了完整的论证,可以拆成四层。
Stardog 没有给出量化的规模上限,也没有举出过度规格化导致项目失败的具体案例。它的论证形态是重申立场加经验规则,原文用的措辞是「we're going to insist」,这是表态度,不是做证明。所以这条建议的强度属于行业经验,不属于经过验证的结论。
(Stardog: Building a knowledge graph)
Palantir 官方把每一个运营决策拆成四个部分(Why create an Ontology?):
| 组成 | 含义 |
|---|---|
| Data | 决策所依据的信息 |
| Logic | 评估决策的启发式与计算过程 |
| Action | 所选决策的编排与执行 |
| Security | 决策符合运营策略的保证 |
Palantir 在文档里直接点明了本体的定位:「The Ontology represents the decisions in an enterprise, not simply the data.」
Palantir 在同一页还给了一个比喻:数据对象是本体的「名词」(semantic),动作是本体的「动词」(kinetic)。
These four principles are derived from extensive field experience across government and commercial implementations. They are presented in priority order. In cases of conflict, higher-priority principles take precedence.
| 优先级 | 原则 | 核心意思 |
|---|---|---|
| 1 | Domain-driven design | 你建模真实世界,不建模源数据 |
| 2 | Do not repeat yourself | 你把同一个东西建了三遍,就该重构(rule of three) |
| 3 | Open for extension, closed for modification | 软件设计开闭原则(OCP):对外开放扩展,关闭修改 |
| 4 | Composition over deep hierarchies | 做组合设计,不搞深继承链 |
Palantir 给这四条原则排了优先级,这一点很实用。你遇到两条原则互相冲突的时候,按序号取高的那条就行,不用每次重新争论。
Palantir 在这一页的 best practices 里,第一条要求你「Identify real-world entities before looking at source schemas」。最后一条写着:
Model the domain, then map the data: Understand the domain, then design the object model, then map source data into that model. Do not attempt to look at the data and replicate its shape.
Palantir 在同一页列出的反面做法有这些:
dtLastInspMod),没有用业务语言(lastInspectionDate)Palantir 举的例子很直观。一张 CSV 表里含 order_id、customer_name、customer_email、product_sku、quantity 五列。这五列描述的是至少三个实体(Order、Customer、Product),不是单独一个实体。
RDF 的设计目标是描述资源,让机器能处理网上的数据。它是个通用的数据模型,目的是任何领域的陈述都能表达,和本体没有绑定关系。
RDF 的模型适合承载本体。 因为它把一切压成三元组,类也是一个节点,属性也是一个节点,于是你可以对它们下断言。这种"什么都一样"的统一性,正是"模式也是数据"能成立的根源。
RDF 是 W3C 的一个标准,规定的是数据模型。它不是软件,不是数据库,也不是文件格式。全名 Resource Description Framework。它只规定两件事:
其他一概不管。所以在项目里用到多种层次的技术方案:
| 层 | 标准或技术 | 你项目里的对应物 |
|---|---|---|
| 数据模型 | RDF | 三元组、IRI、字面量、空白节点 |
| 序列化语法 | Turtle、N-Triples、JSON-LD、RDF/XML | ontology.ttl、knowledge_docs.ttl |
| 模式词汇 | RDFS、OWL | 空的,第 9 课要补 |
| 查询语言 | SPARQL | 你写的 SELECT、INSERT |
| 校验 | SHACL | 没用到 |
| 存储引擎 | 不属于 RDF 标准 | TDB2 |
| 服务器 | 不属于 RDF 标准 | Fuseki |
图的节点等于所有主语加所有宾语。谓词不算节点,它是边上的标签。
| 种类 | 有名字吗 | 主语 | 谓词 | 宾语 |
|---|---|---|---|---|
| IRI | 有,全局唯一 | 能 | 能 | 能 |
| 空白节点 | 没有 | 能 | 不能 | 能 |
| 字面量 | 是值本身 | 不能 | 不能 | 能 |
gwa:scenario_1 和 gwa:scenario_01 是两个不同节点。rdf:type 属于数据层,因为它断言"这个实例属于那个类",主语是实例。rdfs:subClassOf、rdfs:domain、rdfs:range),这需要引擎开推理。Fuseki 默认不开。rdfs: 和 owl: 的三元组 0 条。文件名叫 ontology.ttl,里面装的全是实例数据。一句话对照:
数据层: gwa:scenario_1 gwa:core_object gwa:bo_FinancingAsset 本体层: gwa:core_object rdfs:range gwa:BusinessObject
两条形状一样,区别在第二条谈论的对象是 core_object 这个谓词自己。