
大家好,我是人月聊IT。
前段时间我和朋友聊天,又讲到一个很有意思的现象:为什么我们的IT系统功能越来越强,却总觉得它像个操作最终执行者和工具人,而不是一个能帮你分析问题、判断形势的"参谋"。IT系统能执行,但不能理解;能记录结果,但解释不了原因。这也是我今天重新整理这篇文章的关键原因,即首先给出核心观点和判断:—系统的边界,从来就不是语义的边界。
缘起观点:我最近在思考本体论和本体建模的时候有一个关键的观点,就是系统的边界不是语义的边界。举例来说,比如一个采购系统,有两种采购订单,一种是正常的采购材料,数量和交期的订单;一种是框架协议订单,只有价格没有数量,后续根据需要进行送货,送货验收后再生成结算单。但是业务人员究竟基于不同的场景,哪些判断规则来选择创建哪种订单实际并没有在系统本身的语义定义里面。再比如,当前需要进行退货处理,但是一个退货处理往往涉及到要先处理在途信息,再进行订单取消或冲红单处理,实际这个内容往往也没有在系统定义里面。在比如当系统监控发现了一个异常警告,实际基于不同的业务异常,我们究竟应该操作系统哪些业务功能联动来解决,也没有在系统定义里面。也就是说真正的业务运作的语义远远大于了系统操作的业务语义。自然就造成了我们的IT系统更多是一个操作型系统而非一个解释,预测和推理型系统。这也是我经常谈到的我们构建一个本体模型,不仅仅要考虑系统的构建用,还要考虑这个本体模型是否包括了我上面说的这些语义,只有包括了这些语义,后续才能够真正预测和推理业务。这也是我前面讲过的,面向对象问的是‘谁能做这件事(Who does What),而本体问的是‘这件事在客观世界中意味着什么逻辑后果(What does it imply)。因此不能简单的把面向对象建模认为就是本体建模,虽然两者都包括了对象,属性,关系,行为,规则的定义。但是本体建模的语义往往比传统面向对象建模更加丰富,OO建模仅仅为了系统生成,而本体建模还要考虑用于系统后续的预测,分析,断言和推理。
这篇文章我想把这个判断往前推一步。上一篇更多是"提出问题",这一篇想认真回答两件事:这个语义断层到底是怎么产生的,以及如果要用本体建模去补这个断层,该往什么方向走。

先简单回顾一下现象,不重复展开。
一套采购系统里定义了"标准采购订单"和"框架协议订单"两种单据类型,字段、表结构都很清楚,但"什么场景该选哪一种"这个判断规则——"大宗原材料走框架协议,零星备件走标准订单"——系统里没有,它躺在业务主管的经验里。
一笔退货处理,背后是"查在途订单→取消或冲销→通知仓库退货"这样一条有因果关系的动作链条,但系统往往只有一个孤零零的"退货单录入"界面,链条要么散落在代码的if-else里,要么全靠操作人员凭经验补齐。
一个库存预警弹出来,"要不要自动补货、要不要等在途订单到货、要不要人工介入",这些判断所需要的上下文,系统一概不知,它只负责"报",不负责"办"。
这些例子共同指向一个结论:系统把"操作"定义得清清楚楚——点哪个按钮、填哪个字段、生成哪张单子——但"为什么点这个按钮""点完之后会引发什么连锁反应""在什么背景下该做这个判断而不是那个判断",这些语义从来没有被系统真正"接住"。

上一篇文章里我把这个断层归结为"面向对象建模只关心怎么把系统跑起来,模型是手段不是目的"。这个说法回头看有点简化了,容易让人误以为只要换一种建模范式(比如换成本体建模)问题就自动解决了。实际情况要复杂得多,至少有三层原因需要分开看。
第一层,是需求分析阶段的取舍,而不是建模范式本身的局限。 面向对象完全有能力把状态机、业务规则、事件链建进类的方法和属性里——现实中大多数系统没有这么做,往往是因为项目工期不允许、没人系统性地去访谈业务专家、或者需求文档本身就没有把"判断逻辑"当作一等公民来对待。这是知识梳理投入不足的问题,不是某种建模语言"天生"表达不了语义的问题。把锅完全甩给OO范式,其实是找错了病灶。
第二层,是知识获取本身就是一件昂贵的事,而且这不是新问题。 上世纪八九十年代红极一时又迅速衰落的专家系统(Expert System),核心败因就是"知识获取瓶颈"(Knowledge Acquisition Bottleneck)——把专家脑子里的规则显性化的成本极高,而且业务规则一直在变,规则数量一旦上去,维护成本会指数级增长,最后整套系统因为无法维护而被放弃。这段历史给今天做本体建模、知识图谱的人一个非常明确的警示:建一套更完整的模型框架,解决的是"语义往哪存"的问题,不会自动解决"语义怎么挖、怎么持续维护"的问题。这两件事必须分开谈,谁也代替不了谁。
第三层,企业IT里其实已经有一批工具在尝试解决"知道了异常之后该怎么办"这一类问题,不能视而不见。 业务规则引擎(BRMS,如Drools)、决策表和DMN(Decision Model and Notation)、BPM工作流引擎、复杂事件处理(CEP)——这些工具早就能表达"如果满足条件A则触发动作B"这样的因果逻辑。本体建模不是从零发明了因果表达能力,它真正要解决的,是把这些原本分散在规则引擎、流程引擎、事件总线里的碎片语义,用一套统一的、可被人和机器共同理解的语言串起来,而不是重新造一遍轮子。这一点上一篇文章里提得不够清楚,容易让人以为本体建模是唯一解法,这里需要更正。

既然要谈本体建模的升级方向,就绕不开语义网(Semantic Web)体系下的三件套:OWL、SWRL、SHACL。要判断它们"够不够用",得先弄清楚它们本来是为了解决什么问题而设计的。
OWL(Web Ontology Language)的核心目标,是用描述逻辑(Description Logic)给"类、属性、个体、公理"这套东西一个严格的数学语义,让不同系统之间可以共享同一套词汇表,并且让标准推理机(比如Pellet、HermiT)能够基于这套语义自动做分类(classification)、一致性检查(consistency checking)、隐含知识推断——比如"张三是学生"加上"学生是人",推理机能自动推出"张三是人",不需要人写这条规则。SWRL在OWL之上补充了类Horn逻辑的规则能力,弥补OWL纯描述逻辑在某些推理场景下表达力不足的问题。SHACL则解决了另一个问题:RDF图本身是开放世界假设,天然缺乏"这个字段必须有值""这个数值必须在某个范围"这类强约束校验能力,SHACL用形状约束(Shape)把这块补上,而且是标准化的、有现成校验器的。
这三者共同的设计目标,是面向跨系统、跨组织的知识共享与自动推理,语义网、生物医学本体(如Gene Ontology)、金融行业本体(FIBO)都是在这个目标下产生的。它们的强项是形式语义的严谨性和工具生态的标准化——任何遵循标准的工具都能读懂、推理、查询(通过SPARQL)同一份本体。
但这套体系应用到企业级软件系统里,会暴露出几个明显的短板:
第一,它们天生偏静态,对"行为"和"过程"的表达力有限。 OWL擅长描述"什么是什么、什么属于什么类别",但对"一个对象在什么条件下可以执行什么动作、动作执行后状态怎么变、动作之间有什么先后顺序和因果链"这类过程语义,缺乏原生的表达能力。SWRL规则可以做一些条件推导,但它不支持副作用(side effect),也就是说SWRL规则只能"推出新事实",不能"触发一个改变系统状态的动作"——而企业系统里几乎所有有价值的语义,恰恰都跟"动作会引发什么后果"有关。
第二,它们没有原生的场景/情境(Context)概念。 "大宗原材料走框架协议"这类判断,本质上是一个高度依赖情境的决策规则,涉及物料类型、供应商关系、生产紧急程度等多个维度的组合判断,还可能带时间和角色的约束。OWL的类和属性体系可以把这些维度都建成类和属性,但"在什么情境下触发什么决策路径"这种带流程编排意味的语义,需要额外叠加一层,OWL/SWRL本身不提供。
第三,异常处理、补偿、非功能约束这些工程现实,完全在OWL/SWRL/SHACL的射程之外。 一笔操作失败了要不要重试、要不要补偿、幂等性怎么保证、响应时间的SLA是多少——这些是企业系统必须回答的问题,但它们不属于"知识表示"的范畴,语义网体系从设计之初就没打算覆盖这一层。
所以准确的说法不是"OWL/SWRL/SHACL不够格",而是它们解决的是另一个层面的问题:知识的形式化表示与跨系统推理,而企业级本体建模面对的,是要把"这套知识在具体业务系统里如何被使用、被触发、被执行"这件事也讲清楚。这是能力边界的差异,不是谁比谁更先进的问题。

想清楚了短板在哪,升级思路就相对清晰了:不是抛弃OWL/SWRL/SHACL重新发明一套,而是保留它们在静态语义和形式推理上的优势,在此之上叠加企业系统运转真正需要的几层执行语义。大致可以分这么几个方向思考,这里不展开成具体规范,只谈思路。
第一,静态语义层继续沿用本体的经典能力,不要削弱它。 类、属性、公理、个体这套东西该怎么建还怎么建,能用推理机自动做一致性检查、分类推断的地方,就应该继续交给推理机,而不是全部改写成过程式的字符串表达式——字符串表达式虽然写起来直观,但失去了形式语义的可验证性,本质上是从"可被机器证明"退化成"需要人工约定",这是一种能力上的倒退,能不退就不退。
第二,在静态语义之上,补一层行为/动作语义。 每个对象在什么条件下能触发什么动作,动作执行后状态如何迁移,这一层可以借鉴动作语言(Action Language,比如规划领域常用的STRIPS风格前置/后置条件描述)的思路,跟OWL类体系做绑定,而不是完全脱离本体另起炉灶。

第三,再叠一层事件与因果语义,用来承载"一件事引发另一件事"的链路。 这一层的本质是一张因果图——业务对象状态变化产生事件,事件被其他行为或规则订阅,进而引发新的状态变化。这种"关系密集、路径重要"的语义,用属性图(Property Graph)或者RDF*这类支持边上带属性的图模型来承载,会比纯粹的OWL三元组更自然,也更方便做因果链的可视化和追溯。这一层解决的正是上一篇文章里"退货处理""库存预警"那两个例子暴露的问题——系统不仅要"报",还要能顺着因果链告诉你"报了之后接下来会发生什么"。
第四,补一层场景/情境语义,专门用来承载"在什么背景下选择哪条路径"这类决策规则。 这一层可以理解成决策表的语义化版本——把DMN这类已经成熟的决策建模思路,跟本体的类体系对接起来,而不是重新发明一套决策表示法。它解决的是"标准订单还是框架协议"这类选择题在系统里没有立足之地的问题。
第五,主体/规范语义层和质量/异常语义层作为工程现实的补充,分别承载权限与职责、非功能约束、失败与补偿路径。 这几层不属于经典本体论的范畴,但企业系统离不开它们,把它们作为独立正交的层次挂在本体的核心结构之外,既能保持核心语义的纯粹性,也能满足工程落地的需要。
这几层之间的关系应该是正交、独立演进的——这一点上,此前我参考的一份企业内部建模规范里"八个模型、职责边界清晰、依赖关系明确"的思路是有价值的,可以作为落地时的组织方式借鉴,但要清楚这只是执行语义层的组织方式,不能把它和本体的核心静态语义层混为一谈,也不宜简单宣称这样的分层"完全覆盖"了OWL/SWRL/SHACL——准确的说法是,它在OWL/SWRL/SHACL原本没有覆盖、也不打算覆盖的执行语义范围内,做了必要的补充。
无论往哪个方向升级,有两件事是任何模型框架都解决不了的,需要单独用方法论去应对。
一是知识获取的方法论问题。 模型框架解决的是"语义放在哪里",不解决"怎么把业务专家脑子里的经验准确、完整地挖出来"。这件事需要专门的知识工程方法支撑——比如用决策表访谈法引导专家把隐性判断标准显性化,用真实历史案例反推规则边界,建立规则的定期复核和冲突检测机制。没有这一层方法论的配合,再完整的模型框架也只是一个空壳子。
二是要对"系统能推理"这句话保持克制。 把语义显性化、结构化之后,系统确实能做到"知道一件事发生后按预定义路径会引发什么",这对于提升可追溯性、可维护性、以及给AI提供结构化上下文非常有价值——尤其是在AI原生应用的场景下,一份结构清晰、语义明确的本体模型,本身就是喂给大模型的高质量上下文,能显著提升AI理解业务、给出建议的能力。但这依然是"沿着预先定义好的因果链执行",不等同于面对从未出现过的新情况时的自主推理判断。真正的开放式推理能力,目前还是要靠大模型本身的泛化能力,本体模型提供的是让这种泛化更准确、更可控的语义脚手架,而不是推理能力的来源。
回到最开始那句话:系统的边界不是语义的边界。
这次我想把这句话说得更谨慎一点:企业系统之所以只能操作、不太能理解,根子不在某一种建模范式的先天缺陷,而在于我们长期没有为"业务语义的显性化"这件事投入足够的方法论和工程手段。本体建模的价值,不在于它是不是比OWL/SWRL/SHACL"更先进",而在于它能不能在保留形式语义严谨性的同时,把行为、事件、场景这些企业系统运转所必需、而经典本体论没有覆盖的部分,用一套正交、可追溯、人和机器都能读懂的方式接回系统里。
这条路依然不容易走,知识获取的成本依然是最大的门槛,但方向是清楚的:不是推倒重来,而是在已经被验证过的语义骨架上,把丢失的那部分语义,一层一层找回来。
好了,今天的分享就到这里。希望对你有所启发。