What a claim actually is (and is not)
Every reference model in the industry — ACORD Claims, the OMG Property & Casualty data model, FIBO's contract/agreement foundations — draws the same three-way distinction that the current ontology collapses into one class:
| Concept | Nature | Standard anchors |
|---|---|---|
| The Loss (occurrence) | Something that happened in the world: a fire, a collision, a liability event. It has a date, a location, a peril (cause of loss), and possibly membership in a declared catastrophe. It exists whether or not anyone claims. | ACORD ClaimsOccurrence; OMG P&C "Loss Event"; gist:Event; schema.org Event |
| The Claim (demand) | A demand for indemnification made under a policy in response to a loss. It is an administrative/legal case with an identifier, a claimant, a responding coverage, and a lifecycle. One loss can spawn many claims; a claim references exactly one policy. | ACORD Claim; OMG P&C "Claim"; FIBO contract-based demand; project doc claim-competency-questions: "a demand for payment or remedy under a policy" |
| The Claim lifecycle | A sequence of events on the case: first notice of loss (FNOL), opening, payments, reopening, closing. Each carries a timestamp and an actor. "Current status" is a derived view of the most recent lifecycle event. | ACORD claim status transactions; PROV-O activities; OWL-Time instants; project doc workflows-and-provenance |
Around the claim sit: the policy (the contract it is filed under), the coverage (the specific insuring agreement that responds), parties in roles (claimant, adjuster, payee — a party plays a role on a claim, it is not the claim's property), financials (paid, reserved, recovered — each a monetary amount with a currency and a valuation date), subrogation (a recovery process against a responsible third party), and reinsurance recovery (the cedent's own claim against a reinsurer, triggered by the original claim).
The invariants the model must hold
- A claim is filed under exactly one policy (CQ-C8's validation query in the project's competency-question set checks precisely this).
- A claim responds to exactly one loss; a loss may relate to many claims.
- Every money value carries a currency; every reserve/paid figure is meaningful only as of a valuation date.
- Incurred = paid + outstanding reserves — a derivation, not an independent fact to store.
- Status is the tail of the event history, never a free-standing string.
- Code values (status, type, peril, payment type) are reference data — governed vocabularies, not schema.
How Claim and Policy are defined today
Extracted from the delivered model (https://chubb.com/ontology/ins#, 494 classes: 170 ins:, 321 pandc:, 3 ra:; 696 relations):
ins:Claim ⊑ gist:Event
One class carries everything: 13 datatype properties (identifier, three lifecycle dates, five bare-decimal money amounts, booleans, a mandatory catastropheEventCode) and 12 object properties (policy, coverage, location, peril, claimant-as-party, adjuster-as-party, payments, status, type, subrogation, loss history, and a self-referencing hasClaimOnCoverage : ins:Claim → ins:Claim whose own definition says "Claims filed against this coverage").
# Verbatim shape of the current class (abridged) ins:Claim a owl:Class ; rdfs:subClassOf gist:Event ; # demand modelled as the occurrence # — data properties — ins:claimNumber xsd:string ; # mandatory, but no uniqueness constraint anywhere ins:catastropheEventCode xsd:string ; # MANDATORY on every claim — even non-cat claims ins:dateReported / dateOpened / dateClosed xsd:date ; # lifecycle flattened to 3 literals ins:paidAmount / reserveAmount / incurredAmount / recoveryAmount / claimExpenseAmount xsd:decimal ; # money with no currency, no valuation date # — object properties — ins:claimOnPolicy → ins:Policy 0..1 optional ; # orphan claims allowed ins:claimantParty → ins:Party ; ins:hasAdjuster → ins:Party ; # bypasses the ins:PartyRole pattern ins:hasClaimStatus → ins:ClaimStatus ; # enum snapshot, no history ins:hasClaimOnCoverage → ins:Claim . # Claim→Claim self-loop; text says coverage→claim
ins:ClaimStatus / ins:ClaimType ⊑ gist:Category (closed string enums)
ClaimStatus = {Approved, Closed, Denied, In Subrogation, Open, Pending Review, Reopened, Reported}; ClaimType = {Business Income, First Party Property, Subrogation, Third Party Liability, Workers Compensation}. Values are display strings baked into the schema; no IRIs, no skos:notation, no ACORD mapping. Meanwhile pandc:DOClaimType is modelled as skos:Concept — two competing code-list patterns in one delivery. "Subrogation" appears as a type, "In Subrogation" as a status, and ins:Subrogation as an empty class with zero properties — one process scattered across three constructs.
ins:ClaimPayment ⊑ gist:Transaction · ins:ReinsuranceClaim ⊑ gist:Event · ins:LossHistory ⊑ gist:HistoricalEvent
ClaimPayment.paymentAmount is again a bare decimal; paymentOnClaim is optional (a payment on no claim); ins:PaymentType is a category class with no values defined at all. ReinsuranceClaim is another gist:Event whose originatingClaim is optional. LossHistory re-encodes the entire claim domain as strings: lossPolicyNumber, lossClaimNumber, claimantName, claimStatus : xsd:string, lossInsurer : xsd:string — the textbook message-encoding antipattern from the project's own brief.
ins:Policy ⊑ gist:Agreement — a 60-property god-class
Contract identity, dates, premium, cancellation literals (cancellationDate/-Description/-TypeCode/-NoticeDays), multinational programme codes, broker branch strings, London-market underwriting year, FX rates, commission — all directly on one class. Notables: policyType is a plain string beside dozens of named-individual classifications; policyLanguage and policyLanguageCode duplicate each other; ins:resultsInPolicy ("Quote that produced this policy when bound") is declared on Policy with range Policy — its domain plainly should be ins:Quote; and nearly every single-valued property is stamped owl:FunctionalProperty as a pseudo-validation device.
Structural issue register
| ID | Sev. | Finding | Standard / project doc violated | Backlog |
|---|---|---|---|---|
| F-01 | HIGH | Event conflation. ins:Claim ⊑ gist:Event merges the loss occurrence, the demand, and the case file into one node; no Loss class exists. | ACORD Claim vs ClaimsOccurrence; OMG P&C; project claim CQ model (claim:Claim + claim:Loss) | CLM-1, CLM-2 |
| F-02 | HIGH | Money as bare decimals. Five claim amounts + payment amount are xsd:decimal — currency and valuation date lost; incurredAmount stores a derivable sum. | FIBO MonetaryAmount; project message-encoding-antipattern ("a premium becomes a bare decimal instead of a core:MoneyAmount") | CLM-7, CLM-8, CLM-11 |
| F-03 | HIGH | Broken self-reference. ins:hasClaimOnCoverage : Claim → Claim with coverage-domain documentation; plus unsynchronised hand-built inverse pairs with no owl:inverseOf. | OWL 2 property semantics; project rebuttal-domain-range | CLM-9 |
| F-04 | HIGH | Status/type as schema enums. gist:Category classes with display-string members; no IRIs, notations, or ACORD crosswalk; inconsistent with pandc:DOClaimType (skos:Concept). | SKOS; project rebuttal-codelist-skos & controlled-vocabularies (default = ConceptScheme + sh:in) | CLM-5, CLM-6 |
| F-05 | HIGH | No lifecycle model. Three date literals + a status snapshot; the CQ "which claims were reopened, and when?" is unanswerable; no provenance of transitions. | OWL-Time, PROV-O; project claim CQs C10–C11; workflows-and-provenance | CLM-4, CLM-5 |
| F-06 | MED | Wrong/missing cardinalities. claimOnPolicy optional (orphan claims); catastropheEventCode mandatory on every claim; paymentOnClaim optional; originatingClaim optional. | SHACL; project rebuttal-cardinality-restrictions (shapes count, axioms classify) | CLM-3, CLM-15 |
| F-07 | MED | Roles bypassed. claimantParty/hasAdjuster point straight at ins:Party although the ontology already has an ins:PartyRole hierarchy with 10 subclasses on the distribution side. | Role-reification pattern; FIBO parties-in-roles; project party module | CLM-10 |
| F-08 | MED | Subrogation scattered. Empty class + a ClaimType value + a ClaimStatus value for the same recovery process. | Project taxonomy-trap (class vs value vs state) | CLM-12 |
| F-09 | MED | LossHistory string-encodes the graph. Policy, claim, claimant, insurer, status all as literals — unjoinable with first-class Claim data. | Project message-encoding-antipattern §02 ("it fragments identity") | CLM-14 |
| F-10 | MED | FunctionalProperty as validation. Single-value rules asserted as OWL axioms (silent under open world; merges or explodes on dirty data) instead of SHACL counts. | Project rebuttal-cardinality-restrictions F3/F14 | CLM-15 |
| F-11 | MED | Namespace violations. https://chubb.com/ontology/ins#Claim — wrong host, hash IRI, no layer/module path, one monolithic namespace for 170 classes. | Project namespace-policy NS-1..NS-8 (https://data.chubb.com/ontology/ins/claim/) | CLM-16 |
| F-12 | MED | Policy god-class & domain error. ~60 direct properties; resultsInPolicy declared on Policy instead of Quote; cancellation as four scattered literals; duplicated language properties. | Project ontology-modularization; rebuttal-domain-range | POL-1..POL-4 |
| F-13 | LOW | Untyped roots. ins:InsuranceCoverage, ins:CoveredPeril (and 60 others) sit directly under owl:Class, outside the gist upper alignment used elsewhere. | gist upper-ontology alignment; reusing-standard-ontologies | POL-5 |
| F-14 | LOW | Known viewer violations inherited. V-013 (no audit trail on Policy/Submission), V-023 (Endorsement cannot reach its Policy). | PROV-O; OWL 2 object properties | POL-6 |
The corrected claim structure
The refactor follows the project's published order of authority: competency questions first, domain not message, SKOS for code lists, SHACL counts / OWL classifies, namespace policy, reuse standards (gist upper, FIBO for money concepts, ACORD as a terminology source — never its message tree, schema.org for outward publication only).
# Target shape — see ontology/claim.ttl for the full module claim:Claim ⊑ core:Case . # the demand / case file (≈ ACORD Claim) claim:Loss ⊑ core:Event . # the occurrence (≈ ACORD ClaimsOccurrence) claim:ClaimEvent ⊑ core:Event . # lifecycle: Fnol / Opening / Payment / Reopening / Closing (disjoint) claim:underPolicy : Claim → policy:Policy [SHACL exactly 1] ; owl:inverseOf policy:hasClaim . claim:hasLoss : Claim → Loss [SHACL exactly 1] . claim:claimant : Claim → claim:Claimant # a party:PartyRole played by a party:Party claim:hasClaimEvent : Claim → ClaimEvent # each event: time:Instant + prov:wasAssociatedWith claim:hasClaimStatus: Claim → skos:Concept [sh:in claim-status scheme; derived from event tail] claim:hasPaidTotal / hasOutstandingReserve / hasRecoveryTotal / hasExpensePaid : Claim → core:MoneyAmount # value + ISO-4217 currency + valuationDate # incurred is DERIVED: paid + outstanding reserve — SHACL-SPARQL consistency check, never stored
See the before/after diagrams (pre #1 → post #1, pre #2 → post #2), the full corrected class diagram with object and data properties, the runnable Turtle / JSON-LD, and the SHACL shape suite with a validated violation report against seeded bad data.
Standards this refactor is anchored to
| Standard | Body | Used for |
|---|---|---|
| OWL 2 / RDFS / RDF 1.1 | W3C | Class/property semantics; owl:inverseOf declared once per pair; restrictions only where the reasoner infers (defined classes) |
| SHACL | W3C | All cardinality, datatype, and membership constraints; named violation reports; CI gate |
| SKOS | W3C | Claim status / claim type / payment type / peril as governed ConceptSchemes with notation and *Match crosswalks |
| OWL-Time, PROV-O | W3C | Lifecycle event instants; who/what performed each claim transition |
| FIBO | EDM Council / OMG | MonetaryAmount pattern (amount + currency), agreements/parties foundations, ISO 4217 currency individuals |
| ACORD | ACORD | Terminology and code values only (Claim vs ClaimsOccurrence, status/type codes via skos:exactMatch) — never its message tree (per project brief) |
| OMG P&C Insurance Data Model | OMG | Claim / Loss Event / Claim Folder separation; financial valuation-date semantics |
| schema.org | W3C CG | Outward-facing publication mapping (schema:Event, schema:MonetaryAmount) via skos:closeMatch annotations |
| gist | Semantic Arts | Upper alignment retained (core:Event, core:Agreement, categories → SKOS) |
| ISO 4217 / 3166 | ISO | Currency and country vocabularies as SKOS schemes |
Project briefs applied: rebuttal-codelist-skos, controlled-vocabularies, rebuttal-cardinality-restrictions, message-encoding-antipattern, namespace-policy, extension-authoring-guide, claim-competency-questions, ontology-modularization, reusing-standard-ontologies, workflows-and-provenance.