一、一致性规则定义与分类:语法规则、语义规则、业务规则

做知识图谱这么多年,我经常被问到:一致性规则到底是什么?
说白了,它就是一套检查标准,用来确保图谱里的数据不乱、不矛盾、不越界。
你想想看,药物知识图谱里可能有几百万个实体和关系,要是没有规则约束,数据质量根本没法保证。

我在项目中遇到过很多团队,一上来就写规则,结果越写越乱。为什么?
因为他们没搞清楚规则的类型。
语法规则、语义规则、业务规则,这三类规则关注的点完全不同,混在一起写,后期维护就是噩梦。

这一章我们就来拆解这三类规则。我会结合项目经验,讲清楚每类规则的定义、典型场景和避坑方法。

1.1 语法规则——数据的"拼写检查"

语法规则是最底层的检查。它不关心数据是什么意思,只关心数据"长得对不对"。
通俗点说,就像写作文时的拼写检查——错别字先挑出来,至于句子有没有逻辑,那是后面的事。

在药物知识图谱里,语法规则主要检查三样东西:

  • 字段格式:比如日期必须是 YYYY-MM-DD,不能出现"2024-13-01"。
  • 值域范围:比如年龄字段必须在 0-150 之间,不能出现负数。
  • 枚举约束:比如给药途径只能是"口服、静脉注射、肌肉注射"等固定值。

典型示例:检查药品批准文号的格式

规则类型: 语法规则
检查对象: 药品.批准文号
约束条件: 正则匹配 "^国药准字[HZS]\\d{8}$"
含义: 批准文号必须以"国药准字"开头,第4位是 H/Z/S,后面跟8位数字

我曾经在一个项目里遇到一个情况,某批导入数据里有 3000 条记录的批准文号格式不对。排查下来,竟然是源系统里有人手动录入时多打了个空格。
嗯,语法规则虽然基础,但少了它,上层分析全得翻车。

我的经验:语法规则建议用 JSON Schema 或类似声明式工具来写。不要写死在代码里,否则每次改格式都要重新发版,太折腾了。

注意:语法规则通过后,不代表数据就是对的。它只是第一道防线。别在语法层花太多精力追求 100% 覆盖,留点余量给上层规则。

1.2 语义规则——数据的"逻辑校验"

语义规则比语法规则高一个层次。它关心的是:数据在逻辑上是否自洽。
说白了,就是检查"这句话说得通吗"。

在药物知识图谱里,语义规则常见的场景有:

  • 关系一致性:如果实体 A 是"药物",实体 B 是"疾病",那么关系"治疗"是合理的;但如果关系是"相互作用",那就需要额外验证。
  • 属性逻辑性:比如"儿童"实体不应该有"成人剂量"的属性值。
  • 跨字段约束:比如"给药途径=口服"时,"剂型"不能是"注射液"。

典型示例:检查药物与适应症的关系是否合理

规则类型: 语义规则
检查对象: 药物.适应症
约束条件: 如果 药物.ATC分类 属于 "抗高血压药"
          则 适应症 必须包含 "高血压" 或相关同义词
          否则触发语义冲突告警

我记得有个项目,业务方反馈说"阿莫西林"被关联到了"病毒性感冒"。从语法上看,字段格式都对,但从语义上看,阿莫西林是抗生素,对病毒无效。
这就是典型的语义规则没覆盖到。后来我们加了一条规则:抗生素类药物不能关联病毒性疾病。这才堵住漏洞。

避坑指南:语义规则往往需要领域知识库支撑。我建议提前梳理好一本"语义约束词典",把常见的不合理组合列出来,规则写起来会快很多。

1.3 业务规则——数据的"合规红线"

业务规则是最顶层、也是最复杂的规则。它把真实世界的法规、政策、临床指南转化成计算机可执行的检查。
如果说语法规则是"拼写检查",语义规则是"逻辑检查",那业务规则就是"合规审查"。

举几个典型的业务规则例子:

  • 药物相互作用禁忌:华法林与阿司匹林不能同时出现在同一患者的用药方案里。
  • 年龄限制:某些药物(如喹诺酮类)禁用于 18 岁以下患者。
  • 剂量上限:对乙酰氨基酚单次剂量不得超过 1000mg,日总剂量不得超过 4000mg。

典型示例:基于中国药典的儿科用药剂量检查

规则类型: 业务规则
检查对象: 处方.药物 + 患者.年龄 + 患者.体重
约束条件: 如果 药物.名称 = "布洛芬" 且 患者.年龄 < 6个月
          则 触发 "禁用" 告警
          如果 药物.名称 = "布洛芬" 且 年龄在 6个月~12岁
          则 单次剂量 <= 10mg/kg, 日总剂量 <= 30mg/kg

业务规则的难点在于——它经常变。比如某个药物被药监局新增了禁忌症,或者指南更新了剂量推荐。我有个项目就是因为没及时更新业务规则,差点导致产品上线后被监管部门约谈。
从那以后,我养成了一个习惯:业务规则必须做到配置与代码分离,并且要有版本管理和生效日期字段。

血的教训:业务规则绝对不能硬编码在业务逻辑里,否则每次更新都要全量回归测试,风险极高。一定要用规则引擎或者至少是配置表来管理。

1.4 三类规则的对比与协作

三类规则不是互斥的,而是层层递进的关系。语法规则打底,语义规则做中间层校验,业务规则做最终把关。

下面这个表格可以帮你快速对比:

维度 语法规则 语义规则 业务规则
关注点 格式、类型、值域 逻辑、关系、自洽性 法规、指南、安全红线
检查层次 字段级 实体/关系级 场景/流程级
变化频率 低 中 高
典型工具 JSON Schema、正则 SHACL、SPARQL 约束 规则引擎(Drools 等)
失败后果 数据解析失败 逻辑矛盾、分析偏差 合规风险、安全隐患

我个人习惯在项目启动时,先用一张三层图把规则体系定下来,再逐层细化。这样做的好处是:团队不会在语法规则上过度设计,也不会遗漏业务层的关键约束。

下面是三类规则的协作关系图,我每次做规则体系设计都会先画它:

一致性规则三层协作体系 语法规则 字段格式 · 值域范围 · 枚举约束 检查数据"长得对不对",做第一层过滤 工具:JSON Schema · 正则表达式 · XSD 语义规则 关系一致性 · 属性逻辑性 · 跨字段约束 检查数据"说得通吗",做第二层校验 工具:SHACL · SPARQL 约束 · 领域词典 业务规则 药物禁忌 · 年龄限制 · 剂量上限 · 合规红线 检查"符合真实世界法规吗",做最终把关 工具:规则引擎 · 配置表 · 版本管理 层层递进 逐层收紧 数据质量层层递进,规则越往上越贴近业务 ⚠️ 下层规则通过后,才能进入上层校验;任意层失败则数据被标记为"不合规"

从这张图里你可以看到:数据从下往上流动,每一层都在前一层的输出上做更严格的检查。语法规则没过,语义和业务规则根本不需要跑——省时间。
反过来,业务规则触发了告警,不一定代表语法或语义有错,可能只是不符合特定的场景约束。

1.5 实践中的分层策略

我建议团队在实际项目中按这个顺序来落地:

  1. 先搭语法规则层:用 1-2 周时间把字段格式、值域、枚举类规则全部覆盖。这层技术成熟,工具多,见效快。
  2. 再建语义规则层:结合领域知识库,梳理实体关系约束和属性逻辑。这层需要业务方深度参与,沟通成本较高,但值得投入。
  3. 最后上业务规则层:优先覆盖高频、高风险的场景。比如药物相互作用、儿童用药禁忌等。这层需要持续维护,建议配套自动化测试。

我的小技巧:每类规则单独建一个配置文件或规则表,用规则类型字段区分。这样后期排查问题时,一眼就能看出是哪层出了问题,不用翻遍整个代码库。

再啰嗦一句:业务规则层一定要做好变更记录。我见过不止一个项目,因为业务规则改了没通知技术团队,导致线上数据出了大篓子。规则版本号和生效日期,这两个字段必须带上。