Insurance claim ontology · competency questions

What the claim ontology must answer.

Fourteen competency questions for the Claim ontology — twelve that retrieve answers, two that validate the data — each written as a SPARQL query and runnable over the sample claim dataset. Together they are the module’s acceptance tests.

14 questions · 12 retrieval · 2 validation source: misc/claim-cq.ttl exercises: ins/claim.ttl

What this is

In one line

A competency question is a question the ontology must be able to answer. These fourteen pin down what the Claim ontology is for — and, expressed as SPARQL, they become an executable test suite: a change is safe when the questions still return the right answers.

Each question below carries its natural-language form (as authored in misc/claim-cq.ttl), the exact SPARQL that answers it, the ontology terms it exercises, and the answer it returns against the sample data in resource/claim-example.ttl. For the method behind them, see Start with the questions.

Two kinds of question

retrieval  questions return the answer directly — a claim, a claimant, a count. validation  questions return violations: an empty result set is the passing state, and any row is a data-quality defect to fix.

The fourteen, at a glance

CQQuestionTypeChiefly exercises
CQ-C1Which claim has a given identifier?retrievalclaim:claimId
CQ-C2Under which policy is a claim filed?retrievalpolicy:underPolicy
CQ-C3How many claims are filed against a policy?retrievalpolicy:underPolicy (count)
CQ-C4Who is the claimant of a claim?retrievalclaim:claimant
CQ-C5What losses gave rise to a claim?retrievalclaim:hasLoss
CQ-C6Who is the policyholder of a claim’s policy?retrievalpolicy:policyHolder
CQ-C7Which claims were filed by an organization?retrievalcore:Organization
CQ-C8Does every claim reference exactly one policy?validationpolicy:underPolicy
CQ-C9Is any event given two lifecycle types?validationclaim:ClaimEvent
CQ-C10Which claims have been reopened?retrievalclaim:hasClaimEvent
CQ-C11What is a claim’s current status, and when?retrievalclaim:hasClaimEvent, OWL-Time
CQ-C12Which agents act in the claimant role?retrievalclaim:ClaimantRole
CQ-C13Which claims have been cancelled, and when?retrievalclaim:CancellationEvent
CQ-C14When was each claim opened and closed?retrievalclaim:OpeningEvent, claim:ClosingEvent
01 — THE SAMPLE DATASET

The data the answers are computed against

The expected answers below come from resource/claim-example.ttl — two claims on one policy, one of them reopened.

IndividualTypeKey facts
ex:POL-500policypolicyNumber "POL-500"; policyholder ex:AcmeCorp
ex:CLM-1001claimunder POL-500; claimant Jane Doe (person); loss Warehouse fire; opened 2026-01-04, closed 2026-02-01
ex:CLM-1002claimunder POL-500; claimant Acme Corp (organization); opened 2026-03-10, closed 2026-04-15, reopened 2026-05-20
ex:JaneDoecore:Person“Jane Doe”; holds claim:ClaimantRole
ex:AcmeCorpcore:Organization“Acme Corp”; holds claim:ClaimantRole
ex:Loss-Aclaim:Loss“Warehouse fire loss”
02 — RETRIEVAL QUESTIONS

Questions that return an answer

Identity & policy linkage

Finding a claim, and the policy behind it

CQ-C1retrieval

Which claim has a given claim identifier?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
SELECT ?claim WHERE {
  ?claim a claim:Claim ;
         claim:claimId "CLM-1001" .
}
Exercisesclaim:Claim, claim:claimId (functional identifier)
Answerex:CLM-1001
CQ-C2retrieval

Under which policy is a given claim filed?

PREFIX claim:  <https://data.chubb.com/ontology/ins/claim/>
PREFIX policy: <https://data.chubb.com/ontology/ins/policy/>
SELECT ?policy ?policyNumber WHERE {
  ?claim  claim:claimId "CLM-1001" ;
          policy:underPolicy ?policy .
  OPTIONAL { ?policy policy:policyNumber ?policyNumber }
}
Exercisespolicy:underPolicy — the claim→policy link (defined in the policy module, used here as data)
Answerex:POL-500 · "POL-500"
CQ-C3retrieval

How many claims are filed against the policy with a given policy number?

PREFIX claim:  <https://data.chubb.com/ontology/ins/claim/>
PREFIX policy: <https://data.chubb.com/ontology/ins/policy/>
SELECT (COUNT(DISTINCT ?claim) AS ?claimCount) WHERE {
  ?policy policy:policyNumber "POL-500" .
  ?claim  policy:underPolicy ?policy .
}
Exercisespolicy:underPolicy with aggregation
Answer2
CQ-C6retrieval

For each claim, who is the policyholder of the policy it is filed under?

PREFIX claim:  <https://data.chubb.com/ontology/ins/claim/>
PREFIX policy: <https://data.chubb.com/ontology/ins/policy/>
SELECT ?claim ?policyHolder WHERE {
  ?claim  a claim:Claim ;
          policy:underPolicy ?policy .
  ?policy policy:policyHolder ?policyHolder .
}
Exercisesa two-hop join claim → policy → policyHolder
AnswerCLM-1001 → Acme Corp · CLM-1002 → Acme Corp

Parties

Who is making the claim

CQ-C4retrieval

Who is the claimant of a given claim?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
SELECT ?claimant WHERE {
  ?claim  claim:claimId "CLM-1001" ;
          claim:claimant ?claimant .
}
Exercisesclaim:claimant (claim → core:SocialAgent)
Answerex:JaneDoe
CQ-C7retrieval

Which claims were filed by an organization rather than a person?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
PREFIX core:  <https://data.chubb.com/ontology/fnd/core/>
SELECT ?claim ?claimant WHERE {
  ?claim    claim:claimant ?claimant .
  ?claimant a core:Organization .
}
Exercisesclaim:claimant filtered by core:Organization (vs. core:Person)
Answerex:CLM-1002 (claimant Acme Corp)
CQ-C12retrieval

Which agents act in the role of claimant?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
PREFIX core:  <https://data.chubb.com/ontology/fnd/core/>
SELECT DISTINCT ?claimant WHERE {
  ?claimant core:hasRole claim:ClaimantRole .
}
Exercisescore:hasRoleclaim:ClaimantRole; agents holding it are exactly claim:Claimant (its role-defined equivalent class)
Answerex:JaneDoe · ex:AcmeCorp

Loss

What gave rise to the claim

CQ-C5retrieval

What losses gave rise to a given claim?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
SELECT ?loss WHERE {
  ?claim  claim:claimId "CLM-1001" ;
          claim:hasLoss ?loss .
}
Exercisesclaim:hasLoss (claim → claim:Loss)
Answerex:Loss-A ("Warehouse fire loss")

Lifecycle · claim:hasClaimEvent

The claim through time

CQ-C10retrieval

Which claims have been reopened?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
SELECT DISTINCT ?claim ?claimId WHERE {
  ?claim a claim:Claim ;
         claim:claimId ?claimId ;
         claim:hasClaimEvent ?event .
  ?event a claim:ReopeningEvent .
}
Exercisesclaim:hasClaimEventclaim:ReopeningEvent
Answerex:CLM-1002 · "CLM-1002"
CQ-C11retrieval

What is the current status of a claim (from its most recent lifecycle event), and when did it occur?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
PREFIX time:  <http://www.w3.org/2006/time#>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?claimId ?statusType ?when WHERE {
  ?claim  claim:claimId ?claimId ;
          claim:hasClaimEvent ?event .
  ?event  a ?statusType ;
          time:hasBeginning/time:inXSDDateTimeStamp ?when .
  ?statusType rdfs:subClassOf claim:ClaimEvent .
  FILTER NOT EXISTS {
    ?claim claim:hasClaimEvent ?later .
    ?later time:hasBeginning/time:inXSDDateTimeStamp ?t2 .
    FILTER ( ?t2 > ?when )
  }
}
Exercisesclaim:hasClaimEvent with OWL-Time (time:hasBeginning) and a most-recent filter
AnswerCLM-1001 → Closing event, 2026-02-01 · CLM-1002 → Reopening event, 2026-05-20
CQ-C13retrieval

Which claims have been cancelled, and when?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
PREFIX time:  <http://www.w3.org/2006/time#>
SELECT ?claim ?when WHERE {
  ?event a claim:CancellationEvent ;
         claim:isEventOf ?claim ;
         time:hasBeginning/time:inXSDDateTimeStamp ?when .
}
Exercisesclaim:CancellationEvent and claim:isEventOf (the inverse of claim:hasClaimEvent)
Answerno rows over the sample — no claim is cancelled; the model supports the question
CQ-C14retrieval

When was each claim opened, and when was it closed?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
PREFIX time:  <http://www.w3.org/2006/time#>
SELECT ?claimId ?openedAt ?closedAt WHERE {
  ?claim claim:claimId ?claimId ;
         claim:hasClaimEvent ?open .
  ?open  a claim:OpeningEvent ;
         time:hasBeginning/time:inXSDDateTimeStamp ?openedAt .
  OPTIONAL {
    ?claim claim:hasClaimEvent ?close .
    ?close a claim:ClosingEvent ;
           time:hasBeginning/time:inXSDDateTimeStamp ?closedAt .
  }
}
Exercisesclaim:OpeningEvent and claim:ClosingEvent with OWL-Time
AnswerCLM-1001 → opened 2026-01-04, closed 2026-02-01 · CLM-1002 → opened 2026-03-10, closed 2026-04-15
03 — VALIDATION QUESTIONS

Questions that return violations

Read these the other way round

A validation query is designed to find what is wrong. Over the sample data both return no rows — which is the passing result. Any row that appears is a defect to correct.

CQ-C8validation

Does every claim reference exactly one policy?

PREFIX claim:  <https://data.chubb.com/ontology/ins/claim/>
PREFIX policy: <https://data.chubb.com/ontology/ins/policy/>
SELECT ?claim (COUNT(?policy) AS ?policyCount) WHERE {
  ?claim a claim:Claim .
  OPTIONAL { ?claim policy:underPolicy ?policy }
}
GROUP BY ?claim
HAVING (COUNT(?policy) != 1)
Checksevery claim:Claim has exactly one policy:underPolicy — catches orphaned or multiply-linked claims
Resultno rows — passes (both claims link to exactly one policy)
CQ-C9validation

Is any claim event assigned two mutually-exclusive lifecycle types?

PREFIX claim: <https://data.chubb.com/ontology/ins/claim/>
PREFIX rdfs:  <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?event ?typeA ?typeB WHERE {
  ?event a ?typeA , ?typeB .
  ?typeA rdfs:subClassOf claim:ClaimEvent .
  ?typeB rdfs:subClassOf claim:ClaimEvent .
  FILTER ( STR(?typeA) < STR(?typeB) )
}
Checksthe pairwise-disjoint lifecycle types (Opening / Closing / Cancellation / Reopening) are not co-asserted on one event
Resultno rows — passes (each event has a single type)
04 — COVERAGE IN BOTH DIRECTIONS

Every question answerable, every term earned

The competency-question method asks for coverage checked both ways: forward — is every question answerable? — and reverse — does every term in the ontology earn its place by appearing in at least one question? The method is blunt about the reverse check: “if nothing asks for it, question why it exists.”

forward

Every CQ is answerable

All fourteen questions have a runnable SPARQL query over resource/claim-example.ttl. Eleven return rows; CQ-C13 legitimately returns none (the sample holds no cancellation), and the two validation queries return none, which is their passing state.

reverse

Every term earns its place

An audit against this method found five claim terms exercised by no question. CQ-C12CQ-C14 were added to close that gap, so every class and property below now maps to at least one CQ.

Reverse coverage — each claim term to the questions that exercise it

TermExercised by
claim:ClaimCQ-C1, C6, C8, C10
claim:claimIdCQ-C1, C4, C5, C10, C11, C14
claim:claimantCQ-C4, C7
claim:Claimant / claim:ClaimantRoleCQ-C12 · added
claim:hasLoss / claim:LossCQ-C5
claim:hasClaimEventCQ-C10, C11, C14
claim:isEventOfCQ-C13 · added
claim:ClaimEventCQ-C9, C11
claim:OpeningEvent / claim:ClosingEventCQ-C14 · added
claim:CancellationEventCQ-C13 · added
claim:ReopeningEventCQ-C10

What the reverse check bought

Before this pass, claim:ClaimantRole, claim:CancellationEvent, claim:OpeningEvent, claim:ClosingEvent and claim:isEventOf were defined but unexercised — exactly the “does anything ask for this?” smell the method warns about. They are part of the lifecycle and role model, so rather than drop them, three questions were added to justify them. The set is now closed in both directions.

05 — THE VOCABULARY EXERCISED

Claim terms these questions draw on

The terms from ins/claim.ttl (and the neighbouring policy and core modules) that the questions above put to work.

TermKindMeaning
claim:ClaimclassA demand for payment or remedy under a policy, in response to a loss.
claim:ClaimantclassThe party in the role of making a claim.
claim:LossclassThe insured event or occurrence giving rise to a claim.
claim:ClaimEventclassA lifecycle event; subtypes Opening / Closing / Cancellation / Reopening are pairwise disjoint.
claim:claimIdpropertyFunctional identifier of a claim (a dct:identifier).
claim:claimantpropertyRelates a claim to the agent making it.
claim:hasLosspropertyRelates a claim to its loss.
claim:hasClaimEventpropertyRelates a claim to a lifecycle event; timestamp with OWL-Time.
policy:underPolicypropertyRelates a claim to the policy it is filed under (defined in the policy module).
policy:policyHolderpropertyRelates a policy to its policyholder.
core:Organization / core:PersonclassThe kinds of social agent a claimant can be.