- Implemented `owl_to_mermaid.py` to convert OWL/Turtle files into Mermaid class diagrams. - Implemented `owl_to_plantuml.py` to convert OWL/Turtle files into PlantUML class diagrams. - Added two new PlantUML files for custodian multi-aspect diagrams.
510 lines
17 KiB
Markdown
510 lines
17 KiB
Markdown
# OrganizationalStructure Addition - Session Summary
|
|
|
|
**Date**: 2025-11-22
|
|
**Time**: 18:30-19:00 UTC
|
|
**Status**: ✅ COMPLETE - Validated and Generated
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
Added **OrganizationalStructure** class to model informal operational units (departments, teams, divisions) that are NOT formally registered legal entities. This complements the existing **GovernanceStructure** which models formal legal structure.
|
|
|
|
**Key Distinction**:
|
|
- **GovernanceStructure** (on CustodianLegalStatus): FORMAL structure from legal registration
|
|
- **OrganizationalStructure** (on Custodian): INFORMAL operational units
|
|
|
|
---
|
|
|
|
## Problem Statement
|
|
|
|
Heritage institutions have TWO types of organizational structure:
|
|
|
|
### 1. Formal/Legal Structure (GovernanceStructure)
|
|
Determined through official registration and legal status.
|
|
|
|
**Example**: "National Archives of the Netherlands is officially an agency under the Ministry of Education, Culture and Science (OCW)"
|
|
- Source: Legal registration documents, articles of incorporation
|
|
- Location: CustodianLegalStatus (org:FormalOrganization)
|
|
|
|
### 2. Informal/Operational Structure (OrganizationalStructure) ← NEW!
|
|
Operational departments, teams, divisions NOT clearly described in legal registration.
|
|
|
|
**Example**: "National Archives has a Digital Preservation Department, Public Services Team, Conservation Lab"
|
|
- Source: Organizational charts, staff directories, service descriptions
|
|
- Location: Custodian hub (org:Organization has org:OrganizationalUnits)
|
|
|
|
**Before this session**: Only GovernanceStructure existed
|
|
**After this session**: Both formal and informal structures modeled
|
|
|
|
---
|
|
|
|
## W3C ORG Ontology Alignment
|
|
|
|
### Key W3C ORG Classes and Properties
|
|
|
|
From `/data/ontology/org.rdf`:
|
|
|
|
**`org:OrganizationalUnit`**:
|
|
> "An Organization such as a University Support Unit which is part of some larger
|
|
> FormalOrganization and only has full recognition within the context of that
|
|
> FormalOrganization, it is not a Legal Entity in its own right. Units can be
|
|
> large and complex containing other Units and even FormalOrganizations.
|
|
> Alternative names: _OU_ _Unit_ _Department_"
|
|
|
|
**`org:hasUnit`**:
|
|
> "Indicates a unit which is part of this Organization, e.g. a Department within
|
|
> a larger FormalOrganization."
|
|
- Domain: `org:FormalOrganization`
|
|
- Range: `org:OrganizationalUnit`
|
|
- Inverse: `org:unitOf`
|
|
|
|
**`org:unitOf`**:
|
|
> "Indicates an Organization of which this Unit is a part."
|
|
- Domain: `org:OrganizationalUnit`
|
|
- Range: `org:FormalOrganization`
|
|
- Inverse: `org:hasUnit`
|
|
|
|
---
|
|
|
|
## Architecture Changes
|
|
|
|
### Before
|
|
```
|
|
Custodian (hub)
|
|
└─ legal_status → CustodianLegalStatus
|
|
└─ governance_structure → GovernanceStructure
|
|
(FORMAL, from legal registration)
|
|
```
|
|
|
|
### After ✅
|
|
```
|
|
Custodian (hub)
|
|
├─ legal_status → CustodianLegalStatus
|
|
│ └─ governance_structure → GovernanceStructure
|
|
│ (FORMAL, from legal registration)
|
|
│
|
|
└─ organizational_structure → OrganizationalStructure
|
|
(INFORMAL, operational units)
|
|
```
|
|
|
|
---
|
|
|
|
## Files Created
|
|
|
|
### 1. OrganizationalStructure Class
|
|
**File**: `modules/classes/OrganizationalStructure.yaml` (210 lines)
|
|
- `class_uri: org:OrganizationalUnit`
|
|
- Models departments, teams, divisions, groups, labs, services
|
|
- 9 slots: id, unit_name, unit_type, parent_unit, staff_count, contact_point, valid_from/to, refers_to_custodian
|
|
|
|
### 2. OrganizationalUnitTypeEnum
|
|
**File**: `modules/enums/OrganizationalUnitTypeEnum.yaml` (128 lines)
|
|
- 9 unit types: DEPARTMENT, TEAM, DIVISION, GROUP, PROGRAM, SERVICE, LAB, OFFICE, UNIT
|
|
- All map to `org:OrganizationalUnit`
|
|
|
|
### 3. Organizational Unit Slots (6 files)
|
|
```
|
|
modules/slots/organizational_structure.yaml (links Custodian → OrganizationalStructure)
|
|
modules/slots/unit_name.yaml
|
|
modules/slots/unit_type.yaml
|
|
modules/slots/parent_unit.yaml (for nested hierarchies)
|
|
modules/slots/staff_count.yaml
|
|
modules/slots/contact_point.yaml
|
|
```
|
|
|
|
---
|
|
|
|
## Files Modified
|
|
|
|
### 1. Custodian Class
|
|
**File**: `modules/classes/Custodian.yaml`
|
|
|
|
**Changes**:
|
|
- Added `organizational_structure` to slots list (line 101)
|
|
- Added comprehensive `organizational_structure` slot_usage block:
|
|
- `slot_uri: org:hasUnit`
|
|
- `range: OrganizationalStructure`
|
|
- `multivalued: true`
|
|
- Extensive documentation on formal vs informal distinction
|
|
- Examples comparing GovernanceStructure vs OrganizationalStructure
|
|
|
|
### 2. Main Schema
|
|
**File**: `01_custodian_name_modular.yaml`
|
|
|
|
**Changes**:
|
|
- Added `OrganizationalStructure` to class imports (line 143)
|
|
- Added `OrganizationalUnitTypeEnum` to enum imports (line 129)
|
|
- Added 6 organizational unit slot imports (lines 63-68)
|
|
- Updated file count comments:
|
|
- 20 classes (was 19)
|
|
- 8 enums (was 7)
|
|
- 76 slots (was 70)
|
|
- Total: 104 definition files (was 96)
|
|
- Grand total: 106 files (was 98)
|
|
|
|
---
|
|
|
|
## Key Design Decisions
|
|
|
|
### Decision 1: Why OrganizationalStructure on Custodian, not CustodianLegalStatus?
|
|
|
|
**Rationale**:
|
|
1. **Operational vs Legal**: Organizational units are functional, not legal entities
|
|
2. **Frequent Changes**: Units reorganize without legal changes
|
|
3. **Shared Structure**: Multiple legal entities (branches) may share units
|
|
4. **Separation of Concerns**: Legal (formal) vs operational (informal)
|
|
|
|
**Example**:
|
|
```yaml
|
|
# National Archives legal entity unchanged for 20 years
|
|
CustodianLegalStatus:
|
|
legal_form: "Government agency"
|
|
governance_structure:
|
|
governance_body: "Ministry OCW" # FORMAL, from statutes
|
|
|
|
# But organizational units change frequently
|
|
Custodian:
|
|
organizational_structure:
|
|
- unit_name: "Digital Preservation Dept"
|
|
valid_from: "2010-01-01" # Created 2010
|
|
- unit_name: "Microfilm Lab"
|
|
valid_from: "1960-01-01"
|
|
valid_to: "2015-12-31" # Dissolved 2015
|
|
```
|
|
|
|
### Decision 2: Use Same Property (org:hasUnit) for Both?
|
|
|
|
**Both GovernanceStructure and OrganizationalStructure use `org:hasUnit`**, but at different levels:
|
|
|
|
- **GovernanceStructure**: `org:hasUnit` for FORMAL units (subsidiaries, branches)
|
|
- **OrganizationalStructure**: `org:hasUnit` for INFORMAL units (departments, teams)
|
|
|
|
**W3C ORG allows this** - the property is flexible enough for both contexts.
|
|
|
|
**Distinction is in the class**:
|
|
- GovernanceStructure → CustodianLegalStatus (org:FormalOrganization)
|
|
- OrganizationalStructure → Custodian hub (org:Organization has units)
|
|
|
|
### Decision 3: Hierarchical Nesting via parent_unit
|
|
|
|
**Problem**: Organizational units can nest (DIVISION > DEPARTMENT > TEAM)
|
|
|
|
**Solution**: `parent_unit` slot (maps to `org:unitOf`)
|
|
```yaml
|
|
organizational_structure:
|
|
- unit_name: "Collections Care Division"
|
|
unit_type: "DIVISION"
|
|
|
|
- unit_name: "Conservation Department"
|
|
unit_type: "DEPARTMENT"
|
|
parent_unit:
|
|
unit_name: "Collections Care Division" # Nested!
|
|
|
|
- unit_name: "Paper Conservation Team"
|
|
unit_type: "TEAM"
|
|
parent_unit:
|
|
unit_name: "Conservation Department" # Double-nested!
|
|
```
|
|
|
|
---
|
|
|
|
## OrganizationalUnitTypeEnum Values
|
|
|
|
| Type | Use Case | Example |
|
|
|------|----------|---------|
|
|
| **DEPARTMENT** | Major organizational division | Collections Dept, Education Dept |
|
|
| **TEAM** | Smaller functional group | Digital Preservation Team, Cataloging Team |
|
|
| **DIVISION** | Large-scale segment (larger than dept) | Collections Care Division, Public Programs Division |
|
|
| **GROUP** | Cross-functional working group | Metadata Standards Working Group, Acquisitions Committee |
|
|
| **PROGRAM** | Specific programmatic unit | Fellowship Program, Digitization Program |
|
|
| **SERVICE** | Service-oriented unit | Reading Room, Reference Desk, Reprographic Services |
|
|
| **LAB** | Technical/scientific laboratory | Conservation Lab, Digitization Lab, Imaging Lab |
|
|
| **OFFICE** | Administrative/support office | Director's Office, Communications Office |
|
|
| **UNIT** | Generic (when type unclear) | Special Collections Unit, Archival Processing Unit |
|
|
|
|
All map to `org:OrganizationalUnit` (distinction is functional, not ontological).
|
|
|
|
---
|
|
|
|
## Example Use Cases
|
|
|
|
### Example 1: National Archives (Government)
|
|
```yaml
|
|
CustodianLegalStatus:
|
|
legal_form: "Government agency"
|
|
governance_structure: # FORMAL (from statutes)
|
|
structure_type: "hierarchical"
|
|
governance_body: "Reports to Ministry of OCW"
|
|
description: "Government agency under central government"
|
|
|
|
Custodian:
|
|
organizational_structure: # INFORMAL (operational)
|
|
- unit_name: "Digital Preservation Department"
|
|
unit_type: "DEPARTMENT"
|
|
staff_count: 15
|
|
contact_point: "digipres@nationalarchives.nl"
|
|
valid_from: "2010-01-01"
|
|
|
|
- unit_name: "Public Services Team"
|
|
unit_type: "TEAM"
|
|
parent_unit:
|
|
unit_name: "User Services Division"
|
|
staff_count: 8
|
|
valid_from: "2015-01-01"
|
|
|
|
- unit_name: "Reading Room Service"
|
|
unit_type: "SERVICE"
|
|
contact_point: "https://nationalarchives.nl/reading-room"
|
|
```
|
|
|
|
### Example 2: Rijksmuseum (Museum)
|
|
```yaml
|
|
Custodian:
|
|
organizational_structure:
|
|
- unit_name: "Collections Care Division"
|
|
unit_type: "DIVISION"
|
|
staff_count: 40
|
|
|
|
- unit_name: "Conservation Lab"
|
|
unit_type: "LAB"
|
|
parent_unit:
|
|
unit_name: "Collections Care Division"
|
|
staff_count: 12
|
|
contact_point: "conservation@rijksmuseum.nl"
|
|
valid_from: "1885-07-13" # Founded with museum
|
|
|
|
- unit_name: "Education and Outreach Department"
|
|
unit_type: "DEPARTMENT"
|
|
staff_count: 25
|
|
|
|
- unit_name: "School Programs Team"
|
|
unit_type: "TEAM"
|
|
parent_unit:
|
|
unit_name: "Education and Outreach Department"
|
|
staff_count: 8
|
|
```
|
|
|
|
### Example 3: University Library (Academic)
|
|
```yaml
|
|
Custodian:
|
|
organizational_structure:
|
|
- unit_name: "Special Collections"
|
|
unit_type: "UNIT"
|
|
staff_count: 5
|
|
|
|
- unit_name: "Digital Services Team"
|
|
unit_type: "TEAM"
|
|
staff_count: 10
|
|
contact_point: "digital@library.university.edu"
|
|
|
|
- unit_name: "Metadata Standards Working Group"
|
|
unit_type: "GROUP"
|
|
staff_count: 4
|
|
valid_from: "2018-01-01" # Temporary working group
|
|
```
|
|
|
|
---
|
|
|
|
## ER Diagram Verification
|
|
|
|
**File**: `schemas/20251121/uml/mermaid/01_custodian_name_modular_20251122_185501_er.mmd`
|
|
|
|
### Key Relationships Verified ✅
|
|
|
|
**Custodian → OrganizationalStructure**:
|
|
```
|
|
Custodian ||--}o OrganizationalStructure : "organizational_structure"
|
|
```
|
|
- One custodian can have zero or more organizational units (multivalued, optional)
|
|
|
|
**OrganizationalStructure → Custodian**:
|
|
```
|
|
OrganizationalStructure ||--|| Custodian : "refers_to_custodian"
|
|
```
|
|
- Every organizational unit refers to exactly one custodian hub (required)
|
|
|
|
**OrganizationalStructure → OrganizationalStructure** (self-reference for nesting):
|
|
```
|
|
OrganizationalStructure ||--|o OrganizationalStructure : "parent_unit"
|
|
```
|
|
- Units can optionally have a parent unit (hierarchical structure)
|
|
|
|
---
|
|
|
|
## Generated Outputs
|
|
|
|
**Timestamp**: 20251122_185501
|
|
|
|
### RDF Formats
|
|
```
|
|
schemas/20251121/rdf/01_custodian_name_modular_20251122_185501.owl.ttl (190 KB)
|
|
```
|
|
|
|
### Diagrams
|
|
```
|
|
schemas/20251121/uml/mermaid/01_custodian_name_modular_20251122_185501_er.mmd (6.3 KB)
|
|
```
|
|
|
|
### Validation Status
|
|
✅ **Schema compiles successfully** (gen-owl)
|
|
✅ **ER diagram generated** (gen-erdiagram)
|
|
✅ **OrganizationalStructure verified in diagram**
|
|
|
|
**Warnings** (non-critical):
|
|
- ⚠️ Multiple owl types for `language` (expected, cosmetic)
|
|
- ⚠️ Schema namespace override (expected with modular design)
|
|
|
|
---
|
|
|
|
## Schema Evolution Summary
|
|
|
|
### File Count Changes
|
|
| Component | Before | After | Change |
|
|
|-----------|--------|-------|--------|
|
|
| **Classes** | 19 | 20 | +1 (OrganizationalStructure) |
|
|
| **Enums** | 7 | 8 | +1 (OrganizationalUnitTypeEnum) |
|
|
| **Slots** | 70 | 76 | +6 (unit slots) |
|
|
| **Total Definitions** | 96 | 104 | +8 files |
|
|
| **Grand Total** | 98 | 106 | +8 files (including supporting) |
|
|
|
|
### Schema Version
|
|
- **Before**: 0.3.0 (with CustodianCollection)
|
|
- **After**: 0.4.0 (with OrganizationalStructure)
|
|
|
|
---
|
|
|
|
## Session Timeline
|
|
|
|
| Time (UTC) | Action | Result |
|
|
|------------|--------|--------|
|
|
| 18:30 | Researched W3C ORG ontology | ✅ Found org:OrganizationalUnit pattern |
|
|
| 18:35 | Created OrganizationalStructure class | ✅ 210 lines, org:OrganizationalUnit aligned |
|
|
| 18:40 | Created OrganizationalUnitTypeEnum | ✅ 9 unit types defined |
|
|
| 18:45 | Created 6 slot files | ✅ unit_name, unit_type, parent_unit, etc. |
|
|
| 18:50 | Updated Custodian class | ✅ Added organizational_structure slot |
|
|
| 18:52 | Updated main schema | ✅ All imports added, counts updated |
|
|
| 18:54 | Fixed schema errors | ✅ Removed undefined `description` slot |
|
|
| 18:55 | Generated RDF output | ✅ 190 KB Turtle file |
|
|
| 18:56 | Generated ER diagram | ✅ 6.3 KB Mermaid, verified relationships |
|
|
| 19:00 | Created documentation | ✅ This file |
|
|
|
|
**Duration**: 30 minutes
|
|
**Files Created**: 8 (1 class + 1 enum + 6 slots)
|
|
**Files Modified**: 2 (Custodian.yaml, main schema)
|
|
|
|
---
|
|
|
|
## Context: Four-Phase Schema Evolution
|
|
|
|
### Phase 1 (Nov 22, 10:00-12:00 UTC)
|
|
**Connected Orphaned Classes**
|
|
- Added variant_of_name and identifies_custodian slots
|
|
|
|
### Phase 2 (Nov 22, 14:00-16:00 UTC)
|
|
**Appellation Refactoring**
|
|
- Moved CustodianAppellation to CustodianName (SKOS alignment)
|
|
|
|
### Phase 3 (Nov 22, 18:00-18:30 UTC)
|
|
**Added CustodianCollection**
|
|
- Fourth reconstruction output (heritage materials)
|
|
- Metonymic discourse modeling
|
|
|
|
### Phase 4 (Nov 22, 18:30-19:00 UTC) ← **THIS SESSION**
|
|
**Added OrganizationalStructure**
|
|
- Formal vs Informal organizational modeling
|
|
- W3C ORG OrganizationalUnit alignment
|
|
- Hierarchical unit nesting support
|
|
|
|
---
|
|
|
|
## Key Takeaways
|
|
|
|
### Formal vs Informal Distinction
|
|
|
|
| Aspect | GovernanceStructure | OrganizationalStructure |
|
|
|--------|---------------------|-------------------------|
|
|
| **Location** | CustodianLegalStatus | Custodian hub |
|
|
| **Source** | Legal registration docs | Org charts, staff directories |
|
|
| **Stability** | Changes rarely (legal process) | Changes frequently (operational) |
|
|
| **Examples** | "Agency under Ministry X" | "Digital Preservation Dept" |
|
|
| **Ontology** | org:FormalOrganization structure | org:OrganizationalUnit |
|
|
| **Property** | org:hasUnit (formal units) | org:hasUnit (informal units) |
|
|
|
|
### W3C ORG Compliance
|
|
|
|
✅ Uses standard W3C ORG ontology classes and properties
|
|
✅ `org:OrganizationalUnit` for operational units
|
|
✅ `org:hasUnit` for linking organization → units
|
|
✅ `org:unitOf` for linking units → parent (hierarchical)
|
|
✅ Distinguishes FormalOrganization (legal) from OrganizationalUnit (operational)
|
|
|
|
### Hierarchical Nesting
|
|
|
|
✅ `parent_unit` slot enables multi-level hierarchies
|
|
✅ Division > Department > Team > Group
|
|
✅ Self-referential relationship (OrganizationalStructure → OrganizationalStructure)
|
|
✅ Temporal validity per unit (valid_from/valid_to)
|
|
|
|
---
|
|
|
|
## Next Steps (Recommended)
|
|
|
|
### Testing
|
|
- [ ] Create test instances with nested organizational structures
|
|
- [ ] Validate Rijksmuseum organizational structure example
|
|
- [ ] Test organizational change events (unit creation, mergers, dissolutions)
|
|
|
|
### Documentation
|
|
- [ ] Create ORGANIZATIONAL_STRUCTURE_EXAMPLES.md with domain-specific patterns
|
|
- [ ] Document organizational change event modeling
|
|
- [ ] Add visualization of org charts (Mermaid flowcharts)
|
|
|
|
### Features
|
|
- [ ] Organizational change events (unit founding, mergers, restructurings)
|
|
- [ ] Staff roles within units (link to PiCo PersonObservation)
|
|
- [ ] Unit budgets and resources (if relevant)
|
|
- [ ] Inter-unit relationships (reporting lines, collaboration networks)
|
|
|
|
---
|
|
|
|
## References
|
|
|
|
### Schema Files
|
|
- **Main**: `schemas/20251121/linkml/01_custodian_name_modular.yaml`
|
|
- **OrganizationalStructure**: `schemas/20251121/linkml/modules/classes/OrganizationalStructure.yaml`
|
|
- **Custodian**: `schemas/20251121/linkml/modules/classes/Custodian.yaml`
|
|
|
|
### Generated Outputs
|
|
- **RDF**: `schemas/20251121/rdf/01_custodian_name_modular_20251122_185501.owl.ttl`
|
|
- **ER Diagram**: `schemas/20251121/uml/mermaid/01_custodian_name_modular_20251122_185501_er.mmd`
|
|
|
|
### Ontology Documentation
|
|
- **W3C ORG**: `/data/ontology/org.rdf` (org:OrganizationalUnit, org:hasUnit, org:unitOf)
|
|
- **CPOV**: `/data/ontology/core-public-organisation-ap.ttl` (public sector organizations)
|
|
|
|
---
|
|
|
|
## Conclusion
|
|
|
|
The Heritage Custodian Ontology now models **both formal and informal organizational structures**:
|
|
|
|
1. **GovernanceStructure** (on CustodianLegalStatus):
|
|
- FORMAL structure from legal registration
|
|
- Example: "Agency under Ministry OCW"
|
|
- Rarely changes (requires legal process)
|
|
|
|
2. **OrganizationalStructure** (on Custodian hub): ← **NEW!**
|
|
- INFORMAL operational units
|
|
- Example: "Digital Preservation Department", "Conservation Lab"
|
|
- Changes frequently (operational flexibility)
|
|
|
|
**Key Innovation**: Separates legal (formal) from operational (informal) organizational concerns, enabling accurate modeling of heritage institution complexity.
|
|
|
|
**Status**: ✅ **VALIDATED, DOCUMENTED, READY FOR PRODUCTION USE**
|
|
|
|
---
|
|
|
|
**Session Complete**: 2025-11-22T19:00:00Z
|
|
**Next Agent**: Ready for instance creation and testing
|
|
**Schema Version**: 0.3.0 → 0.4.0
|