Claim & Policy in the Unified Insurance Ontology
Domain Knowledge & Structural Analysis

How ins:Claim and ins:Policy are defined today, why the structure is wrong against the project's own standards and the industry references, and what the corrected model looks like. Companion to the refactoring backlog.

W3C OWL 2 / RDFS / SHACL / SKOSFIBO — EDM Council / OMGACORDschema.orggistOWL-Time / PROV-O
01 — THE DOMAIN

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:

ConceptNatureStandard 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 lifecycleA 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

  1. A claim is filed under exactly one policy (CQ-C8's validation query in the project's competency-question set checks precisely this).
  2. A claim responds to exactly one loss; a loss may relate to many claims.
  3. Every money value carries a currency; every reserve/paid figure is meaningful only as of a valuation date.
  4. Incurred = paid + outstanding reserves — a derivation, not an independent fact to store.
  5. Status is the tail of the event history, never a free-standing string.
  6. Code values (status, type, peril, payment type) are reference data — governed vocabularies, not schema.
02 — AS-IS

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.

03 — FINDINGS

Structural issue register

IDSev.FindingStandard / project doc violatedBacklog
F-01HIGHEvent 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-02HIGHMoney 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-03HIGHBroken 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-rangeCLM-9
F-04HIGHStatus/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-05HIGHNo 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-provenanceCLM-4, CLM-5
F-06MEDWrong/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-07MEDRoles 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 moduleCLM-10
F-08MEDSubrogation 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-09MEDLossHistory 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-10MEDFunctionalProperty 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/F14CLM-15
F-11MEDNamespace 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-12MEDPolicy 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-rangePOL-1..POL-4
F-13LOWUntyped 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-ontologiesPOL-5
F-14LOWKnown viewer violations inherited. V-013 (no audit trail on Policy/Submission), V-023 (Endorsement cannot reach its Policy).PROV-O; OWL 2 object propertiesPOL-6
04 — TARGET MODEL

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 #1post #1, pre #2post #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.

05 — REFERENCE STANDARDS

Standards this refactor is anchored to

StandardBodyUsed for
OWL 2 / RDFS / RDF 1.1W3CClass/property semantics; owl:inverseOf declared once per pair; restrictions only where the reasoner infers (defined classes)
SHACLW3CAll cardinality, datatype, and membership constraints; named violation reports; CI gate
SKOSW3CClaim status / claim type / payment type / peril as governed ConceptSchemes with notation and *Match crosswalks
OWL-Time, PROV-OW3CLifecycle event instants; who/what performed each claim transition
FIBOEDM Council / OMGMonetaryAmount pattern (amount + currency), agreements/parties foundations, ISO 4217 currency individuals
ACORDACORDTerminology 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 ModelOMGClaim / Loss Event / Claim Folder separation; financial valuation-date semantics
schema.orgW3C CGOutward-facing publication mapping (schema:Event, schema:MonetaryAmount) via skos:closeMatch annotations
gistSemantic ArtsUpper alignment retained (core:Event, core:Agreement, categories → SKOS)
ISO 4217 / 3166ISOCurrency 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.