See OpenRiC live — 2D/3D graph against a real archival dataset. See it in action ↗

OpenRiC Mapping Specification

Version: 0.38.1 Status: Active — cross-referenced with RiC-AG (Application Guidelines) v0.1 Last updated: 2026-05-25


✅ RiC-O 1.1 namespace remediation — complete (v0.37.0, 2026-04-25)

This document has been remediated against RiC-O 1.1 (2025-05-22). Every rico:* term emitted as data is canonical 1.1; every term that needed renaming, remodelling, or moving to the OpenRiC extension namespace has been processed across five phases (A → E). The full per-term disposition table and phase summaries are at audit/ric-o-1.1-audit.html.

The remaining rico:* tokens that appear in this document are exclusively in “MUST NOT emit X” warnings explaining what’s not in RiC-O 1.1 — they are documentation prose, not emissions. Implementations of any OpenRiC profile MUST NOT emit them as data.

1. Purpose

This specification defines a deterministic mapping from the traditional archival-description standards — ISAD(G), ISAAR(CPF), ISDIAH, ISDF — to the ICA’s Records in Contexts conceptual model (RiC-CM v1.0) and its ontology (RiC-O v1.1, 2025-05-22).

Given a conforming input description, exactly one conforming RiC graph SHALL result. The mapping is total: every entity in the input has a defined target class in RiC, and every normatively-required ISAD(G)/ISAAR(CPF)/ISDIAH element has a defined target predicate.

A reference implementation exists in the Heratio ahg-ric package (AGPL-3.0) and is the empirical source of this specification.

1.1 Alignment with RiC-O Converter v3.0

This mapping is consistent with the conventions of RiC-O Converter v3.0 (Sparna + AnF Lab, March 2025) — the canonical EAD 2002 / EAC-CPF → RiC-O converter. Where this spec and the Converter make different decisions, the differences are documented:

Institutions migrating existing EAD finding aids can reasonably use the Converter to bootstrap their corpus and an OpenRiC-conformant server (any conformant implementation, not just the reference) to expose the result over HTTP.

1.2 Cross-reference with RiC-AG (Application Guidelines)

This mapping is cross-referenced with RiC-AG v0.1 (ICA-EGAD Application Guidelines, October 2025). RiC-AG ships a crosswalk from the four legacy ICA standards — ISAD(G), ISAAR(CPF), ISDF, ISDIAH — to RiC-CM, which is exactly the source-standard set this mapping spec covers.

OpenRiC treats RiC-AG as the upstream authoritative reference for that crosswalk. Where this spec and RiC-AG agree on a class or property mapping, RiC-AG is canonical and OpenRiC defers. Where they diverge — intentionally or as drift — the divergence is documented:

Implementations of OpenRiC profiles SHOULD treat RiC-AG as the application-pattern reference and this spec as the deployable-API contract. The two are designed to be coherent: RiC-AG answers what to model; OpenRiC answers how to expose it over HTTP.

2. Terminology & conformance

The keywords MUST, MUST NOT, SHOULD, SHOULD NOT, MAY in this document are to be interpreted as described in RFC 2119.

An implementation is any system that accepts archival-description input in a form compatible with the source schemas and emits RiC output. A conformant implementation passes all L1 test fixtures in the conformance suite.

3. Source schemas

This specification covers mapping from the following input entity types. Named after their canonical AtoM/Qubit tables; implementations MAY use different internal storage as long as the externally-visible semantics match.

Source entity Source standard Example table
Information Object ISAD(G) information_object + information_object_i18n
Actor ISAAR(CPF) actor + actor_i18n
Repository ISDIAH repository + repository_i18n
Function ISDF function + function_i18n
Event (AtoM extension) event
Physical Object (AtoM extension) thing / storage / container

4. Normative prefixes

Implementations MUST emit JSON-LD or Turtle with these prefixes bound as shown, unless otherwise indicated by content negotiation:

@prefix rico:    <https://www.ica.org/standards/RiC/ontology#> .
@prefix openricx: <https://openric.org/ns/ext/v1#> .
@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#> .
@prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .

OpenRiC-specific viewing hints (defined in Graph Primitives) use the prefix:

@prefix openric: <https://openric.org/ns/v1#> .

5. Identity & URI scheme

Every emitted RiC entity MUST have a stable, dereferenceable @id.

The canonical form is:

{baseUri}/{entity-path}/{slug-or-id}

Where:

Example: https://archives.example.org/informationobject/AHG-A001-fonds-smuts.

A server MAY additionally mint RiC-native UUIDs (e.g. https://openric.org/id/{uuid}) for external interchange. When present, these MUST be related to the canonical identifier via owl:sameAs.


6. Class mapping

6.1 Information Object → rico:RecordSet / rico:Record / rico:RecordPart

The RiC class is selected from the ISAD(G) level of description term:

Source level RiC class
fonds rico:RecordSet
subfonds rico:RecordSet
collection rico:RecordSet
series rico:RecordSet
subseries rico:RecordSet
file rico:RecordSet
item rico:Record
part rico:RecordPart
(fallback — unknown level) rico:Record

Implementations MAY extend this table for local levels but MUST preserve the RecordSet / Record / RecordPart coarse distinction.

6.2 Actor → rico:Agent hierarchy

Selected from the ISAAR(CPF) type of entity term, extended with mechanism for software systems that perform provenance-significant activities (see §10):

Source actor type RiC class
corporate body rico:CorporateBody
person rico:Person
family rico:Family
mechanism rico:Mechanism
(fallback — unknown type) rico:Agent

rico:Mechanism is a canonical RiC-O 1.1 subclass of rico:Agent, used for software systems, devices, importers, AI services, OCR pipelines, and other automated agents whose actions on records can be attributed in provenance. ICA-EGAD examples (Florence Clavaud, RiC user group #27) include scanners and digital cameras as Mechanisms participating in digitisation Activities.

6.3 Repository → rico:CorporateBody

Repositories (ISDIAH institutions) are always emitted as rico:CorporateBody. They are distinguished from other CorporateBody instances by:

6.4 Function → openricx:Function (interim) — see canonical alternatives below

RiC-O 1.1 does not define rico:Function as a class, and ICA-EGAD guidance (Florence Clavaud, RiC user group) is that an archival/business function is best modelled in canonical RiC-O as either:

  1. A SKOS Concept in a function-classification ConceptScheme (when the function is a vocabulary term), with rico:Activity instances classified by it, OR
  2. A rico:Activity with rico:hasActivityType <…function-type IRI…> (when the function manifests as a concrete event).

OpenRiC currently exposes ISDF function records through the /functions API surface and serializes them as openricx:Function as an interim canonical class, pending: (a) a SKOS function-type vocabulary publication, and (b) an upstream proposal to ICA-EGAD if the community converges on a canonical class. Implementations claiming the Authority & Context profile MUST NOT emit rico:Function (which is not in RiC-O 1.1).

There is no canonical “performs this function” property in RiC-O 1.1. Where the source data has an Activity that is an instance of a Function, link via the SKOS classification on the Activity’s rico:hasActivityType, not via a rico:hasActivity predicate (which is not in RiC-O 1.1).

6.5 Event → rico:Activity + rico:hasActivityType

RiC-O 1.1 does not define rico:Production, rico:Accumulation, rico:CustodyEvent, rico:Transfer, or any other concrete rico:Activity subclass — only the parent class rico:Activity is canonical. Earlier OpenRiC drafts (≤ v0.36) emitted rico:Production / rico:Accumulation as concrete classes; this was a non-conformant assumption flagged by the RiC-O 1.1 audit.

The current pattern is: every event MUST be typed as rico:Activity and MUST carry a rico:hasActivityType IRI from the OpenRiC activity-type vocabulary:

Source event type RiC class rico:hasActivityType (IRI)
creation rico:Activity <https://openric.org/vocab/activity-type/production>
contribution rico:Activity <https://openric.org/vocab/activity-type/production>
accumulation rico:Activity <https://openric.org/vocab/activity-type/accumulation>
collection rico:Activity <https://openric.org/vocab/activity-type/accumulation>
custody rico:Activity <https://openric.org/vocab/activity-type/custody>
transfer rico:Activity <https://openric.org/vocab/activity-type/transfer>
publication rico:Activity <https://openric.org/vocab/activity-type/publication>
reproduction rico:Activity <https://openric.org/vocab/activity-type/reproduction>
(fallback — unknown event type) rico:Activity (none — preserve in openric:localType)

The activity-type IRIs MAY be modelled as a SKOS concept scheme in a future release; today they are dereferenceable identifiers only. Implementations MAY mint local activity-type IRIs (e.g. <https://archives.example.org/vocab/activity-type/migration>) for site-specific event kinds, but MUST also emit openric:localType so consumers without the local vocabulary can still dispatch.

6.6 Physical Object → rico:Thing

Boxes, containers, shelves, cabinets, vaults, and equipment all map to rico:Thing. The local sub-type is preserved via openric:localType:

Source thing type RiC class openric:localType
box rico:Thing "box"
container rico:Thing "container"
shelf_unit rico:Thing "shelf_unit"
cabinet rico:Thing "cabinet"
vault rico:Thing "vault"
equipment rico:Thing "equipment"

7. Property mapping

7.1 Information Object (ISAD(G))

ISAD(G) element RiC predicate Notes
3.1.1 Reference code rico:identifier  
3.1.2 Title rico:title Language-tagged per culture
3.1.3 Date(s) openricx:hasDateRangeSetopenricx:DateRange See §7.2
3.1.4 Level of description (drives class, see §6.1) Not emitted as a separate property
3.1.5 Extent and medium rico:hasExtentrico:Extent with rico:hasExtentType  
3.2.1 Name of creator(s) rico:hasCreatorrico:Agent  
3.2.2 Administrative / biographical history rico:history On the Agent, not the Record
3.2.3 Archival history rico:history on the Record Free-text
3.2.4 Immediate source of acquisition rico:hasOrganicProvenancerico:Agent  
3.3.1 Scope and content openricx:description  
3.3.2 Appraisal, destruction, scheduling openricx:hasAppraisalInformation  
3.3.3 Accruals openric:accrualsNote No direct RiC-O 1.1 predicate
3.3.4 System of arrangement openricx:arrangement  
3.4.1 Conditions governing access rico:conditionsOfAccess  
3.4.2 Conditions governing reproduction rico:conditionsOfUse  
3.4.3 Language/scripts of material rico:hasOrHadLanguage → ISO 639-3 code  
3.4.4 Physical characteristics rico:hasCarrierType  
3.4.5 Finding aids rico:isOrWasDescribedBy → finding-aid Record (which carries rico:hasDocumentaryFormType <https://www.ica.org/standards/RiC/ontology#FindingAid>) Canonical RiC-O 1.1 pattern per Florence Clavaud (RiC user group) — FindingAid is a DocumentaryFormType individual, not a separate property
3.5.1 Existence and location of originals rico:hasOrHadLocation  
3.5.2 Existence and location of copies rico:hasOrHadInstantiation  
3.5.3 Related units of description rico:isRelatedTo  
3.5.4 Publication note openricx:publicationInformation  
3.6.1 Note rdfs:comment  
3.7.1 Archivist’s note openricx:descriptiveNote  
3.7.2 Rules or conventions dcterms:conformsTorico:Rule Links to ISAD/RAD/DACS record
3.7.3 Dates of description openricx:hasDateRangeSet (descriptive) Distinct from record dates
(Subjects / access points) rico:hasOrHadSubject  
(Parent) rico:isOrWasIncludedIn Inverse: rico:includesOrIncluded
(Children) rico:includesOrIncluded  
(Repository) rico:hasOrHadHolderrico:CorporateBody  

7.2 Date ranges

Dates are emitted as openricx:DateRange objects:

{
  "@type": "openricx:DateRange",
  "rico:hasBeginningDate": { "@value": "1899-10-11", "@type": "xsd:date" },
  "rico:endDate":   { "@value": "1902-05-31", "@type": "xsd:date" },
  "rico:normalizedDateValue": "1899-10-11/1902-05-31",
  "rico:hasDateType": "existence"
}

rico:hasDateType values: existence, creation, accumulation, descriptive, custody.

7.3 Actor (ISAAR(CPF))

ISAAR(CPF) element RiC predicate
5.1.2 Authorised form of name rico:name, also openricx:normalizedForm
5.1.3 Parallel forms of name openricx:alternativeForm
5.1.4 Standardised forms (other rules) openricx:alternativeForm
5.1.5 Other forms of name openricx:otherName
5.1.6 Identifiers rico:identifier
5.2.1 Dates of existence openricx:hasDateRangeSet with dateType=existence
5.2.2 History rico:history
5.2.3 Places rico:isAssociatedWithPlacerico:Place
5.2.4 Legal status rico:hasOrHadLegalStatus
5.2.5 Functions, occupations, activities rico:performsOrPerformedopenricx:Function (interim, see §6.4); openricx:hasOccupation → SKOS Concept of rico:OccupationType (RiC-O 1.1 has no direct Agent → OccupationType linking property — Aaron+Florence in RiC user group #20 endorse SKOS individuals of OccupationType; canonical RDF expansion: an Activity typed by an OccupationType IRI per §6.5)
5.2.6 Mandates / sources of authority rico:authorizingMandaterico:Mandate
5.2.7 Internal structures / genealogy openricx:hasInternalStructure
5.2.8 General context openricx:generalContext
5.3.x Relationships isOrWas...Of property family (e.g. rico:isOrWasOwnerOf, rico:isOrWasHolderOf) — see §8

7.4 Repository (ISDIAH)

ISDIAH element RiC predicate
5.1.2 Authorized form of name rico:name
5.1.3 Parallel / other forms openricx:alternativeForm, openricx:otherName
5.1.4 Institution type openric:institutionType
5.2.1 Location and address rico:isAssociatedWithPlacerico:Place with openricx:streetAddress
5.2.2 Telephone, fax, email openricx:contactopenricx:ContactPoint
5.3.1 History of the institution rico:history
5.3.2 Geographical and cultural context openricx:generalContext
5.3.3 Mandates / sources of authority rico:authorizingMandate
5.3.4 Administrative structure openricx:hasInternalStructure
5.3.5 Records management policies openricx:hasOrHadPolicy
5.3.6 Building(s) rico:hasOrHadLocation
5.3.7 Archival and other holdings rico:isOrWasHolderOfrico:RecordSet / rico:Record
5.3.8 Finding aids rico:isOrWasDescribedBy → finding-aid Record with rico:hasDocumentaryFormType <…#FindingAid>
5.4.1 Opening times openric:openingHours
5.4.2 Conditions and requirements for access rico:conditionsOfAccess
5.4.3 Accessibility openric:accessibility

8. Relationships

Relationships between actors (ISAAR(CPF) 5.3) and between records (ISAD(G) 3.5.3) are emitted as properties of the source entity pointing at the target. Where RiC-O has a directed predicate, the source is the subject and the target is the object.

The commonest ISAAR relationships map to:

ISAAR relationship RiC predicate
Hierarchical: parent body rico:isOrWasSubordinateTo
Hierarchical: subordinate body rico:hasOrHadSubordinate
Family: member of family rico:isOrWasMemberOf
Associative: successor of rico:followsInTime
Associative: predecessor of rico:precedesInTime
Associative: related to rico:isRelatedTo
Temporal: controlled by (during period) rico:hasOrHadController (Agent → Agent; reify as rico:AgentControlRelation with date-scoping when needed)

Each relation MAY carry a rico:Relation reified object when date-scoping, certainty, or provenance are required:

{
  "@type": "rico:FamilyRelation",
  "rico:relationHasSource": "…/actor/smuts-jc",
  "rico:relationHasTarget": "…/actor/smuts-family",
  "openricx:hasDateRangeSet": { "@type": "openricx:DateRange", "rico:hasBeginningDate": "1870-05-24" },
  "rico:relationCertainty": "asserted"
}

9. Access, security, and privacy extensions

RiC-O 1.1 does not define AccessRestriction or SecurityClassification as classes, and does not define hasAccessRestriction / hasAccessRule / hasSecurityClassification as properties. The canonical pattern is:

OpenRiC rule-type IRIs (subset — a SKOS ConceptScheme will be published at <https://openric.org/vocab/rule-type/>):

IRI Meaning
<https://openric.org/vocab/rule-type/access-restriction> Scoped restriction — time, role, purpose
<https://openric.org/vocab/rule-type/security-classification> Classification code (e.g. “Confidential”, “Restricted”)
<https://openric.org/vocab/rule-type/access-rule> General access governance

Privacy / personal-data flag remains an OpenRiC extension property because RiC-O 1.1 does not yet model it:

Property Domain Range Meaning
openricx:containsPersonalData rico:Record / rico:RecordSet xsd:boolean True if the record is known to contain personally identifiable information

Example — a record regulated by an access-restriction Rule:

<.../record/abc> rico:isOrWasRegulatedBy <.../rule/popia-2026> .
<.../rule/popia-2026> a rico:Rule ;
    rico:title "POPIA section 14 — personal data" ;
    rico:hasOrHadRuleType <https://openric.org/vocab/rule-type/access-restriction> .

Jurisdictional compliance regimes (POPIA, GDPR, CDPA, IPSAS, GRAP 103, PAIA, NAZ, NMMZ …) are out of scope for OpenRiC. They are expressed by pluggable per-jurisdiction layers on top of these base properties.


10. Systems, APIs, and Mechanisms

OpenRiC distinguishes between three layers that are sometimes conflated:

Layer Examples RiC treatment
API surface (HTTP route) /records, /agents, /repositories, /functions Not a RiC-CM entity. Developer-facing access point.
OpenRiC application concept “Repository”, “Function”, “Importer” Useful for archivists / UI labels; mapped to canonical RiC entities below.
Canonical RiC-CM/RiC-O entity rico:Record, rico:Agent, rico:CorporateBody, rico:Activity, rico:Mechanism The semantic identity in the graph.

API routes such as /records, /agents, /repositories, and /functions are convenience surfaces. They do not, by themselves, define new RiC-CM classes. Where an API surface corresponds directly to a RiC-CM entity, OpenRiC serializes the resource using the canonical RiC-O class. Where a route exists for archival usability (e.g. /repositories, /functions), the canonical graph representation maps the object to the closest RiC-CM/RiC-O construct (CorporateBody for repositories per §6.3; openricx:Function interim for functions per §6.4).

10.1 Software systems are rico:Mechanism

rico:Mechanism is a canonical RiC-O 1.1 subclass of rico:Agent. It is the correct class for any software system, device, service, or automated process that performs provenance-significant activities against records. ICA-EGAD direct guidance (Florence Clavaud, RiC user group thread #27) gives scanners and digital cameras as canonical examples; the same pattern extends to:

Thing RiC class
Importer (e.g. EAD-to-RiC converter) rico:Mechanism
OCR / handwriting-recognition pipeline rico:Mechanism
AI description / NER / summarisation model rico:Mechanism
Migration script rico:Mechanism
Validation engine rico:Mechanism
Crawler / harvester rico:Mechanism
API platform / service (when itself the actor of an event) rico:Mechanism

The actions performed by these mechanisms are modelled as rico:Activity instances, linked back via rico:isOrWasPerformedBy (or its inverse rico:performsOrPerformed on the Mechanism), and to the affected records via rico:resultsOrResultedIn / rico:affectsOrAffected.

10.2 Example — OpenRiC importer converting EAD to RiC-O

@prefix rico:     <https://www.ica.org/standards/RiC/ontology#> .
@prefix openric:  <https://openric.org/id/> .
@prefix openricx: <https://openric.org/ns/ext/v1#> .

openric:mechanism/openric-importer a rico:Mechanism ;
    rico:name "OpenRiC EAD-to-RiC importer" ;
    openricx:technicalCharacteristics
        "Python/Laravel/Fuseki conversion service" .

openric:activity/conversion-2026-04-25 a rico:Activity ;
    rico:hasActivityType <https://openric.org/vocab/activity-type/transfer> ;
    rico:name "EAD to RiC-O conversion" ;
    rico:isOrWasPerformedBy openric:mechanism/openric-importer ;
    rico:resultsOrResultedIn openric:record/imported-graph-001 ;
    rico:isAssociatedWithDate [
        a openricx:DateRange ;
        rico:beginningDate "2026-04-25T08:00:00Z"^^xsd:dateTime
    ] .

This pattern keeps the OpenRiC HTTP/API layer cleanly separated from the canonical archival graph: the /import API endpoint is not a RiC entity, but the importer that the endpoint dispatches to is a rico:Mechanism whose conversions can be attributed in provenance.


11. Canonical example — fonds with subordinate series

Input (abbreviated AtoM-shape JSON)

{
  "informationObject": {
    "identifier": "AHG-A001",
    "title": "Papers of Jan Christian Smuts",
    "level_of_description": "fonds",
    "scope_and_content": "Correspondence, diaries, speeches, 1886–1950.",
    "dates": [{ "start_date": "1886-01-01", "end_date": "1950-09-11" }],
    "extent_and_medium": "3.2 linear metres, 18 boxes",
    "language": ["eng", "afr"],
    "repository_id": 14,
    "creator_id": 201,
    "children": [
      { "identifier": "AHG-A001-01", "level_of_description": "series",
        "title": "Correspondence" }
    ]
  }
}

Output (RiC-O JSON-LD)

{
  "@context": {
    "rico": "https://www.ica.org/standards/RiC/ontology#",
    "xsd":  "http://www.w3.org/2001/XMLSchema#"
  },
  "@id":   "https://archives.example.org/informationobject/AHG-A001",
  "@type": "rico:RecordSet",
  "rico:identifier": "AHG-A001",
  "rico:title": { "@value": "Papers of Jan Christian Smuts", "@language": "en" },
  "openricx:description": "Correspondence, diaries, speeches, 1886–1950.",
  "openricx:hasDateRangeSet": {
    "@type": "openricx:DateRange",
    "rico:hasBeginningDate": { "@value": "1886-01-01", "@type": "xsd:date" },
    "rico:endDate":   { "@value": "1950-09-11", "@type": "xsd:date" },
    "rico:hasDateType": "existence"
  },
  "rico:hasExtent": {
    "@type": "rico:Extent",
    "rico:hasExtentType": "3.2 linear metres, 18 boxes"
  },
  "rico:hasOrHadLanguage": [
    { "@type": "rico:Language", "openricx:languageCode": "eng" },
    { "@type": "rico:Language", "openricx:languageCode": "afr" }
  ],
  "rico:hasOrHadHolder": {
    "@id": "https://archives.example.org/repository/wits-historical-papers",
    "@type": "rico:CorporateBody",
    "rico:name": "Wits Historical Papers Research Archive"
  },
  "rico:hasCreator": {
    "@id": "https://archives.example.org/actor/smuts-jc",
    "@type": "rico:Person",
    "rico:name": "Smuts, Jan Christian"
  },
  "rico:includesOrIncluded": [
    {
      "@id": "https://archives.example.org/informationobject/AHG-A001-01",
      "@type": "rico:RecordSet",
      "rico:identifier": "AHG-A001-01",
      "rico:title": "Correspondence"
    }
  ]
}

11. Open issues


12. Change log

Version Date Notes
0.38.1 2026-05-25 Add §1.2 cross-reference with RiC-AG v0.1 — treat RiC-AG as upstream-authoritative for the legacy-ICA-standards-to-RiC-CM crosswalk; document intentional openricx: divergences as upstream-proposal candidates; flag the forthcoming EAC-CPF → RiC-O 1.1 mapping for cross-reference when it lands.
0.37.0 2026-04-25 RiC-O 1.1 namespace remediation complete (Phases A–E); all rico:* terms emitted as data are canonical 1.1; per-term audit at /audit/ric-o-1.1-audit.html.
0.1.0-draft 2026-04-17 Initial draft extracted from Heratio ahg-ric reference implementation.

Back to OpenRiC