Ontology engineering · namespace policy

A place for every IRI.

One consistent naming scheme for Chubb’s ontology modules, SKOS vocabularies and instance data — and how to mint namespaces when you extend the upper ontology.

Written for Ontology maintainers Extension authors minting new IRIs

Why a policy at all

Thesis

An IRI is a promise: this name means this thing, forever, everywhere. A consistent namespace scheme keeps those promises — identity never collides, every term says which module owns it, and a reader can tell a class from a code from a claim at a glance, just from its address.

Namespaces are the one design decision that is genuinely hard to undo. Rename a class and you fix a few files; change a namespace and you break every dataset, query and downstream system that ever referenced it. So the rules below are deliberately strict and deliberately few — a small scheme, applied without exception, is what lets the model grow for years without an identity crisis.

This is the fourth of the ontology-engineering briefs, alongside Start with the questions, Model the domain, not the message, and Build it in modules.

01 — THE SCHEME

How a Chubb IRI is built

Every minted IRI is https, on the host data.chubb.com, and structured as /{root}/{layer}/{module}/{local-name}. The path is not decoration — each segment carries meaning a reader and a machine can act on.

// a class in the policy module (T-Box)

ontology/root · schema
ins/layer
policy/module
Policyclass

// an individual in sample data (A-Box)

resource/root · data
ins/policy/module path
example/dataset
PN-100individual

The first segment after the host is the load-bearing one. It separates the three kinds of thing an insurance ontology names, so a class, a controlled-vocabulary code, and a business fact never share an address space:

/ontology/

Schema — the T-Box

Classes and properties: the model. fnd/core/, ins/policy/, misc/competency/. Slow-moving, versioned, imported by everything.

/vocabulary/

Vocabularies — SKOS

Controlled code lists as skos:Concept schemes: perils, claim statuses, lines of business. Governed reference data, not classes. (See §03.)

/resource/

Instances — the A-Box

Individual policies, claims, parties — and competency-question data. resource/ins/policy/example/. Mirrors the ontology path under a different root.

Chubb-minted names use slash namespaces with a trailing slash, so a term appends directly (…/policy/Policy). The vendored W3C standards keep their own canonical hash IRIs — skos:, org:, time: — and are never re-minted under data.chubb.com.

02 — THE POLICY

Ten rules for every namespace

These are normative. MUST rules are invariants a reasoner or a reviewer can check; SHOULD rules are strong defaults you break only with a recorded reason.

NS-1

MUSTUse https and the host data.chubb.com for all minted IRIs.

NS-2

MUSTSeparate roots by artifact kind/ontology/ for schema, /vocabulary/ for SKOS schemes, /resource/ for instances. Never place a class and an individual under the same root.

NS-3

MUSTUse slash namespaces with a trailing slash for Chubb terms; append the local name directly. Reserve hash (#) IRIs for the vendored W3C vocabularies, which keep their canonical namespaces.

NS-4

MUSTStructure the path as /{root}/{layer}/{module}/. The module name is short, lowercase, singular and stable; the layer is one of fnd, ins, misc (or a new domain layer).

NS-5

MUSTMake the owl:Ontology IRI equal the module namespace (with its trailing slash), and keep the file’s # baseURI and @prefix : identical to it.

NS-6

MUSTDeclare a version IRI as {namespace}{version} — e.g. …/ins/policy/0.1 — with owl:versionInfo. The namespace itself carries no version and never changes.

NS-7

SHOULDRegister one preferred prefix via vann:preferredNamespacePrefix: short, lowercase, stable, and identical everywhere — the header, the @prefix, and every importing file.

NS-8

MUSTSet vann:preferredNamespaceUri to the full namespace including its trailing slash — byte-for-byte the ontology IRI, not a slash-stripped variant.

NS-9

MUSTKeep the header comments in sync# baseURI, # prefix and # imports must always mirror the real owl:imports and vann:* triples.

NS-10

MUSTReuse external standards at their canonical IRIs. Never re-mint SKOS, Org, Time or Dublin Core under data.chubb.com; add Chubb axioms in core, not by editing a vendored file.

03 — SKOS VOCABULARIES

Naming controlled vocabularies

A controlled vocabulary — a list of perils, claim statuses, currencies, lines of business — is not part of the model’s shape; it is a governed set of values. Modelling each code as an OWL class explodes the class hierarchy and forces a reasoner to carry hundreds of trivial subclasses. The right tool is SKOS: each code is a skos:Concept, grouped into a skos:ConceptScheme, and referenced by the ontology — not baked into it.

Because a scheme is neither pure schema nor transactional data, it gets its own root, parallel to the other two:

// a concept in the peril vocabulary

vocabulary/root · skos
ins/layer
peril/scheme
Floodconcept

The policy for SKOS schemes

  • One scheme, one namespace. …/vocabulary/{layer}/{scheme}/, versioned and prefixed exactly like an ontology module (NS-4 through NS-8 apply unchanged).
  • Concepts, not classes. Each code is a skos:Concept with skos:inScheme, a skos:prefLabel, and a stable skos:notation (the business code). The IRI local name is a readable token, never the raw code alone.
  • Reuse SKOS itself; never re-mint it. Use skos: at http://www.w3.org/2004/02/skos/core# (vendor it once at your foundation layer and import where needed).
  • Link from the ontology by reference. An ontology property ranges over the concept (claim:hasPeril rdfs:range skos:Concept), and instance data points at the shared concept — so the code list evolves without touching the T-Box.
  • Keep schemes in their own files. Never inline a controlled vocabulary into a domain ontology module; a scheme versions on its own clock.
# /vocabulary/ins/peril/ — a governed code list, separate from the model
@prefix peril: <https://data.chubb.com/vocabulary/ins/peril/> .
@prefix skos:  <http://www.w3.org/2004/02/skos/core#> .

peril:  a skos:ConceptScheme ;
        dct:title "Chubb Peril Types"@en ;
        owl:versionInfo "0.1" .

peril:Flood a skos:Concept ;
        skos:inScheme  peril: ;
        skos:prefLabel "Flood"@en ;
        skos:notation  "FLD" .          # the stable business code

# the ontology references the scheme — it does not contain the codes
claim:hasPeril  rdfs:range skos:Concept .   # values drawn from peril:
04 — EXTENSIONS

Extending the upper ontology

When you build on core, agreement or a domain module — a new line of business, a regional variant, a partner model — the temptation is to add your terms into the module you are extending. Don’t. That is the single most damaging namespace mistake, because it puts terms you own into a namespace you don’t govern, and destabilises the foundation everyone else depends on.

The golden rule

Mint every new term in your own module namespace, owl:imports the upper module, and connect upward with rdfs:subClassOf / rdfs:subPropertyOf. You never write into fnd/core/’s address space; you point at it.

Choosing the layer for a new module

  • Cross-domain & reusable (a concept many lines share) → a new fnd/ module. A high bar — foundation changes are slow and heavily reviewed.
  • A new line of business or domain → its own layer beside ins/: …/ontology/marine/cargo/, …/ontology/cyber/policy/. The layer names the business domain.
  • A regional or tenant variant → a distinct module that imports the base, e.g. …/ontology/ins/policy-uk/ — never a fork of the original file under the same IRI.
  • Enterprise meta or governancemisc/.
# A Marine Cargo line of business — its own namespace, built on the upper modules
@prefix mrc:    <https://data.chubb.com/ontology/marine/cargo/> .
@prefix policy: <https://data.chubb.com/ontology/ins/policy/> .
@prefix core:   <https://data.chubb.com/ontology/fnd/core/> .

<https://data.chubb.com/ontology/marine/cargo/>
    a owl:Ontology ;
    owl:imports <https://data.chubb.com/ontology/ins/policy/> ;
    vann:preferredNamespacePrefix "mrc" ;
    vann:preferredNamespaceUri <https://data.chubb.com/ontology/marine/cargo/> ;
    owl:versionIRI <https://data.chubb.com/ontology/marine/cargo/0.1> .

mrc:CargoPolicy  rdfs:subClassOf policy:Policy .   # extend by subclassing…
mrc:Jettison     rdfs:subClassOf core:Event .      # …never by editing policy or core

Two ways to extend — one right, one wrong

Polluting the upper namespace

  • Squatting. New terms minted under …/fnd/core/ — a namespace you don’t own.
  • Editing the base. Bolting line-of-business classes into core.ttl, destabilising everyone downstream.
  • Prefix collision. Reusing core: for terms that aren’t core’s.
  • Code squatting. Adding a concept to a peril scheme you don’t govern.

Extending from above

  • Own namespace. Terms live in …/marine/cargo/, importing the upper modules.
  • Subclass upward. mrc:CargoPolicy ⊑ policy:Policy leans on the published contract.
  • Own prefix & version. A distinct mrc: and an independent versionIRI.
  • Map, don’t squat. New perils in your own scheme, linked with skos:broader / skos:exactMatch.

If the foundation is genuinely missing something

Sometimes an extension needs a general concept that truly belongs in core. That is a legitimate foundation change request — raised, reviewed and versioned against core on its own slow track — not something you graft in from an extension. Keep the two acts separate: extend in your namespace now; propose the foundation change deliberately.