离婚案件中,房产分割争议占比超过 60%。规则散落在民法典和司法解释里,情形复杂、条件交叉。这篇文章用本体建模的方法,把"离婚房产分割"这个领域的概念和规则形式化,走完从零到 OWL 的全过程。
为什么离婚房产分割需要本体
先说一个场景。
一对夫妻要离婚,争的是一套房。男方说:"房子是我婚前买的,首付我出的,写了我名字。"女方说:"婚后一起还了 8 年贷款,凭什么不分?"
这个问题,律师能回答。但如果你要做一个法律咨询 AI,让它准确回答这类问题,你会发现:规则不是一条两条,而是一张网。
房子是婚前买的还是婚后买的?全款还是贷款?谁出的首付?登记在谁名下?父母有没有出资?出资时有没有说明是赠与还是借款?
每个条件的组合,对应不同的分割结果。这些规则散落在《民法典》第 1062 条、第 1063 条、第 1087 条,以及《婚姻家庭编解释(一)》的第 78 条、第 79 条等条文中。
不做形式化整理,AI 只能靠"背条文"来回答。背得再多,也处理不了条件交叉的复杂情形。
本体(Ontology)就是干这个的。把一个领域里的概念、属性、关系、规则定义清楚,让人和机器有统一的理解框架。
和上一篇停车场本体不同,法律领域的本体有几个独特挑战:
法律本体比技术本体更难建,但也更有价值。
领域分析:离婚房产分割的核心规则
动手建本体之前,先把核心规则梳理清楚。
法律依据
核心条文就这几条:
民法典第 1062 条:婚姻关系存续期间取得的财产,为夫妻共同财产。民法典第 1063 条:一方的婚前财产、遗嘱或赠与合同中确定只归一方的财产,为个人财产。民法典第 1087 条:离婚时共同财产由双方协议处理;协议不成的,由法院照顾子女、女方和无过错方权益的原则判决。婚姻家庭编解释(一)第 78 条:婚前一方购房并登记在自己名下,婚后用共同财产还贷的,离婚时房屋归产权登记方,对方获得婚后还贷及对应增值部分的补偿。婚姻家庭编解释(一)第 79 条:婚后父母出资购房,没有约定或约定不明的,视为对夫妻双方的赠与。8 种典型情形
把法律条文翻译成具体情形:
这 8 种情形覆盖了实践中绝大多数离婚房产纠纷。边缘情况(借名买房、小产权房)暂不纳入本体范围。
7 步构建法:从零开始建一个离婚房产分割本体
还是用 Noy & McGuinness 的 Ontology Development 101 方法论。上一篇停车场文章详细介绍过,这里直接用。
Step 1:确定领域和范围
能力问题(Competency Questions):
范围边界:
不包括:其他财产(存款、股票、车辆)、子女抚养、债务分割、诉讼程序Step 2:考虑复用已有本体
法律领域有一些可参考的本体资源:
LKIF(Legal Knowledge Interchange Format):欧盟资助的法律知识交换格式,定义了规范、行为、角色等通用概念FLINT 本体:基于 Actor 的法律关系模型,用 RDF/OWL 实现Schema.org:有 LegalForceStatus、Legislation 等法律相关类没有专门针对"中国离婚房产分割"的现成本体。但 LKIF 中的"规范"和"角色"概念可以借鉴。
Step 3:列举核心术语
把领域里的重要词汇全列出来:
夫妻、丈夫、妻子、父母、公婆、岳父母、子女、房屋、商品房、经济适用房、拆迁安置房、自建房、产权、个人财产、共同财产、按份共有、购房、全款购买、贷款购买、首付、月供、公积金贷款、商业贷款、出资、个人出资、共同出资、父母出资、赠与、借款、登记、产权登记、登记在一方名下、登记在双方名下、婚前、婚后、婚姻关系存续期间、分居期间、分割、归一方所有、变卖分割、竞价取得、补偿、增值、还贷贡献、装修投入、法律依据、民法典、司法解释、判决
40 多个词。接下来整理成类层次。
Step 4:定义类和层次结构

核心步骤。把术语整理成类(Class),建立 is-a 关系。
Thing├── Person(人)│ ├── Spouse(配偶)│ │ ├── Husband(丈夫)│ │ └── Wife(妻子)│ └── Parent(父母)│ ├── HusbandParent(男方父母)│ └── WifeParent(女方父母)├── House(房屋)│ ├── CommercialHouse(商品房)│ ├── AffordableHouse(经济适用房)│ ├── RelocationHouse(拆迁安置房)│ └── SelfBuiltHouse(自建房)├── Ownership(产权状态)│ ├── PersonalProperty(个人财产)│ ├── CommunalProperty(共同财产)│ └── SharedByPortion(按份共有)├── FundingSource(出资来源)│ ├── PersonalFunding(个人出资)│ ├── JointFunding(共同出资)│ └── ParentalFunding(父母出资)│ ├── GiftFunding(赠与性质)│ └── LoanFunding(借款性质)├── PurchaseMethod(购房方式)│ ├── FullPayment(全款购买)│ └── MortgagePurchase(贷款购买)│ ├── CommercialMortgage(商业贷款)│ ├── HousingFundLoan(公积金贷款)│ └── CombinedLoan(组合贷款)├── TimePeriod(时间阶段)│ ├── PreMarriage(婚前)│ ├── DuringMarriage(婚姻存续期间)│ └── Separation(分居期间)├── Registration(产权登记)│ ├── RegisteredToOne(登记在一方名下)│ └── RegisteredToBoth(登记在双方名下)├── DivisionMethod(分割方式)│ ├── AwardToOne(归一方所有+补偿)│ ├── SellAndDivide(变卖后分割)│ ├── BiddingAcquisition(竞价取得)│ └── ContinuedCoOwnership(继续共有)├── DivisionCase(分割情形)│ ├── PreMarriageFullPayment(婚前全款)│ ├── PreMarriageMortgage(婚前贷款婚后还贷)│ ├── JointPurchase(婚后共同购买)│ ├── ParentalFullFunding(父母全额出资)│ └── InheritedHouse(继承/受赠房产)└── LegalBasis(法律依据) ├── CivilCodeArticle(民法典条文) └── JudicialInterpretation(司法解释条文)
几个设计决策:
Spouse 不直接用 Person。在离婚房产分割中,"配偶"身份是核心,同一个人在不同法律关系中角色不同。FundingSource 单独建类。出资来源是判断产权归属的关键因素。父母出资还要区分"赠与"和"借款",性质不同结果完全不同。TimePeriod 独立出来。婚前还是婚后,是几乎所有分割规则的前置条件。停车场本体里不存在这种时间依赖——车什么时候停进来不影响车位归属。DivisionCase 作为独立类。每种分割情形是一组条件的组合,不是简单的属性值。建成类,方便挂载规则和法律依据。Step 5:定义属性
对象属性(Object Property)——连接两个类:
数据属性(Data Property)——连接类和具体值:
和停车场本体比,这里有一个明显特征:很多属性是"条件型"的。purchasedDuring(购房时间阶段)不是简单的描述性属性,而是直接影响分割结果的判断条件。停车场里的 isOccupied 只是状态描述,不会触发复杂的规则链。
Step 6:定义约束
法律本体的约束比技术本体复杂得多。不只是"一个车位只能停一辆车"这种基数约束,而是条件组合约束。
基本约束:
一套房屋只能有一种产权性质 → hasOwnership 是函数型(Functional)购房时间阶段只能是一个 → purchasedDuring 是函数型每种分割情形至少关联一条法律依据 → governedBy 最小基数为 1条件约束(核心):
情形 1——婚前一方全款购房:
PreMarriageFullPayment ≡ DivisionCase ⊓ ∃purchasedDuring.PreMarriage ⊓ ∃purchasedWith.FullPayment ⊓ ∃registeredAs.RegisteredToOne→ hasOwnership = PersonalProperty
情形 2——婚前一方首付 + 婚后共同还贷:
PreMarriageMortgage ≡ DivisionCase ⊓ ∃purchasedDuring.PreMarriage ⊓ ∃purchasedWith.MortgagePurchase ⊓ ∃registeredAs.RegisteredToOne ⊓ ∃mortgagePaidBy.{Husband, Wife}→ dividedBy = AwardToOne(归产权登记方)→ 对方获得 postMarriageRepayment 及对应增值的补偿
情形 3——婚后一方父母全额出资:
ParentalFullFunding ≡ DivisionCase ⊓ ∃purchasedDuring.DuringMarriage ⊓ ∃fundedBy.GiftFunding ⊓ ∃registeredAs.RegisteredToOne→ hasOwnership = PersonalProperty(视为对一方的赠与)
用 OWL Turtle 格式表达情形 2:
:PreMarriageMortgage rdf:type owl:Class ; owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( :DivisionCase [ rdf:type owl:Restriction ; owl:onProperty :purchasedDuring ; owl:someValuesFrom :PreMarriage ] [ rdf:type owl:Restriction ; owl:onProperty :purchasedWith ; owl:someValuesFrom :MortgagePurchase ] [ rdf:type owl:Restriction ; owl:onProperty :registeredAs ; owl:someValuesFrom :RegisteredToOne ] [ rdf:type owl:Restriction ; owl:onProperty :postMarriageRepayment ; owl:someValuesFrom xsd:decimal ] ) ] ; rdfs:subClassOf [ rdf:type owl:Restriction ; owl:onProperty :dividedBy ; owl:hasValue :AwardToOne ] ; rdfs:subClassOf [ rdf:type owl:Restriction ; owl:onProperty :governedBy ; owl:hasValue :Article78_JudicialInterpretation ] .
这段 OWL 代码的意思是:如果一个分割情形满足"婚前购买 + 贷款 + 登记在一方名下 + 存在婚后还贷"四个条件,它就是 PreMarriageMortgage 类的实例。分割方式为"归一方所有+补偿",适用司法解释第 78 条。
Step 7:创建实例
用一个具体案例验证本体。
案例:张三和李四 2015 年结婚。2013 年张三用个人积蓄付了 30 万首付,贷款 70 万买了一套房,登记在张三名下。婚后两人共同还贷 40 万。2026 年离婚时,房屋市值从 100 万涨到 180 万。
# 当事人:ZhangSan rdf:type :Husband ; :marriageDate "2015-06-01"^^xsd:date ; :divorceDate "2026-01-15"^^xsd:date .:LiSi rdf:type :Wife ; :marriageDate "2015-06-01"^^xsd:date ; :divorceDate "2026-01-15"^^xsd:date .# 房屋:HouseA rdf:type :CommercialHouse ; :purchasePrice 1000000.00 ; :downPaymentAmount 300000.00 ; :mortgageAmount 700000.00 ; :postMarriageRepayment 400000.00 ; :currentValue 1800000.00 ; :purchaseDate "2013-09-20"^^xsd:date ; :purchasedBy :ZhangSan ; :downPaymentBy :ZhangSan ; :purchasedDuring :PreMarriage ; :purchasedWith :CommercialMortgage ; :registeredAs :RegisteredToOne ; :ownedBy :ZhangSan .# 匹配分割情形:HouseA :matchesCase :PreMarriageMortgage .# 分割结果:HouseA :hasOwnership :PersonalProperty ; :dividedBy :AwardToOne .# 补偿计算# 增值率 = (180万 - 100万) / 100万 = 80%# 婚后共同还贷对应增值 = 40万 × 80% = 32万# 李四应获补偿 = (40万 + 32万) / 2 = 36万:HouseA :appreciationAmount 800000.00 ; :compensationAmount 360000.00 .# 法律依据:Article78_JI rdf:type :JudicialInterpretation ; :articleNumber "婚姻家庭编解释(一)第78条" ; :articleContent "婚前一方签订购房合同,以个人财产支付首付款并在银行贷款,婚后用夫妻共同财产还贷,不动产登记于首付款支付方名下的,离婚时由双方协议处理。不能达成协议的,人民法院可以判决该不动产归登记一方,尚未归还的贷款为登记一方的个人债务。双方婚后共同还贷支付的款项及其相对应财产增值部分,由登记一方对另一方进行补偿。" .
推理器能回答的问题:
"这套房子属于什么性质?" → 匹配 PreMarriageMortgage,房屋归张三"适用什么法律条文?" → 婚姻家庭编解释(一)第 78 条
法律本体 vs 停车场本体:建模差异在哪

建完这个本体,回头看和停车场本体的差异,有几点值得说。
第一,法律本体的类层次更"扁"。停车场本体的类层次很深(Vehicle → Car → ElectricVehicle),物理世界的分类天然是层级的。但法律概念更多是"并列"的——PreMarriageFullPayment 和 PreMarriageMortgage 是同级的不同情形,不是父子关系。
第二,约束是法律本体的灵魂。停车场本体的约束很简单(一个车位停一辆车)。法律本体的约束是多条件组合的,条件之间有优先级。"父母出资"要结合"登记在谁名下"和"是否有赠与协议"才能判断结果。
第三,法律本体需要处理"例外"。OWL 的开放世界假设(Open World Assumption)在这里是个问题。法律推理通常需要封闭世界假设——没有证据证明是赠与,就不能认定为赠与。OWL 原生不支持这一点,需要配合 SWRL 规则或应用层逻辑。
第四,时间是一等公民。停车场本体里,时间只是记录属性(入场时间、出场时间)。离婚房产本体里,时间是核心判断条件——同一个行为(买房),发生在婚前和婚后,法律后果完全不同。
完整的离婚房产分割本体 OWL 文件
把上面的设计整合成完整的 OWL 文件(Turtle 格式):
@prefix : <http://example.org/divorce-property#> .@prefix owl: <http://www.w3.org/2002/07/owl#> .@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .# = 本体声明 =<http://example.org/divorce-property> rdf:type owl:Ontology ; rdfs:label "离婚财产分割房屋本体" ; rdfs:comment "中国民法典框架下离婚房产分割领域的本体模型" .# = 人 =:Person rdf:type owl:Class ; rdfs:label "人" .:Spouse rdf:type owl:Class ; rdfs:subClassOf :Person ; rdfs:label "配偶" .:Husband rdf:type owl:Class ; rdfs:subClassOf :Spouse ; rdfs:label "丈夫" .:Wife rdf:type owl:Class ; rdfs:subClassOf :Spouse ; rdfs:label "妻子" .:Parent rdf:type owl:Class ; rdfs:subClassOf :Person ; rdfs:label "父母" .:HusbandParent rdf:type owl:Class ; rdfs:subClassOf :Parent ; rdfs:label "男方父母" .:WifeParent rdf:type owl:Class ; rdfs:subClassOf :Parent ; rdfs:label "女方父母" .# = 房屋 =:House rdf:type owl:Class ; rdfs:label "房屋" .:CommercialHouse rdf:type owl:Class ; rdfs:subClassOf :House ; rdfs:label "商品房" .:AffordableHouse rdf:type owl:Class ; rdfs:subClassOf :House ; rdfs:label "经济适用房" .:RelocationHouse rdf:type owl:Class ; rdfs:subClassOf :House ; rdfs:label "拆迁安置房" .:SelfBuiltHouse rdf:type owl:Class ; rdfs:subClassOf :House ; rdfs:label "自建房" .# = 产权状态 =:Ownership rdf:type owl:Class ; rdfs:label "产权状态" .:PersonalProperty rdf:type owl:Class ; rdfs:subClassOf :Ownership ; rdfs:label "个人财产" .:CommunalProperty rdf:type owl:Class ; rdfs:subClassOf :Ownership ; rdfs:label "共同财产" .:SharedByPortion rdf:type owl:Class ; rdfs:subClassOf :Ownership ; rdfs:label "按份共有" .# = 出资来源 =:FundingSource rdf:type owl:Class ; rdfs:label "出资来源" .:PersonalFunding rdf:type owl:Class ; rdfs:subClassOf :FundingSource ; rdfs:label "个人出资" .:JointFunding rdf:type owl:Class ; rdfs:subClassOf :FundingSource ; rdfs:label "共同出资" .:ParentalFunding rdf:type owl:Class ; rdfs:subClassOf :FundingSource ; rdfs:label "父母出资" .:GiftFunding rdf:type owl:Class ; rdfs:subClassOf :ParentalFunding ; rdfs:label "赠与性质出资" .:LoanFunding rdf:type owl:Class ; rdfs:subClassOf :ParentalFunding ; rdfs:label "借款性质出资" .# = 购房方式 =:PurchaseMethod rdf:type owl:Class ; rdfs:label "购房方式" .:FullPayment rdf:type owl:Class ; rdfs:subClassOf :PurchaseMethod ; rdfs:label "全款购买" .:MortgagePurchase rdf:type owl:Class ; rdfs:subClassOf :PurchaseMethod ; rdfs:label "贷款购买" .:CommercialMortgage rdf:type owl:Class ; rdfs:subClassOf :MortgagePurchase ; rdfs:label "商业贷款" .:HousingFundLoan rdf:type owl:Class ; rdfs:subClassOf :MortgagePurchase ; rdfs:label "公积金贷款" .:CombinedLoan rdf:type owl:Class ; rdfs:subClassOf :MortgagePurchase ; rdfs:label "组合贷款" .# = 时间阶段 =:TimePeriod rdf:type owl:Class ; rdfs:label "时间阶段" .:PreMarriage rdf:type owl:Class ; rdfs:subClassOf :TimePeriod ; rdfs:label "婚前" .:DuringMarriage rdf:type owl:Class ; rdfs:subClassOf :TimePeriod ; rdfs:label "婚姻存续期间" .:Separation rdf:type owl:Class ; rdfs:subClassOf :TimePeriod ; rdfs:label "分居期间" .# = 产权登记 =:Registration rdf:type owl:Class ; rdfs:label "产权登记" .:RegisteredToOne rdf:type owl:Class ; rdfs:subClassOf :Registration ; rdfs:label "登记在一方名下" .:RegisteredToBoth rdf:type owl:Class ; rdfs:subClassOf :Registration ; rdfs:label "登记在双方名下" .# = 分割方式 =:DivisionMethod rdf:type owl:Class ; rdfs:label "分割方式" .:AwardToOne rdf:type owl:Class ; rdfs:subClassOf :DivisionMethod ; rdfs:label "归一方所有并补偿" .:SellAndDivide rdf:type owl:Class ; rdfs:subClassOf :DivisionMethod ; rdfs:label "变卖后分割" .:BiddingAcquisition rdf:type owl:Class ; rdfs:subClassOf :DivisionMethod ; rdfs:label "竞价取得" .:ContinuedCoOwnership rdf:type owl:Class ; rdfs:subClassOf :DivisionMethod ; rdfs:label "继续共有" .# = 分割情形 =:DivisionCase rdf:type owl:Class ; rdfs:label "分割情形" .:PreMarriageFullPayment rdf:type owl:Class ; rdfs:subClassOf :DivisionCase ; owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( :DivisionCase [ rdf:type owl:Restriction ; owl:onProperty :purchasedDuring ; owl:someValuesFrom :PreMarriage ] [ rdf:type owl:Restriction ; owl:onProperty :purchasedWith ; owl:someValuesFrom :FullPayment ] [ rdf:type owl:Restriction ; owl:onProperty :registeredAs ; owl:someValuesFrom :RegisteredToOne ] ) ] ; rdfs:label "婚前一方全款购房" .:PreMarriageMortgage rdf:type owl:Class ; rdfs:subClassOf :DivisionCase ; owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( :DivisionCase [ rdf:type owl:Restriction ; owl:onProperty :purchasedDuring ; owl:someValuesFrom :PreMarriage ] [ rdf:type owl:Restriction ; owl:onProperty :purchasedWith ; owl:someValuesFrom :MortgagePurchase ] [ rdf:type owl:Restriction ; owl:onProperty :registeredAs ; owl:someValuesFrom :RegisteredToOne ] ) ] ; rdfs:label "婚前贷款婚后共同还贷" .:JointPurchase rdf:type owl:Class ; rdfs:subClassOf :DivisionCase ; owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( :DivisionCase [ rdf:type owl:Restriction ; owl:onProperty :purchasedDuring ; owl:someValuesFrom :DuringMarriage ] [ rdf:type owl:Restriction ; owl:onProperty :fundedBy ; owl:someValuesFrom :JointFunding ] ) ] ; rdfs:label "婚后共同购买" .:ParentalFullFunding rdf:type owl:Class ; rdfs:subClassOf :DivisionCase ; owl:equivalentClass [ rdf:type owl:Class ; owl:intersectionOf ( :DivisionCase [ rdf:type owl:Restriction ; owl:onProperty :purchasedDuring ; owl:someValuesFrom :DuringMarriage ] [ rdf:type owl:Restriction ; owl:onProperty :fundedBy ; owl:someValuesFrom :GiftFunding ] [ rdf:type owl:Restriction ; owl:onProperty :registeredAs ; owl:someValuesFrom :RegisteredToOne ] ) ] ; rdfs:label "婚后父母全额出资赠与一方" .:InheritedHouse rdf:type owl:Class ; rdfs:subClassOf :DivisionCase ; rdfs:label "继承或受赠房产" .# = 法律依据 =:LegalBasis rdf:type owl:Class ; rdfs:label "法律依据" .:CivilCodeArticle rdf:type owl:Class ; rdfs:subClassOf :LegalBasis ; rdfs:label "民法典条文" .:JudicialInterpretation rdf:type owl:Class ; rdfs:subClassOf :LegalBasis ; rdfs:label "司法解释条文" .# = 对象属性 =:ownedBy rdf:type owl:ObjectProperty ; rdfs:domain :House ; rdfs:range :Spouse ; rdfs:label "产权登记人" .:purchasedBy rdf:type owl:ObjectProperty ; rdfs:domain :House ; rdfs:range :Spouse ; rdfs:label "购买人" .:fundedBy rdf:type owl:ObjectProperty ; rdfs:domain :House ; rdfs:range :FundingSource ; rdfs:label "出资来源" .:purchasedWith rdf:type owl:ObjectProperty ; rdfs:domain :House ; rdfs:range :PurchaseMethod ; rdfs:label "购房方式" .:purchasedDuring rdf:type owl:ObjectProperty , owl:FunctionalProperty ; rdfs:domain :House ; rdfs:range :TimePeriod ; rdfs:label "购房时间阶段" .:registeredAs rdf:type owl:ObjectProperty , owl:FunctionalProperty ; rdfs:domain :House ; rdfs:range :Registration ; rdfs:label "登记状态" .:hasOwnership rdf:type owl:ObjectProperty , owl:FunctionalProperty ; rdfs:domain :House ; rdfs:range :Ownership ; rdfs:label "产权性质" .:dividedBy rdf:type owl:ObjectProperty ; rdfs:domain :House ; rdfs:range :DivisionMethod ; rdfs:label "分割方式" .:matchesCase rdf:type owl:ObjectProperty ; rdfs:domain :House ; rdfs:range :DivisionCase ; rdfs:label "匹配情形" .:governedBy rdf:type owl:ObjectProperty ; rdfs:domain :DivisionCase ; rdfs:range :LegalBasis ; rdfs:label "适用法律" .:downPaymentBy rdf:type owl:ObjectProperty ; rdfs:domain :House ; rdfs:range :Spouse ; rdfs:label "首付出资人" .:mortgagePaidBy rdf:type owl:ObjectProperty ; rdfs:domain :House ; rdfs:range :Spouse ; rdfs:label "还贷人" .:parentalFundingFrom rdf:type owl:ObjectProperty ; rdfs:domain :ParentalFunding ; rdfs:range :Parent ; rdfs:label "父母出资方" .# = 数据属性 =:purchasePrice rdf:type owl:DatatypeProperty ; rdfs:domain :House ; rdfs:range xsd:decimal ; rdfs:label "购房总价" .:downPaymentAmount rdf:type owl:DatatypeProperty ; rdfs:domain :House ; rdfs:range xsd:decimal ; rdfs:label "首付金额" .:mortgageAmount rdf:type owl:DatatypeProperty ; rdfs:domain :House ; rdfs:range xsd:decimal ; rdfs:label "贷款总额" .:postMarriageRepayment rdf:type owl:DatatypeProperty ; rdfs:domain :House ; rdfs:range xsd:decimal ; rdfs:label "婚后共同还贷金额" .:currentValue rdf:type owl:DatatypeProperty ; rdfs:domain :House ; rdfs:range xsd:decimal ; rdfs:label "房屋现值" .:appreciationAmount rdf:type owl:DatatypeProperty ; rdfs:domain :House ; rdfs:range xsd:decimal ; rdfs:label "增值金额" .:compensationAmount rdf:type owl:DatatypeProperty ; rdfs:domain :House ; rdfs:range xsd:decimal ; rdfs:label "应补偿金额" .:purchaseDate rdf:type owl:DatatypeProperty ; rdfs:domain :House ; rdfs:range xsd:date ; rdfs:label "购房日期" .:marriageDate rdf:type owl:DatatypeProperty ; rdfs:domain :Spouse ; rdfs:range xsd:date ; rdfs:label "结婚日期" .:divorceDate rdf:type owl:DatatypeProperty ; rdfs:domain :Spouse ; rdfs:range xsd:date ; rdfs:label "离婚日期" .:articleNumber rdf:type owl:DatatypeProperty ; rdfs:domain :LegalBasis ; rdfs:range xsd:string ; rdfs:label "条文编号" .:articleContent rdf:type owl:DatatypeProperty ; rdfs:domain :LegalBasis ; rdfs:range xsd:string ; rdfs:label "条文内容" .:name rdf:type owl:DatatypeProperty ; rdfs:domain :Person ; rdfs:range xsd:string ; rdfs:label "姓名" .
这个文件可以直接导入 Protégé 打开和编辑。
补偿金额怎么算
本体定义了概念和关系,但补偿计算涉及数学公式,OWL 本身表达不了。这里单独说一下计算逻辑。
以最常见的"婚前贷款婚后共同还贷"情形为例:
增值率 = (房屋现值 - 购房总价) / 购房总价婚后还贷对应增值 = 婚后共同还贷金额 × 增值率应补偿金额 = (婚后共同还贷金额 + 婚后还贷对应增值) / 2
套用张三李四的案例:
增值率 = (180万 - 100万) / 100万 = 80%婚后还贷对应增值 = 40万 × 80% = 32万应补偿金额 = (40万 + 32万) / 2 = 36万
李四应获得 36 万元补偿。
需要说明:这个公式是司法实践中常用的计算方式,但各地法院可能有差异。有的法院会考虑装修投入、物价变动等因素。本体的价值在于把"什么情况下需要计算补偿"这个前置判断做好了,具体计算交给应用层。
本体建好了,然后呢
OWL 文件有了,类、属性、约束都定义好了。但这只是起点。
一个本体如果只停留在 Protégé 里,就是一份漂亮的文档。要让它真正干活,还有一条完整的路要走。
这是后续文章要解决的问题:
从文本中提取知识:当事人陈述、法律文书、庭审笔录,都是非结构化文本。怎么用 Spring AI + DeepSeek 把文本变成本体里的三元组?本体的类和属性定义怎么变成提示词约束?
实体消歧与消解:男方说"那套房子",女方也说"那套房子",指的是同一套吗?房产证上写"北京市朝阳区XX路100号3单元801",当事人说"朝阳那套房",怎么确认是同一个实体?
冲突处理与数据验证:男方说首付是自己攒的,女方说是公婆给的。两条三元组打架了。用命名图(Named Graph)标注来源,用优先级规则处理冲突。再用 SHACL 验证数据质量——金额是不是正数、结婚日期是不是早于购房日期。
本体推理:数据干净了,推理器上场。HermiT 自动把满足条件的房产归类到对应的分割情形,关联法律依据,检查数据一致性。OWL 推理做不了的事(比如补偿金额计算),用 SWRL 规则补上。
从本体到应用:前面所有环节串成一个 Spring Boot 应用。输入案件信息,输出分析报告。一个完整的、可运行的离婚房产分割分析系统。
每篇的输出是下一篇的输入。跟着做,到最后手里有一个能跑的 pipeline。
延伸阅读
Ontology Development 101 - Noy & McGuinness:本体构建的经典教程LKIF Core Ontology:法律知识交换格式本体FLINT 本体:基于 Actor 的法律关系模型OWL 2 Web Ontology Language:W3C 官方规范