本体介绍:软件工程中的本体论

软件工程中的本体论

一家制造企业有三个运行正常的系统。

ERP 里有一条供应商记录,编号是 V-1048。CRM 里有一家名称相近的客户。PLM 里又有一个制造商,关联着几十种产品。

三个系统分别由不同团队维护。它们的数据库约束完整,接口也都能通过测试。

问题出现在业务把数据放到一起之后。

采购人员想知道:“给华东工厂供应控制器的企业,有哪些合同将在三个月内到期?”

系统却不能确定三条记录是不是同一家公司,也不能确认“供应商”“客户”和“制造商”是三个不同主体,还是同一主体在不同业务中的角色。

人工可以完成一次对账,但问题不会就此消失。下个月新增一个供应商文件,映射规则又要重新补。

这不是某个类写错了,也不一定是数据库少了一张关系表。每个系统都能正确处理自己的业务,但它们没有共享“这些数据究竟表示什么”。字段已经连通,含义仍然没有连通。

这类问题,是评估本体能否发挥作用的起点。

本篇要解决什么

读完本文,你不需要会写 RDF,也不需要安装图数据库。你只需要能够做出一个更实际的判断:面对一个业务场景,是否值得投入成本进行本体试点。

判断会使用五个维度:

  1. 是否存在跨系统的语义异构(Semantic heterogeneity)和身份冲突;
  2. 是否反复需要回答跨系统关系问题;
  3. 是否需要可重复验证的推导或约束;
  4. 是否需要追踪来源、有效期和版本;
  5. 团队是否承担得起长期维护成本。

本篇只讨论“为什么需要”和“什么时候值得尝试”。本体、分类法、数据库模式与知识图谱的详细区别,会留到下一篇。本文会提到 RDF 和 OWL,但不要求你掌握语法;相关标准和工具会在后续文章逐步展开。

先别责怪业务和数据

看到前面的供应商问题,一种常见反应是:“把三个系统的数据统一成一个 Supplier 类不就行了吗?”

先看 Supplier 类解决了什么。

在一个采购服务中,它可以表达供应商的状态、联系方式和业务行为。配合领域驱动设计(Domain-Driven Design,DDD),开发团队还可以把聚合内的不变量放在聚合边界内。比如,停用的供应商不能创建新合同。编译器、单元测试和领域模型共同保护这个边界。

但是,CRM 中的同一家公司可能并不叫 Supplier,而叫 Customer;PLM 关心的又是 Manufacturer。这些名称并非谁对谁错。它们属于不同的限界上下文(Bounded Context),也就是由不同业务团队维护的模型边界,各自强调同一现实主体的不同业务角色。

再看 ORM 和数据库。

ORM 的模型负责把应用中的实体类型映射到数据库。数据库负责主键、外键、唯一约束、索引和事务。它们很适合回答“这一行如何保存”“这次更新能否原子提交”“这个编号是否重复”。这些能力是企业系统的基础,本体不会替代它们。

但数据库中的主键通常只在当前系统中成立。ERP 的 V-1048、CRM 的 C-8821 和 PLM 的 M-77 都可以是合法主键,却不能单独证明三条记录是否指向同一家公司。给每张表增加一个 ExternalId 字段,只是为映射留出了位置,并没有定义这个标识来自哪里、何时有效、冲突时相信谁。

OpenAPI 解决的是另一个问题。

它可以描述 HTTP 接口有哪些路径、参数、请求体和响应结构,也能帮助生成客户端和接口文档。例如,SupplierDto 可以明确告诉调用者字段名是 supplierId、类型是字符串,却不会自动说明这个标识能否与另一个系统的 manufacturerId 对齐。

所以问题不在于 编程语言、ORM 或 OpenAPI 不够强。它们各自守住了代码、存储和接口的边界。跨系统语义需要的是另一层明确约定。

本体补充的是“共享含义”

本体(Ontology)可以先用一句白话理解:它是一份机器也能读取的领域共同说明书。它为概念命名,说明概念之间的关系,并表达可计算的公理。

这只是一个便于入门的类比。真正的本体不是一篇只供人阅读的 Word 文档,也不是任意业务规则的集合。概念需要稳定标识,关系需要明确方向,公理需要有确定的机器语义。订单如何审批、失败后如何补偿,仍然由应用代码负责。W3C 的 OWL 2 概览把 OWL 定位为一种用于表达事物、事物集合以及它们之间复杂关系的本体语言。

回到供应商案例,本体可以补充四类信息。

第一类是共享概念。

它可以说明“组织”是一个较通用的概念,“供应商”“客户”和“制造商”是组织在不同业务中承担的角色。这样做并不强迫三个系统把代码类改成相同名称,而是提供一套可以映射的共同词汇。

假设治理人员根据统一社会信用代码和人工复核,确认三条记录指向同一家企业,并给匹配结果分配共享标识 ORG-00042,那么映射可以写得很具体:

  • ERP 的 V-1048 指向 ORG-00042,在采购业务中承担供应商角色;
  • CRM 的 C-8821 指向 ORG-00042,在销售业务中承担客户角色;
  • PLM 的 M-77 指向 ORG-00042,在产品资料中承担制造商角色。

同一个组织可以承担多个角色,角色也可以随合同和时间变化。这里的关键不是把三个名称强行统一,而是说明它们如何联系。

第二类是稳定标识。

现实中的企业不应该只由某张表的自增主键代表。实例标识由数据治理方案和应用流程分配,本体提供描述这些实例和角色的共同词汇。匹配记录还应保存依据、置信度、审核人和撤销状态。

换句话说,本体不会看到两个相似名称就自动宣布它们是同一家公司。它能做的是让已经审核的匹配结果被持续引用、审查和撤销。

第三类是显式关系。

“组织供应产品”“合同适用于地点”“分类包含子分类”不再只是某段查询里的临时连接条件,而是被明确命名的关系。

如果还要记录来源和有效期,工程上通常会把“一次供应关系”建成可以单独引用的记录,再为它补充来源、开始时间和结束时间。这些信息不是一条最简单的二元关系天然自带的,需要明确建模。这样才能避免把历史上成立的供应关系误当成当前事实。

第四类是可验证语义。

业务人员真正关心的不是模型里有多少类,而是模型能否回答具体问题。这类问题称为能力问题(Competency question)。

例如,输入“控制器、华东工厂、未来三个月”,预期得到合同 CT-208CT-311,并看到各自的数据来源与有效期。本文只要求先写清输入和预期答案,不要求编写查询。后续再把它变成查询和自动化测试。如果模型答不出来,或者答案无法追溯,试点就没有通过验收。

RDF 是用三元组组成图的数据模型,OWL 是表达本体公理的语言。本体说明要共享的概念、关系和公理;RDF 图是一组三元组,既可以承载本体,也可以承载业务事实。本文暂采用一个工程工作定义:知识图谱是围绕图数据构建的数据集合和服务。三者有关联,但不是同一个概念。具体语法不是本文的重点。

先用数据字典不行吗

很多时候可以,而且应该先从更轻的方案开始。

如果问题只是两个接口对同一字段用了不同名称,一份维护良好的数据字典加上映射测试,可能已经足够。

如果几个系统愿意统一消息格式,一个共享的 JSON Schema、OpenAPI 契约或事件模型,通常更便宜。企业已有主数据平台时,稳定主键和人工审核流程也可能解决大部分身份对齐问题。

本体更适合另一类情况:概念之间的关系也要共享,而且这些关系会被不同团队持续扩展。

例如,PLM 认为 CTRL-24V-ACTRL-24V-B 技术参数相容;采购合同却规定,CTRL-24V-B 只允许在华东工厂使用,并且授权年底到期。数据字典可以记录两个编码的名称,却很难单独表达“在哪个地点、哪段时间、依据哪份合同可以替代”。同一个结论还要保留来源,供查询和审计使用。

这时,普通数据字典容易变成一份越来越长的字段说明。它能告诉人们两个字段看起来相似,却难以让程序沿着分类、角色、合同和来源继续判断。本体的价值不在于把字典换一种格式,而在于让这些定义和关系成为可引用、可组合、可验证的模型。

因此,选择不是“数据库或者本体”二选一。更实际的演进顺序通常是:先统一术语,再建立数据契约和映射;只有当跨系统关系、推导或治理需求持续出现时,才把其中稳定的部分提升为本体。这样既能控制成本,也能用真实问题检验模型,而不是先设计一个覆盖全公司的概念宇宙。

本体不能替代什么

理解本体的价值,也要同时理解它的边界。

它不替代数据库事务。订单扣减库存、合同状态更新、并发写入和索引优化,仍然应由适合的事务系统负责。

它不替代 DDD。聚合边界、业务行为、不变量和命令处理仍然需要在领域模型中设计。本体描述的共享概念不能自动生成一套正确的业务代码。

它不替代 API 契约和普通字段校验。请求字段是否必填、响应状态码是什么、客户端如何序列化,仍然由 OpenAPI、JSON Schema、Protobuf、数据库约束或应用代码负责。

尤其要注意 OWL 的开放世界假设:没有写出某个事实,通常不等于这个事实为假。因此,不能把“本体里没有联系电话”直接解释为“这家公司没有联系电话”,也不能把 OWL 当成必填字段校验器。

它也不会自动清洗所有脏数据。两个名称相似的企业是否为同一主体,需要标识、来源、匹配依据和人工复核。把模糊匹配直接宣布为“完全相同”,反而会把错误扩散到更多系统。

标准还不等于零成本互操作。不同产品支持的查询、推理和约束范围可能不同,性能也取决于数据规模、索引、推理方式和查询形态。

工程上可以让 .NET 负责数据接入、应用服务、测试和运维编排,再按需要集成专门的推理或验证引擎。这是一种架构建议,不是标准要求;具体能力必须按产品和版本实测。

如果一个方案只讲“自动理解”“无缝互通”,却没有说明映射、版本、验证和回滚成本,就还不能算工程方案。

用五个维度判断是否值得试点

下面这张表不是 W3C 标准,也不是数学公式。它只用于首轮筛选,不能代替成本收益分析。它可以防止团队因为“系统多”或“想做知识图谱”就直接引入完整技术栈。

维度 证据 试点信号 常见误判
语义异构与身份一致性 编码、字段或实体冲突样本 需要长期共享概念与映射 只是字段名不同
跨系统关系 反复出现的跨源问题 至少两个问题跨越系统边界 只做一次报表
推导与约束 输入、预期结果或失败报告 规则可重复执行并产生收益 只是必填校验
来源与演化 来源、版本、有效期和审计要求 需要追溯历史结论 现有审计表已足够
生命周期成本 建模、映射、测试和运维估算 能承担试点和长期治理 只算首次开发成本

实际填写时,可以复制这个格式:维度|证据样本(数量或例子)|未知项|下一步验证

决策时不要把五项简单相加。

更稳妥的做法是:前四项中至少有两项存在明确、可观察的证据,同时第五项成本门可以接受,才进入有限范围试点。即便条件满足,也先选择一个小模块和几条能力问题,不要从“建设企业级本体平台”开始。

这条规则是工程建议,不是充分条件。使用时要给每个判断附证据,例如冲突样本数量、反复出现的业务问题、预期结果、负责人和回滚方式。只写“高、中、低”而没有样本,不算完成判断。

一个值得试点的正例

现在重新审视 ERP、CRM、PLM 和供应商文件。

团队不仅需要识别同一企业,还要持续回答产品、供应商、地点、合同和有效期之间的问题。新的来源系统会不断加入,分类层级也会演化。审计人员还要求知道某条结论来自哪个系统、在哪个时间段有效。

这个场景在语义异构、跨系统关系和来源治理三个维度上都有明确证据。如果团队愿意维护标识策略、映射规则、验证测试和版本流程,就适合做有限范围试点。

试点可以只覆盖“组织、产品、地点、合同”四个模块,并选两三个能力问题验收。ERP 和 CRM 仍是事务数据源;语义与图层只保存跨系统映射和查询所需的事实,通过批处理或服务同步。试点结果不好时,也能够停止扩展,而不是先迁移所有数据。

一个不适合引入本体的反例

再看一个单一 ASP.NET Core 订单服务。

CustomersOrdersOrderLines 都在同一个 SQL 数据库中。需求只有创建订单、按 customerId 分页查询、检查订单金额大于零,以及保证订单号唯一。没有跨系统身份冲突,没有需要长期维护的分类关系,也没有新的推导需求。

这里使用 C# 领域模型、EF Core 映射、数据库外键与唯一约束更直接。为了普通 CRUD 和字段校验引入 RDF、OWL、三元组存储与额外治理流程,只会增加学习、部署和排障成本。

“不用本体”同样是一个合格的架构结论。技术选择的目标不是采用更多工具,而是用足够低的总成本解决真实问题。

生产中真正昂贵的部分

本体文件本身通常不是最昂贵的部分。真正持续花钱的是人、流程和运行责任。

这也是为什么本文把“生命周期成本”设成最后一道门。至少要明确三类责任:

  • 业务负责人评审共享概念,并留下变更记录;
  • 数据负责人维护标识和映射,并提供匹配样本与回滚办法;
  • 平台负责人运行查询、推理或验证任务,并监控版本、耗时和失败来源。

模型升级还要考虑实例数据迁移,外部引擎与 .NET 服务之间也要有部署和观测方案。试点没有收益时,团队应能停止同步并回到原有数据契约。

如果这些问题没有负责人,本体很容易从“共同语义”变成另一份无人维护的模型文件。

思考

考虑下面的需求:

仓储服务按 SKU 查询库存;供应商每天提供 CSV 文件,同一产品可能使用不同包装码;采购系统需要寻找可替代产品及其有效合同;审计人员要求每条推荐都说明数据来源。

可以先暂停阅读,按五个维度写下证据。不要只写“是”或“否”,至少附一条样本、一个业务问题或一项成本估算。

一份参考判断是:

  • 语义异构较强,因为 SKU、包装码和供应商编码需要持续对齐;
  • 跨系统关系较强,因为库存、替代产品、供应商和合同来自不同边界;
  • 来源治理较强,因为推荐结果必须可追溯;
  • 推导与约束可能有价值,但要先把“可替代”的规则和合同有效条件写成可验证问题;
  • 生命周期成本尚未确认,需要评估团队、工具和维护流程。

因此,结论不是“马上建设完整平台”,而是“有条件进入有限范围试点”:先建产品与合同的最小共享模型,保留 SQL 系统作为事务源,用两三个能力问题验证收益。如果成本或证据不足,就先采用共享词汇表和数据契约。

结论

只有当跨系统含义成为可观察、反复发生且值得治理的问题时,本体才可能带来净收益。

你可以用三步完成一次初筛:

  1. 选一个反复出现的跨系统业务问题,不要从“建设平台”开始;
  2. 用五个维度记录样本数量、预期答案、负责人和成本估算;
  3. 用 30 分钟评审形成一页决策记录,写明“试点”或“暂缓”、试点范围以及重新评估日期。

下一篇将拆开几个经常混用的词:本体、分类法、数据库模式和知识图谱。理解它们各自解决什么问题,才能避免把所有“带关系的数据”都叫成本体。

文章摘自:https://www.cnblogs.com/invoker-Fv/p/22004803