Compare commits

...

24 commits

Author SHA1 Message Date
kempersc
1f7f3c6a4d Refactor ontology schema: Remove obsolete slot 'analyzes_or_analyzed', add new slots for 'accept', 'affect', 'aggregate_from', 'allocate', 'allow', and 'analyze'; introduce AttestationConfidenceEnum for lexical attestations; migrate annotations to structured slots; enhance documentation for clarity and usability.
All checks were successful
Deploy Frontend / build-and-deploy (push) Successful in 2m40s
2026-02-02 17:28:22 +01:00
kempersc
e6b15c27b3 Update generated timestamp in manifest.json for accuracy 2026-02-02 15:57:43 +01:00
kempersc
a83f04d9c4 Refactor code structure for improved readability and maintainability 2026-02-02 15:57:17 +01:00
kempersc
fc405445c6 Refactor and update schema definitions
- Removed obsolete slots: `has_or_had_custodian_observation`, `provider`, and `specificity_annotation`.
- Updated `has_or_had_score` slot to use `SpecificityScore` class and modified its description and examples.
- Added new slots: `end_seconds`, `end_time`, `has_archive_path`, `has_or_had_custodian_name`, `protocol_name`, and `protocol_version`.
- Introduced a script `check_annotation_types.py` to validate the presence and structure of `custodian_types` in YAML files.
- Added a script `update_specificity.py` to automate updates related to `SpecificityAnnotation` to `SpecificityScore`.
2026-02-01 19:55:38 +01:00
kempersc
01e382b53b Update generated timestamp in manifest.json for accuracy 2026-02-01 02:04:00 +01:00
kempersc
41481f6b21 Implement feature X to enhance user experience and fix bug Y in module Z 2026-01-31 23:55:48 +01:00
kempersc
7e0622c755 chore: clean up code structure and remove redundant changes 2026-01-31 21:24:53 +01:00
kempersc
88b325fcdd Refactor YAML schemas to enhance clarity and consistency, adding new slots for authors, fields, and language codes. 2026-01-31 20:27:06 +01:00
kempersc
cb1f9104b6 Update manifest.json timestamp for accuracy 2026-01-31 20:07:24 +01:00
kempersc
787ff6a8d8 Update manifest.json timestamp and refactor YAML schemas for improved clarity and consistency 2026-01-31 18:14:51 +01:00
kempersc
532ee80634 Update manifest.json timestamp and refactor YAML schemas for improved clarity and functionality 2026-01-31 12:29:53 +01:00
kempersc
eb4eac24ce Update manifest.json timestamp and refactor YAML schemas for improved clarity and consistency 2026-01-31 01:23:46 +01:00
kempersc
c567a03833 Update manifest.json timestamp and enhance YAML schemas with new slots for improved clarity and functionality 2026-01-31 01:03:56 +01:00
kempersc
4effcb73b9 Update manifest.json timestamp and refactor YAML schemas for clarity and consistency 2026-01-31 00:59:56 +01:00
kempersc
ca4a54181e Refactor schema files to improve clarity and maintainability
- Updated WorldCatIdentifier.yaml to remove unnecessary description and ensure consistent formatting.
- Enhanced WorldHeritageSite.yaml by breaking long description into multiple lines for better readability and removed unused attributes.
- Simplified WritingSystem.yaml by removing redundant attributes and ensuring consistent formatting.
- Cleaned up XPathScore.yaml by removing unnecessary attributes and ensuring consistent formatting.
- Improved YoutubeChannel.yaml by breaking long description into multiple lines for better readability.
- Enhanced YoutubeEnrichment.yaml by breaking long description into multiple lines for better readability.
- Updated YoutubeVideo.yaml to break long description into multiple lines and removed legacy field name.
- Refined has_or_had_affiliation.yaml by removing unnecessary comments and ensuring clarity.
- Cleaned up is_or_was_retrieved_at.yaml by removing unnecessary comments and ensuring clarity.
- Added rules for generic slots and avoiding rough edits in schema files to maintain structural integrity.
- Introduced changes_or_changed_through.yaml to define a new slot for linking entities to change events.
2026-01-31 00:46:23 +01:00
kempersc
4034c2a00a Refactor schema slots across multiple classes to improve consistency and clarity
- Removed unused slots from TaxonomicAuthority, TechnicalFeature, TelevisionArchive, TentativeWorldHeritageSite, Threat, TimeSpan, Title, TradeRegister, TradeUnionArchive, TradeUnionArchiveRecordSetType, TransferEvent, UNESCODomain, UnitIdentifier, UniversityArchive, UnspecifiedType, UserCommunity, Venue, Vereinsarchiv, Verlagsarchiv, VerlagsarchivRecordSetType, Version, Verwaltungsarchiv, VideoAnnotationTypes, VideoAudioAnnotation, VideoFrame, VideoPost, VideoSubtitle, VideoTextContent, Warehouse, WebArchive, WebClaim, WebClaimsBlock, WebLink, WebPortal, WebPortalTypes, WomensArchives, WordCount, WorldHeritageSite, WritingSystem, and XPathScore.
- Introduced new slot is_or_was_retrieved_at for tracking data retrieval timestamps.
2026-01-31 00:28:09 +01:00
kempersc
56a7001e45 Update manifest.json timestamp and refactor descriptions in YAML schema files for clarity 2026-01-31 00:22:16 +01:00
kempersc
6203d19875 Refactor YAML schemas for clarity and consistency
- Removed unnecessary line breaks and whitespace in descriptions across multiple classes including Taxon, TaxonomicAuthority, TechnicalFeature, TradeRegister, TransferEvent, UNESCODomain, UnspecifiedType, UserCommunity, Version, VideoAnnotationTypes, VideoFrame, VideoTextContent, WebArchive, WebClaimsBlock, WebLink, WebPortal, and WordCount.
- Updated descriptions to enhance readability and maintain a uniform style.
- Migrated attributes and slots as per the latest schema rules, ensuring alignment with the defined standards.
- Improved documentation for better understanding of class purposes and usage scenarios.
2026-01-31 00:21:50 +01:00
kempersc
0c5211e40a removed convenience slots 2026-01-31 00:15:53 +01:00
kempersc
14375c583e added hidden slots 2026-01-30 23:56:19 +01:00
kempersc
1b76a3cfe4 Update manifest.json timestamp and add new slots for geographic scope and digital access 2026-01-30 00:50:06 +01:00
kempersc
9bd71f20c8 Update manifest.json timestamp and refactor range definitions in YAML schema files 2026-01-30 00:32:36 +01:00
kempersc
f7bf1cc5ae Refactor schema slots and classes
- Deleted obsolete slot definitions: statement_summary, statement_text, statement_type, status_name, supersede_articles, supersede_condition, supersede_name, temporal_dynamics, total_amount, typical_contents, use_cases, was_acquired_through, was_fetched_at, was_retrieved_at.
- Updated existing slot definitions for states_or_stated to enhance clarity and structure.
- Introduced new classes: Article, ConditionofAccess, FinancialStatementType, MaximumQuantity, Series, Summary, Type, and their respective slots to improve schema organization and usability.
- Added new slots: changes_or_changed_through, has_or_had_condition_of_access, has_or_had_heritage_type, is_or_was_part_of_series, is_or_was_retrieved_at, maximum_of_maximum to capture additional metadata and relationships.
2026-01-30 00:29:31 +01:00
kempersc
2f44857028 Refactor LinkML schemas and slots for consistency and clarity
- Updated imports in FindingAid.yaml to remove unnecessary entries and added new slots for arrangement level and provenance path.
- Replaced 'full_name' with 'has_or_had_label' in LegalName.yaml and ProfileData.yaml for uniformity.
- Enhanced slot definitions in various YAML files, including ceases_or_ceased_through, has_or_had_arrangement_level, has_or_had_assessment, and others, to include metadata and improve structure.
- Removed the script fix_linkml_metadata.py as it is no longer needed.
- Added new script fix_specific_dead_links.py to handle specific mapping updates for extraction metadata and full name fields across multiple YAML files.
2026-01-29 18:17:47 +01:00
5941 changed files with 192160 additions and 125442 deletions

View file

@ -0,0 +1,31 @@
# Exact Mapping Predicate/Class Distinction Rule
🚨 **CRITICAL**: The `exact_mappings` property implies semantic equivalence. Equivalence can only exist between elements of the same ontological category.
## The Rule
1. **Slots (Predicates)** MUST ONLY have `exact_mappings` to ontology **predicates** (properties).
* ❌ INVALID: Slot `analyzes_or_analyzed` maps to `schema:object` (a Class).
* ✅ VALID: Slot `analyzes_or_analyzed` maps to `crm:P129_is_about` (a Property).
2. **Classes (Entities)** MUST ONLY have `exact_mappings` to ontology **classes** (entities).
* ❌ INVALID: Class `Person` maps to `foaf:name` (a Property).
* ✅ VALID: Class `Person` maps to `foaf:Person` (a Class).
## Rationale
Mapping a slot (which defines a relationship or attribute) to a class (which defines a type of entity) is a category error. `schema:object` represents the *class* of objects, not the *relationship* of "having an object" or "analyzing an object".
## Verification Checklist
When adding or reviewing `exact_mappings`:
- [ ] Is the LinkML element a Class or a Slot?
- [ ] Does the target ontology term represent a Class (usually Capitalized) or a Property (usually lowercase)?
- [ ] Do they match? (Class↔Class, Slot↔Property)
- [ ] If the target ontology uses opaque IDs (like CIDOC-CRM `E55_Type`), verify the type definition in the ontology file.
## Common Pitfalls to Fix
- Mapping slots to `schema:Object` or `schema:Thing`.
- Mapping slots to `skos:Concept`.
- Mapping classes to `schema:name` or `dc:title`.

View file

@ -0,0 +1,129 @@
# Rule: Generic Slots, Specific Classes
**Identifier**: `generic-slots-specific-classes`
**Severity**: **CRITICAL**
## Core Principle
**Slots MUST be generic predicates** that can be reused across multiple classes. **Classes MUST be specific** to provide context and constraints.
**DO NOT** create class-specific slots when a generic predicate can be used.
## Rationale
1. **Predicate Proliferation**: Creating bespoke slots for every class explodes the schema size (e.g., `has_museum_name`, `has_library_name`, `has_archive_name` instead of `has_name`).
2. **Interoperability**: Generic predicates (`has_name`, `has_identifier`, `has_part`) map cleanly to standard ontologies (Schema.org, Dublin Core, RiC-O).
3. **Querying**: It's easier to query "all entities with a name" than "all entities with museum_name OR library_name OR archive_name".
4. **Maintenance**: Updating one generic slot propagates to all classes.
## Examples
### ❌ Anti-Pattern: Class-Specific Slots
```yaml
# WRONG: Creating specific slots for each class
slots:
has_museum_visitor_count:
range: integer
has_library_patron_count:
range: integer
classes:
Museum:
slots:
- has_museum_visitor_count
Library:
slots:
- has_library_patron_count
```
### ✅ Correct Pattern: Generic Slot, Specific Class Usage
```yaml
# CORRECT: One generic slot reused
slots:
has_or_had_quantity:
slot_uri: rico:hasOrHadQuantity
range: Quantity
multivalued: true
classes:
Museum:
slots:
- has_or_had_quantity
slot_usage:
has_or_had_quantity:
description: The number of visitors to the museum.
Library:
slots:
- has_or_had_quantity
slot_usage:
has_or_had_quantity:
description: The number of registered patrons.
```
## Intermediate Class Pattern
Making slots generic often requires introducing **Intermediate Classes** to hold structured data, rather than flattening attributes onto the parent class.
### ❌ Anti-Pattern: Specific Flattened Slots
```yaml
# WRONG: Flattened specific attributes
classes:
Museum:
slots:
- has_museum_budget_amount
- has_museum_budget_currency
- has_museum_budget_year
```
### ✅ Correct Pattern: Generic Slot + Intermediate Class
```yaml
# CORRECT: Generic slot pointing to structured class
slots:
has_or_had_budget:
range: Budget
multivalued: true
classes:
Museum:
slots:
- has_or_had_budget
Budget:
slots:
- has_or_had_amount
- has_or_had_currency
- has_or_had_year
```
## Specificity Levels
| Level | Component | Example |
|-------|-----------|---------|
| **Generic** | **Slot (Predicate)** | `has_or_had_identifier` |
| **Specific** | **Class (Subject/Object)** | `ISILCode` |
| **Specific** | **Slot Usage (Context)** | "The ISIL code assigned to this library" |
## Migration Guide
If you encounter an overly specific slot:
1. **Identify the generic concept** (e.g., `has_museum_opening_hours``has_opening_hours`).
2. **Check if a generic slot exists** in `modules/slots/`.
3. **If yes**, use the generic slot and add `slot_usage` to the class.
4. **If no**, create the **generic** slot, not a specific one.
## Naming Indicators
**Reject slots containing:**
* Class names (e.g., `has_custodian_name``has_name`)
* Narrow types (e.g., `has_isbn_identifier``has_identifier`)
* Contextual specifics (e.g., `has_primary_email``has_email` + type/role)
## See Also
* Rule 55: Broaden Generic Predicate Ranges
* Rule 39: Slot Naming Convention (RiC-O Style)

View file

@ -0,0 +1,54 @@
# Mapping Specificity Rule: Broad vs Narrow vs Exact Mappings
## 🚨 CRITICAL: Mapping Semantics
When mapping LinkML classes to external ontologies, you MUST distinguish between **equivalence**, **hypernyms** (broader concepts), and **hyponyms** (narrower concepts).
### The Rule
1. **Exact Mappings (`skos:exactMatch`)**: Use ONLY when the external concept is **semantically equivalent** to your class.
* *Example*: `hc:Person` `exact_mappings` `schema:Person`.
2. **Broad Mappings (`skos:broadMatch`)**: Use when the external concept is a **hypernym** (a broader, more general category) of your class.
* *Example*: `hc:AcademicArchiveRecordSetType` `broad_mappings` `rico:RecordSetType`.
* *Rationale*: An academic archive record set *is a* record set type, but `rico:RecordSetType` is broader.
* *Common Hypernyms*: `skos:Concept`, `prov:Entity`, `schema:Thing`, `schema:Organization`, `rico:RecordSetType`.
3. **Narrow Mappings (`skos:narrowMatch`)**: Use when the external concept is a **hyponym** (a narrower, more specific category) of your class.
* *Example*: `hc:Organization` `narrow_mappings` `hc:Library` (if mapping inversely).
### Common Violations to Avoid
**WRONG**:
```yaml
AcademicArchiveRecordSetType:
exact_mappings:
- rico:RecordSetType # WRONG: This implies AcademicArchiveRecordSetType == RecordSetType
```
**CORRECT**:
```yaml
AcademicArchiveRecordSetType:
broad_mappings:
- rico:RecordSetType # CORRECT: RecordSetType is broader
```
**WRONG**:
```yaml
SocialMovement:
exact_mappings:
- schema:Organization # WRONG: SocialMovement is a specific TYPE of Organization
```
**CORRECT**:
```yaml
SocialMovement:
broad_mappings:
- schema:Organization # CORRECT
```
### Verification Checklist
- [ ] Does the `exact_mapping` represent the **exact same scope**?
- [ ] If the external term is a generic parent class (e.g., `Type`, `Concept`, `Entity`), move it to `broad_mappings`.
- [ ] If the external term is a specific instance or subclass, check `narrow_mappings`.

View file

@ -0,0 +1,61 @@
# Rule: No Rough Edits in Schema Files
**Identifier**: `no-rough-edits-in-schema`
**Severity**: **CRITICAL**
## Core Directive
**DO NOT** perform rough, imprecise, or bulk text substitutions (like `sed -i` or regex-based python scripts) on LinkML schema files (`schemas/*/linkml/`) without guaranteeing structural integrity.
**YOU MUST**:
* ✅ Use proper YAML parsers/dumpers if modifying structure programmatically.
* ✅ Manually verify edits if using text replacement.
* ✅ Ensure indentation and nesting are preserved exactly.
* ✅ Respect comments and ordering (which parsers often destroy, so careful text editing is sometimes necessary, but it must be PRECISE).
## Rationale
LinkML schemas are highly structured YAML files where indentation and nesting semantics are critical. Rough edits often cause:
* **Duplicate keys** (e.g., leaving a property behind after deleting its parent key).
* **Invalid indentation** (breaking the parent-child relationship).
* **Silent corruption** (valid YAML but wrong semantics).
## Examples
### ❌ Anti-Pattern: Rough Deletion
Deleting lines containing a string without checking context:
```python
# WRONG: Deleting lines blindly
for line in lines:
if "some_slot" in line:
continue # Deletes the line, but might leave children orphaned!
new_lines.append(line)
```
**Resulting Corruption**:
```yaml
# Original
slots:
some_slot:
range: string
# Corrupted (orphaned child)
slots:
range: string # INVALID!
```
### ✅ Correct Pattern: Structural Awareness
If removing a slot reference, ensure you remove the entire list item or key-value block.
```python
# BETTER: Check for list item syntax
if re.match(r'^\s*-\s*some_slot\s*$', line):
continue
```
## Application
This rule applies to ALL files in `schemas/20251121/linkml/` and future versions.

View file

@ -0,0 +1,15 @@
# Rule: Ontology Detection vs Heuristics
## Summary
When detecting classes and predicates in `data/ontology/` or external ontology files, you must **read the actual ontology definitions** (e.g., RDF, OWL, TTL files) to determine if a term is a Class or a Property. Do not rely on naming heuristics (like "Capitalized means Class").
## Detail
* **Verification**: Always read the source ontology file or use a semantic lookup tool to verify the `rdf:type` of an entity.
* If `rdf:type` is `owl:Class` or `rdfs:Class`, it is a **Class**.
* If `rdf:type` is `rdf:Property`, `owl:ObjectProperty`, or `owl:DatatypeProperty`, it is a **Property**.
* **Avoid Heuristics**: Do not assume that `skos:Concept` is a class just because it looks like one (it is), or that `schema:name` is a property just because it's lowercase. Many ontologies have inconsistent naming conventions (e.g., `schema:Person` vs `foaf:Person`).
* **Strictness**: If the ontology file is not available locally, attempt to fetch it or consult authoritative documentation before guessing.
## Violation Examples
* Assuming `ex:MyTerm` is a class because it starts with an uppercase letter without checking the `.ttl` file.
* Mapping a LinkML slot to `schema:Thing` (a Class) instead of a Property because you guessed based on the name.

View file

@ -22,6 +22,24 @@ When creating class hierarchies that replace enums in LinkML schemas, follow the
---
## Class Naming Convention
🚨 **CRITICAL**: Follow these naming rules for classes within the files:
1. **Abstract Base Class** (`[Entity]Type.yaml`):
* **MUST** end with `Type` suffix.
* *Example*: `DigitalPlatformType`, `WarehouseType`.
2. **Concrete Subclasses** (`[Entity]Types.yaml`):
* **MUST NOT** end with `Type` suffix.
* Use the natural entity name.
* *Example*: `DigitalLibrary` (✅), `CentralDepot` (✅).
* *Incorrect*: `DigitalLibraryType` (❌), `CentralDepotType` (❌).
**Rationale**: The file context (`WarehouseTypes.yaml`) already establishes these are types. Repeating "Type" in the class name is redundant and makes the class name less natural when used as an object instance (e.g., "This object is a CentralDepot").
---
## Examples
### Current Implementations
@ -109,6 +127,7 @@ classes:
| `DigitalPlatformTypeClasses.yaml` | "Classes" is less intuitive than "Types" for a type taxonomy | `DigitalPlatformTypes.yaml` |
| All types in single file | Large files are hard to navigate; separation clarifies architecture | Split into Type.yaml + Types.yaml |
| `DigitalPlatformEnum.yaml` | Enums lack extensibility; class hierarchies are preferred | Use class hierarchy pattern |
| `CentralDepotType` (Class Name) | Redundant "Type" suffix on concrete subclass | `CentralDepot` |
### Example of Incorrect Naming

4826
AGENTS.md

File diff suppressed because it is too large Load diff

59
break_archive_cycles.py Normal file
View file

@ -0,0 +1,59 @@
import os
def check_and_fix(path):
filename = os.path.basename(path)
if not filename.endswith("RecordSetTypes.yaml"):
return
# Filename: WomensArchivesRecordSetTypes.yaml
# Custodian class: WomensArchives.yaml
custodian_class = filename.replace('RecordSetTypes.yaml', '')
custodian_class_s = custodian_class + "s"
with open(path, 'r') as f:
lines = f.readlines()
new_lines = []
in_imports = False
modified = False
for line in lines:
stripped = line.strip()
if stripped == "imports:":
in_imports = True
new_lines.append(line)
continue
if in_imports:
if not stripped.startswith("-"):
if stripped and not stripped.startswith("#"):
in_imports = False
new_lines.append(line)
else:
import_path = stripped.lstrip("- ").strip()
# Check for import of custodian class: - ./WomensArchives
if import_path == f"./{custodian_class}":
print(f"Removing cycle import in {path}: {stripped}")
modified = True
continue
elif import_path == f"./{custodian_class_s}":
print(f"Removing cycle import (plural) in {path}: {stripped}")
modified = True
continue
else:
new_lines.append(line)
else:
new_lines.append(line)
if modified:
with open(path, 'w') as f:
f.writelines(new_lines)
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
check_and_fix(os.path.join(root, file))
process_directory("schemas/20251121/linkml/modules/classes")

50
check_annotation_types.py Normal file
View file

@ -0,0 +1,50 @@
import yaml
import os
def check_file(path):
try:
with open(path, 'r') as f:
data = yaml.safe_load(f)
except Exception as e:
print(f"Error parsing {path}: {e}")
return
if 'classes' in data:
for class_name, class_def in data['classes'].items():
if 'custodian_types' in class_def:
print(f"Misplaced custodian_types found in {path} Class {class_name} (root level)")
if 'slot_usage' in class_def and class_def['slot_usage']:
for slot_name, slot_def in class_def['slot_usage'].items():
if slot_def and 'custodian_types' in slot_def:
print(f"Misplaced custodian_types found in {path} Class {class_name} SlotUsage {slot_name}")
if 'annotations' in class_def:
ann = class_def['annotations']
if ann and 'custodian_types' in ann:
val = ann['custodian_types']
if isinstance(val, list):
print(f"List value found in {path} Class {class_name}: {val}")
elif not isinstance(val, str):
print(f"Non-string value found in {path} Class {class_name}: {val} (type: {type(val)})")
if 'slots' in data:
for slot_name, slot_def in data['slots'].items():
if 'custodian_types' in slot_def:
print(f"Misplaced custodian_types found in {path} Slot {slot_name} (root level)")
if 'annotations' in slot_def:
ann = slot_def['annotations']
if ann and 'custodian_types' in ann:
val = ann['custodian_types']
if isinstance(val, list):
print(f"List value found in {path} Slot {slot_name}: {val}")
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
check_file(os.path.join(root, file))
process_directory("schemas/20251121/linkml/modules/classes")
process_directory("schemas/20251121/linkml/modules/slots")

67
check_duplicates.py Normal file
View file

@ -0,0 +1,67 @@
import yaml
import os
def check_dir(directory):
print(f"Checking directory: {directory}")
target_keys = ["related_mappings", "close_mappings", "exact_mappings", "broad_mappings", "narrow_mappings", "slots", "slot_usage", "attributes", "annotations", "description", "class_uri", "id", "name", "title", "imports", "prefixes", "default_prefix", "default_range", "classes", "types", "enums", "subsets"]
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
path = os.path.join(root, file)
with open(path, 'r') as f:
lines = f.readlines()
keys_at_indent = {} # {indent: {key: line_no}}
prev_indent = 0
for i, line in enumerate(lines):
stripped = line.strip()
if not stripped or stripped.startswith('#') or stripped.startswith('-'):
continue
indent = len(line) - len(line.lstrip())
if ':' in stripped:
key = stripped.split(':')[0].strip()
# Only check for specific structural keys to avoid noise
if key not in target_keys:
continue
# If indentation increased, we are in a new block
if indent > prev_indent:
pass
# If indentation decreased, clear deeper levels
elif indent < prev_indent:
keys_to_remove = [k for k in keys_at_indent if k > indent]
for k in keys_to_remove:
del keys_at_indent[k]
if indent not in keys_at_indent:
keys_at_indent[indent] = {}
if key in keys_at_indent[indent]:
prev_line = keys_at_indent[indent][key]
# Heuristic: if lines are in same block (no lower indent between)
# We assume it's a duplicate in the same object
# Double check if there was a lower indent line between them
parent_found = False
for j in range(prev_line + 1, i):
inner_line = lines[j]
if inner_line.strip() and not inner_line.strip().startswith('#'):
curr_indent = len(inner_line) - len(inner_line.lstrip())
if curr_indent < indent:
parent_found = True
break
if not parent_found:
print(f"DUPLICATE KEY '{key}' in {path} at line {i+1} (previous at {prev_line+1})")
keys_at_indent[indent][key] = i
prev_indent = indent
check_dir("schemas/20251121/linkml/modules/classes")
check_dir("schemas/20251121/linkml/modules/slots")

33
check_self_imports.py Normal file
View file

@ -0,0 +1,33 @@
import os
def check_file(path):
filename = os.path.basename(path)
classname = filename.replace('.yaml', '')
with open(path, 'r') as f:
lines = f.readlines()
in_imports = False
for i, line in enumerate(lines):
stripped = line.strip()
if stripped == "imports:":
in_imports = True
continue
if in_imports:
if not stripped.startswith("-"):
if stripped and not stripped.startswith("#"):
in_imports = False
else:
import_path = stripped.lstrip("- ").strip()
if import_path == f"./{classname}":
print(f"Self-import found in {path} at line {i+1}: {stripped}")
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
check_file(os.path.join(root, file))
process_directory("schemas/20251121/linkml/modules/classes")

37
check_type_types_cycle.py Normal file
View file

@ -0,0 +1,37 @@
import os
def check_file(path):
filename = os.path.basename(path)
if not filename.endswith("Type.yaml"):
return
classname = filename.replace('.yaml', '')
plural_classname = classname + "s"
with open(path, 'r') as f:
lines = f.readlines()
in_imports = False
for i, line in enumerate(lines):
stripped = line.strip()
if stripped == "imports:":
in_imports = True
continue
if in_imports:
if not stripped.startswith("-"):
if stripped and not stripped.startswith("#"):
in_imports = False
else:
import_path = stripped.lstrip("- ").strip()
if import_path == f"./{plural_classname}":
print(f"Cycle found in {path}: imports plural {plural_classname}")
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
check_file(os.path.join(root, file))
process_directory("schemas/20251121/linkml/modules/classes")

38
clean_01_imports.py Normal file
View file

@ -0,0 +1,38 @@
import os
def clean_imports(path):
with open(path, 'r') as f:
lines = f.readlines()
bad_imports = [
"DiarizationSegment",
"SpeechSegment",
"MusicSegment",
"ImagingEquipment",
"EADIdentifier",
"LEIIdentifier",
"AlternativeName",
"Series",
"MissionStatement",
"StorageFacility",
"AcquisitionBudget",
"DigitizationBudget"
]
new_lines = []
for line in lines:
stripped = line.strip()
remove = False
for bad in bad_imports:
if bad in stripped and "modules/classes" in stripped:
print(f"Removing {bad} from {path}")
remove = True
break
if not remove:
new_lines.append(line)
with open(path, 'w') as f:
f.writelines(new_lines)
clean_imports("schemas/20251121/linkml/01_custodian_name_modular.yaml")

View file

@ -41,4 +41,193 @@ fixes:
type: slot
- label: TimeSpan
type: class
-
- original_slot_id: https://nde.nl/ontology/hc/slot/was_fetched_at
revision:
- label: is_or_was_retrieved_at
type: slot
- label: TimeSpan
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/was_acquired_through
revision:
- label: is_or_was_acquired_through
type: slot
- label: AcquisitionMethod
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/use_cases
revision:
- label: has_or_had_use_case
type: slot
- label: UseCase
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/typical_contents
revision:
- label: has_or_had_content
type: slot
- label: Content
type: class
- label: has_or_had_type
type: slot
- label: Type
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/total_amount
revision:
- label: has_or_had_quantity
type: slot
- label: Quantity
type: class
- label: maximum_of_maximum
type: slot
- label: MaximumQuantity
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/temporal_dynamics
revision:
- label: changes_or_changed_through
type: slot
- label: Event
type: class
- label: temporal_extent
type: slot
- label: TimeSpan
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/supersede_name
revision:
- label: has_or_had_label
type: slot
- label: Name
type: class
- label: temporal_extent
type: slot
- label: TimeSpan
type: class
note: this class indicates that the name was valid during a specific time period
- original_slot_id: https://nde.nl/ontology/hc/slot/supersede_condition
revision:
- label: supersedes_or_superseded
type: slot
- label: Condition
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/supersede_articles
revision:
- label: supersedes_or_superseded
type: slot
- label: Article
type: class
- orignal_slot_id: https://nde.nl/ontology/hc/slot/status_name
revision:
- label: has_or_had_label
type: slot
- label: Label
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_type
revision:
- label: has_or_had_type
type: slot
- label: FinancialStatementType
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_text
revision:
- label: has_or_had_text
type: slot
- label: Text
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_summary
revision:
- label: has_or_had_summary
type: slot
- label: Summary
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_name
revision:
- label: has_or_had_label
type: slot
- label: Name
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_language
revision:
- label: has_or_had_language
type: slot
- label: Language
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_id
revision:
- label: has_or_had_identifier
type: slot
- label: Identifier
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_description
revision:
- label: has_or_had_description
type: slot
- label: Description
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_currency
revision:
- label: states_or_stated
type: slot
- label: Quantity
type: class
- label: has_or_had_currency
type: slot
- label: Currency
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/uses_or_used_technique
revision:
- label: has_or_has_method
type: slot
- label: Method
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_type
revision:
- label: has_or_had_type
type: slot
- label: StatementType
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_name
revision:
- label: has_or_had_label
type: slot
- label: Label
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/statement_description
revision:
- label: has_or_had_description
type: slot
- label: Description
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/starts_or_started_at_location
revision:
- label: temporal_extent
type: slot
- label: TimeSpan
type: class
- label: begin_of_the_begin
type: slot
- label: Event
type: class
note: use Event instead of Timestamp as properties need to be assigned
- label: is_or_was_located_at
type: slot
- label: Location
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/started_at_time
revision:
- label: temporal_extent
type: slot
- label: TimeSpan
type: class
- label: begin_of_the_begin
type: slot
- label: Timestamp
type: class
- original_slot_id: https://nde.nl/ontology/hc/slot/start_time
revision:
- label: temporal_extent
type: slot
- label: TimeSpan
type: class
- label: begin_of_the_begin
type: slot
- label: Timestamp
type: class
# continue with https://nde.nl/ontology/hc/slot/start_seconds

2274
data/ontology/odrl.ttl Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,211 @@
@prefix frac: <http://www.w3.org/ns/lemon/frac#> .
@prefix ontolex: <http://www.w3.org/ns/lemon/ontolex#> .
@prefix synsem: <http://www.w3.org/ns/lemon/synsem#> .
@prefix decomp: <http://www.w3.org/ns/lemon/decomp#> .
@prefix vartrans: <http://www.w3.org/ns/lemon/vartrans#> .
@prefix lime: <http://www.w3.org/ns/lemon/lime#> .
@prefix lexicog: <http://www.w3.org/ns/lemon/lexicog#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix owl: <http://www.w3.org/2002/07/owl#>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
@prefix skos: <http://www.w3.org/2004/02/skos#>.
@prefix dbr: <http://dbpedia.org/resource/>.
@prefix dbo: <http://dbpedia.org/ontology/>.
@prefix void: <http://rdfs.org/ns/void#>.
@prefix lexinfo: <http://www.lexinfo.net/ontology/2.0/lexinfo#>.
@prefix dct: <http://purl.org/dc/terms/>.
@prefix provo: <http://www.w3.org/ns/prov#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix oa: <http://www.w3.org/ns/oa#>.
@prefix aat: <http://vocab.getty.edu/aat/>.
@prefix voaf: <http://purl.org/vocommons/voaf#>.
@prefix dcam: <http://purl.org/dc/dcam/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix dcmitype: <http://purl.org/dc/dcmitype/>
##########################
# vocabulary declaration #
##########################
<http://www.w3.org/ns/lemon/frac#>
a owl:Ontology, voaf:Vocabulary ;
# owl:imports <http://www.w3.org/ns/lemon/ontolex>
.
#########################
# imported vocabularies #
#########################
rdf:Bag
rdfs:subClassOf rdfs:Container .
rdf:Seq
rdfs:subClassOf rdfs:Container .
rdfs:member
a owl:ObjectProperty .
rdf:value
a owl:DatatypeProperty .
dct:extent
a owl:DatatypeProperty .
dct:description
a owl:DatatypeProperty .
#####################
# top-level classes #
#####################
frac:Observable
a owl:Class ;
skos:definition """Observable is an abstract superclass for any element of a lexical resource that frequency, attestation or corpus-derived information can be expressed about. This includes, among others, `ontolex:LexicalEntry`, `ontolex:LexicalSense`, `ontolex:Form`, and `ontolex:LexicalConcept`. Elements that FrAC properties apply to must be observable in a corpus or another linguistic data source."""@en;
rdfs:label "observable"@en.
ontolex:Form
rdfs:subClassOf frac:Observable .
ontolex:LexicalConcept
rdfs:subClassOf frac:Observable .
ontolex:LexicalEntry
rdfs:subClassOf frac:Observable .
ontolex:LexicalSense
rdfs:subClassOf frac:Observable .
frac:Observation
a owl:Class;
rdfs:subClassOf [
a <http://www.w3.org/2002/07/owl#Restriction> ;
<http://www.w3.org/2002/07/owl#minCardinality> "1"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> ;
<http://www.w3.org/2002/07/owl#onProperty> rdf:value
] ;
rdfs:subClassOf [
a <http://www.w3.org/2002/07/owl#Restriction> ;
<http://www.w3.org/2002/07/owl#minCardinality> "1"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> ;
<http://www.w3.org/2002/07/owl#onProperty> frac:observedIn
] ;
# the following constraint is semantically empty
# it is supposed to express that there should be
# a human-readable description, but we don't enforce it
# in order not to break validation
rdfs:subClassOf [
a <http://www.w3.org/2002/07/owl#Restriction> ;
<http://www.w3.org/2002/07/owl#minCardinality> "0"^^<http://www.w3.org/2001/XMLSchema#nonNegativeInteger> ;
<http://www.w3.org/2002/07/owl#onProperty> dct:description
] .
frac:observedIn
a owl:ObjectProperty ;
rdfs:domain frac:Observation ;
rdfs:range [
a owl:Restriction ;
owl:onProperty rdf:type ;
owl:someValuesFrom [
a owl:Restriction ;
owl:onProperty dcam:memberOf ;
owl:hasValue dcterms:DCMIType ] ] ;
rdfs:comment """For an Observation, the property observedIn defines the URI of the data
source (or its metadata entry) that this particular observation was made in or derived from.
This can be, for example, a corpus or a text represented by its access URL, a book
represented by its bibliographical metadata, etc."""@en .
#############
# frequency #
#############
frac:Frequency
a owl:Class ;
rdfs:subClassOf frac:Observation ;
rdfs:subClassOf [
a owl:Restriction ;
owl:cardinality "1"^^xsd:nonNegativeInteger ;
owl:onDataRange xsd:int ;
owl:onProperty rdf:value
] .
frac:frequency
a owl:ObjectProperty ;
rdfs:domain frac:Observable ;
rdfs:range frac:Frequency .
frac:total
a owl:DatatypeProperty, owl:FunctionalProperty ;
rdfs:domain [
a owl:Restriction ;
owl:onProperty rdf:type ;
owl:someValuesFrom [
a owl:Restriction ;
owl:onProperty dcam:memberOf ;
owl:hasValue dcterms:DCMIType ] ] ;
rdfs:range xsd:int ;
rdfs:label "could be renamed to frac:tokens, as different kinds of totals as possible for multi-word expressions"@en .
###############
# attestation #
###############
frac:Attestation
rdfs:subClassOf frac:Observation .
frac:attestation
a owl:ObjectProperty ;
rdfs:domain frac:Observable ;
rdfs:range frac:Attestation ;
rdfs:subPropertyOf frac:citation .
frac:citation
a owl:ObjectProperty ;
rdfs:domain frac:Observable .
frac:gloss
a owl:DatatypeProperty ;
rdfs:domain frac:Attestation ;
rdfs:range xsd:string ;
rdfs:comment "An attestation gloss is the representation of the attestation as provided in a lexical resource. This may contain, for example, amendments or additional comments. For the string as found in the original text, use rdf:value." .
frac:locus
a owl:ObjectProperty ;
rdfs:domain frac:Attestation ;
rdfs:comment """Points from an Observation to the exact location in the source material on where it is to be found. This can be, for example, a page in a book, the string URI of a passage in a text, a canonical reference to a passage in piece of literatur, or any Web Annotation selector. We have confirmed name, function and necessity of this property.
When the locus is provided, it is not necessary to also refer to the source material as a whole. The existence of such a reference is nevertheless implied."""@en .
###############
# collocation #
###############
frac:Collocation
rdfs:subClassOf rdfs:Container, frac:Observable, frac:Observation, [
a owl:Restriction ;
owl:minQualifiedCardinality "2"^^xsd:nonNegativeInteger ;
owl:onClass frac:Observable ;
owl:onProperty rdfs:member
] ,
[
a <http://www.w3.org/2002/07/owl#Restriction> ;
<http://www.w3.org/2002/07/owl#allValuesFrom> <http://www.w3.org/ns/lemon/frac#Observable> ;
<http://www.w3.org/2002/07/owl#onProperty> <http://www.w3.org/2000/01/rdf-schema#member>
] .
frac:cScore
rdfs:subPropertyOf rdf:value ;
rdfs:domain frac:Collocation .
frac:head
a owl:ObjectProperty ;
rdfs:domain frac:Collocation ;
rdfs:range frac:Observable .

33
find_custodian_types.py Normal file
View file

@ -0,0 +1,33 @@
import yaml
import os
def check_dict(d, path, context="root"):
if not isinstance(d, dict):
return
for k, v in d.items():
if k == 'custodian_types':
if context != 'annotations':
print(f"Misplaced custodian_types in {path} at context '{context}'")
if isinstance(v, dict):
check_dict(v, path, k)
elif isinstance(v, list):
for item in v:
check_dict(item, path, k)
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
path = os.path.join(root, file)
try:
with open(path, 'r') as f:
data = yaml.safe_load(f)
check_dict(data, path)
except Exception as e:
# Ignore parse errors
pass
process_directory("schemas/20251121/linkml/modules/classes")
process_directory("schemas/20251121/linkml/modules/slots")

89
find_cycles.py Normal file
View file

@ -0,0 +1,89 @@
import os
import networkx as nx
def get_imports(path):
imports = []
try:
with open(path, 'r') as f:
lines = f.readlines()
in_imports = False
for line in lines:
stripped = line.strip()
if stripped == "imports:":
in_imports = True
continue
if in_imports:
if not stripped.startswith("-"):
if stripped and not stripped.startswith("#"):
in_imports = False
else:
imp = stripped.lstrip("- ").strip()
imports.append(imp)
except Exception:
pass
return imports
def build_graph(root_dir):
G = nx.DiGraph()
# Map file paths to node names
# Node name: relative path from root_dir or filename if unique
# LinkML imports are relative paths.
# We need to resolve relative paths.
# files: list of (abs_path, rel_path_from_root)
# root_dir is schemas/20251121/linkml
files_map = {} # abs_path -> rel_path
for root, dirs, files in os.walk(root_dir):
for file in files:
if file.endswith(".yaml"):
abs_path = os.path.join(root, file)
rel_path = os.path.relpath(abs_path, root_dir)
files_map[abs_path] = rel_path
G.add_node(rel_path)
for abs_path, rel_path in files_map.items():
imports = get_imports(abs_path)
base_dir = os.path.dirname(abs_path)
for imp in imports:
# imp is relative to abs_path
# resolve it
if imp.startswith("linkml:"):
continue
imp_abs = os.path.normpath(os.path.join(base_dir, imp))
if not imp_abs.endswith(".yaml"):
imp_abs += ".yaml"
if imp_abs in files_map:
target = files_map[imp_abs]
G.add_edge(rel_path, target)
else:
# print(f"Warning: {rel_path} imports {imp} which resolves to {imp_abs} (not found)")
pass
return G
def find_cycles(G):
try:
cycles = nx.simple_cycles(G)
count = 0
for cycle in cycles:
print("Cycle found:")
print(cycle)
count += 1
if count >= 10:
print("Stopping after 10 cycles.")
break
if count == 0:
print("No cycles found.")
except Exception as e:
print(f"Error finding cycles: {e}")
if __name__ == "__main__":
G = build_graph("schemas/20251121/linkml")
find_cycles(G)

View file

@ -0,0 +1,18 @@
import os
filepath = 'schemas/20251121/linkml/modules/classes/ApproximationStatus.yaml'
with open(filepath, 'r') as f:
content = f.read()
# The error is that appears inside a description string that is formatted as a YAML block.
# This should NOT cause error unless it's being parsed as an example value?
# But showed it in .
# Wait, the grep output showed it on line 28 inside a quoted string.
# However, earlier grep showed:
# schemas/20251121/linkml/modules/classes/CustodianTimelineEvent.yaml: event_date: "2005-04-30"
# This looks like it IS used as a key in inside an example block.
# Let's check .

59
fix_dangling.py Normal file
View file

@ -0,0 +1,59 @@
import os
import re
def fix_dangling_in_file(path):
with open(path, 'r') as f:
lines = f.readlines()
new_lines = []
# keys that take lists
list_keys = [
"slots",
"exact_mappings", "close_mappings", "broad_mappings", "related_mappings", "narrow_mappings",
"examples", "comments", "see_also", "keywords", "structured_aliases",
"subsets", "mixins", "apply_to", "union_of", "values", "equals_expression", "equals_string_in",
"aliases", "local_names", "union_of", "defines"
]
last_key_at_4 = None
for i, line in enumerate(lines):
stripped = line.strip()
if not stripped or stripped.startswith('#'):
new_lines.append(line)
continue
indent = len(line) - len(line.lstrip())
# Check if line is a key at 4 spaces
# Regex: start with 4 spaces, then key chars, then colon, then optional space/value
if indent == 4 and ':' in stripped and not stripped.startswith('-'):
key = stripped.split(':')[0].strip()
last_key_at_4 = key
new_lines.append(line)
continue
# Check if line is a list item at 4 spaces
if indent == 4 and stripped.startswith('-'):
if last_key_at_4 not in list_keys:
print(f"Removing dangling list item in {path} at line {i+1} (after {last_key_at_4}): {stripped}")
continue # Skip/Delete
# Reset last_key_at_4 if indentation drops below 4
if indent < 4:
last_key_at_4 = None
new_lines.append(line)
with open(path, 'w') as f:
f.writelines(new_lines)
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
fix_dangling_in_file(os.path.join(root, file))
process_directory("schemas/20251121/linkml/modules/classes")

View file

@ -0,0 +1,42 @@
import os
import yaml
# Check FinancialStatement.yaml for duplicate has_or_had_format
filepath = 'schemas/20251121/linkml/modules/classes/FinancialStatement.yaml'
with open(filepath, 'r') as f:
lines = f.readlines()
new_lines = []
seen_keys = set()
in_slot_usage = False
slot_usage_indent = -1
for line in lines:
stripped = line.strip()
indent = len(line) - len(line.lstrip())
if stripped.startswith('slot_usage:'):
in_slot_usage = True
slot_usage_indent = indent
new_lines.append(line)
continue
if in_slot_usage:
if stripped and indent <= slot_usage_indent:
in_slot_usage = False
seen_keys.clear()
else:
# Check for keys at level 6 (slot usage items)
if indent == slot_usage_indent + 2:
key = stripped.split(':')[0]
if key in seen_keys:
print(f"Skipping duplicate key {key} in slot_usage")
# Skip this line AND subsequent lines until next key
continue
# This logic is too simple, need to skip block.
seen_keys.add(key)
new_lines.append(line)
# Since simple skipping is hard line-by-line, let's use the fix_duplicate_keys.py approach again.

View file

@ -0,0 +1,82 @@
import os
filepath = 'schemas/20251121/linkml/modules/classes/FinancialStatement.yaml'
with open(filepath, 'r') as f:
lines = f.readlines()
new_lines = []
skip = False
for i, line in enumerate(lines):
# In slot_usage for has_or_had_net_asset, there is a nested has_or_had_expenses
# which is likely indentation error or copy-paste error.
# line 369: has_or_had_net_asset:
# line 370: range: decimal
# line 371: required: false
# line 372: has_or_had_expenses: <-- This should not be here?
# It seems block is accidentally indented under .
# It should be a sibling slot usage?
# But is already imported.
# Let's inspect the line indent.
stripped = line.strip()
if stripped.startswith('has_or_had_expenses:'):
# Check indentation.
indent = len(line) - len(line.lstrip())
# slot_usage is at 4 spaces.
# has_or_had_net_asset is at 6 spaces.
# properties of has_or_had_net_asset (range, required) are at 8 spaces.
# If is at 8 spaces, it's inside definition.
# If it's at 6 spaces, it's a new slot usage entry (which is correct).
if indent == 8:
# It's wrongly indented inside has_or_had_net_asset?
# Or is it providing examples/defaults?
# The structure looks like:
# has_or_had_net_asset:
# range: decimal
# required: false
# has_or_had_expenses: ...
# This key is invalid for a SlotDefinition unless it's an annotation?
# But here it contains a list of values.
# It looks like an example block that got misplaced as a property key?
# Looking at the content:
# has_or_had_expenses:
# - value:
# - has_or_had_type: PROGRAM
# This looks like content?
# Let's see if we can just dedent it to 6 spaces to make it a slot usage?
# But is already defined in list.
# Does have slot? Yes.
# So at 6 spaces would define usage for that slot.
# Let's check output around line 372.
# has_or_had_net_asset:
# range: decimal
# required: false
# has_or_had_expenses:
# - value: ...
# Yes, it's at same level as .
# If I dedent it to 6 spaces, it becomes a slot_usage entry.
# BUT slot usage might already exist?
# No, I don't see another one in the file read output.
# So the fix is to dedent and its block.
pass
new_lines.append(line)
# Let's write a script to fix indentation.

View file

@ -0,0 +1,26 @@
import os
filepath = 'schemas/20251121/linkml/modules/classes/FinancialStatement.yaml'
with open(filepath, 'r') as f:
lines = f.readlines()
new_lines = []
for i, line in enumerate(lines):
# Locate the specific misplaced line
# It was (8 spaces) under (6 spaces).
# It should be (6 spaces) as a sibling slot_usage.
# BUT wait, the previous inspection showed followed by .
# That suggests it was an EXAMPLE inside slot_usage? No, slot_usage defines constraints.
# examples are under key.
# If was under in , it's invalid unless it's a property of that slot (it isn't).
# If it was an example, it should be under .
# Let's look at the file content again (after revert).
pass
# We need to read it first to know what to fix.

48
fix_self_imports.py Normal file
View file

@ -0,0 +1,48 @@
import os
def fix_file(path):
filename = os.path.basename(path)
classname = filename.replace('.yaml', '')
with open(path, 'r') as f:
lines = f.readlines()
new_lines = []
in_imports = False
modified = False
for line in lines:
stripped = line.strip()
if stripped == "imports:":
in_imports = True
new_lines.append(line)
continue
if in_imports:
if not stripped.startswith("-"):
if stripped and not stripped.startswith("#"):
in_imports = False
new_lines.append(line)
else:
import_path = stripped.lstrip("- ").strip()
# Check for self-import: - ./ClassName
if import_path == f"./{classname}":
print(f"Removing self-import in {path}: {stripped}")
modified = True
continue
else:
new_lines.append(line)
else:
new_lines.append(line)
if modified:
with open(path, 'w') as f:
f.writelines(new_lines)
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
fix_file(os.path.join(root, file))
process_directory("schemas/20251121/linkml/modules/classes")

51
fix_type_types_cycle.py Normal file
View file

@ -0,0 +1,51 @@
import os
def fix_file(path):
filename = os.path.basename(path)
if not filename.endswith("Type.yaml"):
return
classname = filename.replace('.yaml', '')
plural_classname = classname + "s"
with open(path, 'r') as f:
lines = f.readlines()
new_lines = []
in_imports = False
modified = False
for line in lines:
stripped = line.strip()
if stripped == "imports:":
in_imports = True
new_lines.append(line)
continue
if in_imports:
if not stripped.startswith("-"):
if stripped and not stripped.startswith("#"):
in_imports = False
new_lines.append(line)
else:
import_path = stripped.lstrip("- ").strip()
if import_path == f"./{plural_classname}":
print(f"Removing cycle import in {path}: {stripped}")
modified = True
continue
else:
new_lines.append(line)
else:
new_lines.append(line)
if modified:
with open(path, 'w') as f:
f.writelines(new_lines)
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
fix_file(os.path.join(root, file))
process_directory("schemas/20251121/linkml/modules/classes")

65
fix_types_imports.py Normal file
View file

@ -0,0 +1,65 @@
import os
def fix_file(path):
filename = os.path.basename(path)
if not (filename.endswith("Types.yaml") or filename.endswith("RecordSetTypes.yaml")):
return
if filename.endswith("Types.yaml"):
singular_filename = filename.replace('Types.yaml', 'Type.yaml')
classname_type = filename.replace('.yaml', '')[:-1] # Remove s
# RecordSetTypes is special?
# AcademicArchiveRecordSetTypes.yaml -> AcademicArchiveRecordSetType.yaml
# AcademicArchiveRecordSetType (class)
if filename.endswith("RecordSetTypes.yaml"):
singular_filename = filename.replace('RecordSetTypes.yaml', 'RecordSetType.yaml')
classname_type = filename.replace('.yaml', '')[:-1] # Remove s
singular_path = os.path.join(os.path.dirname(path), singular_filename)
if not os.path.exists(singular_path):
# Maybe irregular plural?
return
# Check if imported
with open(path, 'r') as f:
lines = f.readlines()
content = ''.join(lines)
import_stmt = f"- ./{classname_type}"
# Actually, filename without extension is usually the class name, but imports use filename (without ext).
import_stmt_file = f"- ./{singular_filename.replace('.yaml', '')}"
if import_stmt_file in content:
return
# Add import
new_lines = []
in_imports = False
added = False
for line in lines:
stripped = line.strip()
if stripped == "imports:":
in_imports = True
new_lines.append(line)
# Add immediately
new_lines.append(f" {import_stmt_file}\n")
added = True
continue
new_lines.append(line)
if added:
print(f"Restoring import in {path}: {import_stmt_file}")
with open(path, 'w') as f:
f.writelines(new_lines)
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
fix_file(os.path.join(root, file))
process_directory("schemas/20251121/linkml/modules/classes")

37
flatten_slot_ranges.py Normal file
View file

@ -0,0 +1,37 @@
import os
import yaml
def flatten_ranges(path):
with open(path, 'r') as f:
lines = f.readlines()
new_lines = []
primitives = ["string", "integer", "float", "boolean", "date", "datetime", "uriorcurie", "uri", "ncname", "objectidentifier", "time", "decimal", "double"]
modified = False
for line in lines:
stripped = line.strip()
if stripped.startswith("range:") and ":" in stripped:
parts = stripped.split(":")
if len(parts) >= 2:
range_val = parts[1].strip()
if range_val not in primitives and not range_val.startswith("string"): # handle string(...)
print(f"Flattening range in {path}: {range_val} -> uriorcurie")
new_lines.append(f" range: uriorcurie\n")
new_lines.append(f" # range: {range_val}\n")
modified = True
continue
new_lines.append(line)
if modified:
with open(path, 'w') as f:
f.writelines(new_lines)
def process_directory(directory):
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".yaml"):
flatten_ranges(os.path.join(root, file))
process_directory("schemas/20251121/linkml/modules/slots")

View file

@ -81,9 +81,8 @@ imports:
- modules/metadata
# Shared slots
- modules/slots/description
- modules/slots/website
- modules/slots/contact_email
- modules/slots/has_or_had_email
# Supporting classes
- modules/classes/Country

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,13 @@
id: https://nde.nl/ontology/hc/class/APIEndpoint
name: APIEndpoint
title: APIEndpoint
description: An API endpoint.
prefixes:
linkml: https://w3id.org/linkml/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
rico: https://www.ica.org/standards/RiC/ontology#
wd: http://www.wikidata.org/entity/
classes:
APIEndpoint:
class_uri: schema:EntryPoint
@ -9,17 +19,7 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
dcterms: http://purl.org/dc/terms/
prov: http://www.w3.org/ns/prov#
crm: http://www.cidoc-crm.org/cidoc-crm/
skos: http://www.w3.org/2004/02/skos/core#
rdfs: http://www.w3.org/2000/01/rdf-schema#
org: http://www.w3.org/ns/org#
xsd: http://www.w3.org/2001/XMLSchema#
imports:
- linkml:types
- ../slots/has_or_had_description
- ../slots/has_or_had_url

View file

@ -1,6 +1,23 @@
id: https://nde.nl/ontology/hc/class/APIRequest
name: APIRequest
title: APIRequest
description: An API request event.
prefixes:
linkml: https://w3id.org/linkml/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
rico: https://www.ica.org/standards/RiC/ontology#
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_endpoint
- ../slots/has_or_had_provenance
- ../slots/has_or_had_version
classes:
APIRequest:
class_uri: prov:Activity
close_mappings:
- schema:Action
description: An API request event.
slots:
- has_or_had_provenance
@ -10,4 +27,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -1,3 +1,17 @@
id: https://nde.nl/ontology/hc/class/APIVersion
name: APIVersion
title: APIVersion
description: Version of an API.
prefixes:
linkml: https://w3id.org/linkml/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
rico: https://www.ica.org/standards/RiC/ontology#
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
classes:
APIVersion:
class_uri: schema:SoftwareApplication
@ -9,4 +23,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -29,4 +29,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -9,27 +9,27 @@ prefixes:
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_hypernym
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
- ../slots/has_or_had_scope
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/hold_or_held_record_set_type
- ../slots/is_or_was_related_to
- ../slots/specificity_annotation
- ./AcademicArchiveRecordSetType
- ./AcademicArchiveRecordSetTypes
- ./ArchiveOrganizationType
- ./CollectionType
- ./AcademicArchiveRecordSetTypes
- ../slots/has_or_had_scope
- ./Scope
- ../slots/hold_or_held_record_set_type
- ../slots/has_or_had_type
- ../slots/dual_class_link
- ../slots/has_or_had_hypernym
- ../slots/has_or_had_label
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/is_or_was_related_to
- ./DualClassLink
- ./Scope
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ./WikidataAlignment
- ./WikiDataEntry
- ./AcademicArchiveRecordSetType
- ./WikidataAlignment
classes:
AcademicArchive:
is_a: ArchiveOrganizationType
@ -37,7 +37,6 @@ classes:
description: Archive of a higher education institution (university, college, polytechnic).
slots:
- has_or_had_type
- dual_class_link
- hold_or_held_record_set_type
- has_or_had_hypernym
- has_or_had_label
@ -69,32 +68,24 @@ classes:
- faculty papers
- research documentation
- university publications
- ephemera
- campus photographs
- audiovisual materials
- campus life documentation
slot_usage:
hold_or_held_record_set_type:
equals_expression: '["hc:UniversityAdministrativeFonds", "hc:StudentRecordSeries", "hc:FacultyPaperCollection", "hc:CampusDocumentationCollection"]
'
has_or_had_identifier:
pattern: ^Q[0-9]+$
description: Wikidata identifier for Academic Archive concept (Q27032435)
has_or_had_type:
equals_expression: '["hc:ArchiveOrganizationType"]'
is_or_was_related_to:
range: WikidataAlignment
inlined: true
has_or_had_hypernym:
description: MIGRATED from broader_concept (Rule 53). SKOS broader (parent) concept in the archive type hierarchy.
equals_expression: '["wd:Q166118"]'
has_or_had_label:
description: Human-readable label for the broader concept. Stored for display to avoid repeated lookups. MIGRATED from broader_concept_label (2026-01-15) per Rule 53.
ifabsent: string(archive)
dual_class_link:
range: DualClassLink
inlined: true
exact_mappings:
- wd:Q27032435
close_mappings:
@ -122,4 +113,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -9,47 +9,36 @@ prefixes:
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ./CollectionType
- ../slots/has_or_had_type
- ../slots/dual_class_link
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/has_or_had_scope
- ./Scope
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/is_or_was_related_to
- ../slots/specificity_annotation
- ./CollectionType
- ./DualClassLink
- ./Scope
- ./WikidataAlignment
classes:
AcademicArchiveRecordSetType:
description: A rico:RecordSetType for classifying collections of academic and higher education institutional records.
description: A rico:RecordSetType for classifying collections of academic and
higher education institutional records.
is_a: CollectionType
class_uri: rico:RecordSetType
slots:
- has_or_had_type
- dual_class_link
- specificity_annotation
- has_or_had_score
- has_or_had_scope
- is_or_was_related_to
attributes:
has_or_had_scope:
range: Scope
multivalued: true
inlined_as_list: true
description: 'Structured scope definitions for AcademicArchiveRecordSetType.
Formally documents what types of record sets are classified under this type.
'
comments:
- Collection type class for academic/higher education record sets
- Part of dual-class pattern with AcademicArchive (custodian type)
structured_aliases:
- literal_form: Hochschularchivbestand
in_language: de
- literal_form: "fondo de archivo acad\xE9mico"
- literal_form: fondo de archivo académico
in_language: es
- literal_form: "fonds d'archives acad\xE9miques"
- literal_form: fonds d'archives académiques
in_language: fr
- literal_form: academisch archiefbestand
in_language: nl
@ -59,9 +48,6 @@ classes:
is_or_was_related_to:
range: WikidataAlignment
inlined: true
dual_class_link:
range: DualClassLink
inlined: true
exact_mappings:
- wd:Q27032435
- rico:RecordSetType
@ -79,5 +65,4 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'

View file

@ -13,47 +13,38 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ./AcademicArchiveRecordSetType
- ./AcademicArchive
- ../slots/has_or_had_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/privacy_note
- ../slots/record_note
- ../slots/record_set_type
- ../slots/scope_exclude
- ../slots/scope_include
- ../slots/specificity_annotation
- ./AcademicArchive
- ./AcademicArchiveRecordSetType
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/privacy_note
- ../slots/record_note
- ../slots/record_set_type
- ../slots/scope_exclude
- ../slots/scope_include
- ../slots/has_or_had_type
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/privacy_note
- ../slots/record_note
- ../slots/record_set_type
- ../slots/scope_exclude
- ../slots/scope_include
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/privacy_note
- ../slots/record_note
- ../slots/record_set_type
- ../slots/scope_exclude
- ../slots/scope_include
- ../slots/specificity_annotation
- ../slots/has_or_had_score
classes:
UniversityAdministrativeFonds:
is_a: AcademicArchiveRecordSetType
class_uri: rico:RecordSetType
description: "A rico:RecordSetType for university administrative records organized as a fonds.\n\n**Definition**:\nRecords created or accumulated by a university's central administration in the \nexercise of governance, policy-making, and operational functions. Organized \naccording to archival principles of provenance (respect des fonds).\n\n**Typical Contents**:\n- Governance records (board minutes, resolutions, bylaws)\n- Committee records (senate, faculty councils, standing committees)\n- Policy records (institutional policies, procedures, guidelines)\n- Strategic planning documents\n- Accreditation and institutional assessment records\n- Executive correspondence\n\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType. Records classified with this\ntype follow the fonds organizational principle as defined by rico-rst:Fonds\n(respect des fonds / provenance-based organization from university central administration).\n"
description: "A rico:RecordSetType for university administrative records organized\
\ as a fonds.\n\n**Definition**:\nRecords created or accumulated by a university's\
\ central administration in the \nexercise of governance, policy-making, and\
\ operational functions. Organized \naccording to archival principles of provenance\
\ (respect des fonds).\n\n**Typical Contents**:\n- Governance records (board\
\ minutes, resolutions, bylaws)\n- Committee records (senate, faculty councils,\
\ standing committees)\n- Policy records (institutional policies, procedures,\
\ guidelines)\n- Strategic planning documents\n- Accreditation and institutional\
\ assessment records\n- Executive correspondence\n\n**RiC-O Alignment**:\nThis\
\ class is a specialized rico:RecordSetType. Records classified with this\n\
type follow the fonds organizational principle as defined by rico-rst:Fonds\n\
(respect des fonds / provenance-based organization from university central administration).\n"
structured_aliases:
- literal_form: Hochschulverwaltungsbestand
in_language: de
@ -82,6 +73,8 @@ classes:
- rico-rst:Fonds
broad_mappings:
- wd:Q1643722
- rico:RecordSetType
- skos:Concept
close_mappings:
- skos:Concept
see_also:
@ -108,20 +101,34 @@ classes:
organizational_principle_uri:
equals_string: https://www.ica.org/standards/RiC/vocabularies/recordSetTypes#Fonds
record_note:
equals_string: This RecordSetType classifies record sets following the fonds principle. The fonds structure reflects provenance from university central administration.
equals_string: This RecordSetType classifies record sets following the fonds
principle. The fonds structure reflects provenance from university central
administration.
scope_include:
equals_string: '["governance records", "committee records", "policy records", "strategic planning", "accreditation records"]'
equals_string: '["governance records", "committee records", "policy records",
"strategic planning", "accreditation records"]'
scope_exclude:
equals_string: '["student records", "faculty papers", "research data"]'
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'
AcademicStudentRecordSeries:
is_a: AcademicArchiveRecordSetType
class_uri: rico:RecordSetType
description: "A rico:RecordSetType for student records organized as archival series.\n\n**Definition**:\nRecords documenting the academic careers and activities of students, typically \norganized as series within a larger university fonds. Subject to retention \nschedules and privacy regulations (FERPA in US, GDPR in EU, AVG in NL).\n\n**Typical Contents**:\n- Enrollment and registration records\n- Academic transcripts and grade records\n- Graduation records and diploma registers\n- Disciplinary records\n- Financial aid records\n- Student organization records\n\n**Privacy Considerations**:\nAccess restrictions typically apply due to personally identifiable information.\nHistorical student records (typically 75+ years) may have fewer restrictions.\n\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType. Records classified with this\ntype follow the series organizational principle as defined by rico-rst:Series\n(organizational level within the university fonds).\n"
description: "A rico:RecordSetType for student records organized as archival series.\n\
\n**Definition**:\nRecords documenting the academic careers and activities of\
\ students, typically \norganized as series within a larger university fonds.\
\ Subject to retention \nschedules and privacy regulations (FERPA in US, GDPR\
\ in EU, AVG in NL).\n\n**Typical Contents**:\n- Enrollment and registration\
\ records\n- Academic transcripts and grade records\n- Graduation records and\
\ diploma registers\n- Disciplinary records\n- Financial aid records\n- Student\
\ organization records\n\n**Privacy Considerations**:\nAccess restrictions typically\
\ apply due to personally identifiable information.\nHistorical student records\
\ (typically 75+ years) may have fewer restrictions.\n\n**RiC-O Alignment**:\n\
This class is a specialized rico:RecordSetType. Records classified with this\n\
type follow the series organizational principle as defined by rico-rst:Series\n\
(organizational level within the university fonds).\n"
structured_aliases:
- literal_form: Studentenaktenserie
in_language: de
@ -150,6 +157,8 @@ classes:
- rico-rst:Series
broad_mappings:
- wd:Q185583
- rico:RecordSetType
- skos:Concept
close_mappings:
- skos:Concept
see_also:
@ -178,17 +187,33 @@ classes:
organizational_principle_uri:
equals_string: https://www.ica.org/standards/RiC/vocabularies/recordSetTypes#Series
record_note:
equals_string: This RecordSetType classifies record sets following the series principle. Typically a series within the university administration fonds or registrar's office fonds.
equals_string: This RecordSetType classifies record sets following the series
principle. Typically a series within the university administration fonds
or registrar's office fonds.
scope_include:
equals_string: '["enrollment records", "academic transcripts", "graduation records", "disciplinary records", "financial aid records"]'
equals_string: '["enrollment records", "academic transcripts", "graduation
records", "disciplinary records", "financial aid records"]'
scope_exclude:
equals_string: '["faculty records", "research records", "administrative policy"]'
privacy_note:
equals_string: Subject to educational records privacy laws (FERPA, GDPR, AVG). Access restrictions typically apply for records less than 75 years old.
equals_string: Subject to educational records privacy laws (FERPA, GDPR, AVG). Access
restrictions typically apply for records less than 75 years old.
FacultyPaperCollection:
is_a: AcademicArchiveRecordSetType
class_uri: rico:RecordSetType
description: "A rico:RecordSetType for faculty papers and personal archives.\n\n**Definition**:\nPersonal papers of faculty members documenting their academic careers, research \nactivities, teaching, and professional service. These are typically acquired as \ndonations or bequests, distinct from official university records.\n\n**Typical Contents**:\n- Research documentation and notes\n- Correspondence (professional and personal)\n- Lecture notes and course materials\n- Manuscripts and drafts\n- Conference papers and presentations\n- Professional organization records\n- Photographs and audiovisual materials\n\n**Provenance**:\nUnlike administrative fonds, faculty papers are personal archives with the \nindividual faculty member as creator/accumulator. The university acquires \ncustody but respects original order where it exists.\n\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType. Records classified with this\ntype follow the fonds organizational principle as defined\
description: "A rico:RecordSetType for faculty papers and personal archives.\n\
\n**Definition**:\nPersonal papers of faculty members documenting their academic\
\ careers, research \nactivities, teaching, and professional service. These\
\ are typically acquired as \ndonations or bequests, distinct from official\
\ university records.\n\n**Typical Contents**:\n- Research documentation and\
\ notes\n- Correspondence (professional and personal)\n- Lecture notes and course\
\ materials\n- Manuscripts and drafts\n- Conference papers and presentations\n\
- Professional organization records\n- Photographs and audiovisual materials\n\
\n**Provenance**:\nUnlike administrative fonds, faculty papers are personal\
\ archives with the \nindividual faculty member as creator/accumulator. The\
\ university acquires \ncustody but respects original order where it exists.\n\
\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType. Records\
\ classified with this\ntype follow the fonds organizational principle as defined\
\ by rico-rst:Fonds\n(personal papers fonds with the faculty member as creator/accumulator).\n"
structured_aliases:
- literal_form: Professorennachlass
@ -205,11 +230,8 @@ classes:
- personal papers
- faculty papers
- research documentation
- correspondence
- lecture notes
- course materials
- manuscripts
- drafts
- conference papers
- professional papers
- academic papers
@ -219,6 +241,8 @@ classes:
- rico-rst:Fonds
broad_mappings:
- wd:Q22075301
- rico:RecordSetType
- skos:Concept
close_mappings:
- skos:Concept
- bf:Archival
@ -227,7 +251,8 @@ classes:
- rico:RecordSetType
- rico-rst:Fonds
annotations:
acquisition_note: Typically acquired through donation or bequest. May include restrictions on access or publication specified by donor agreement.
acquisition_note: Typically acquired through donation or bequest. May include
restrictions on access or publication specified by donor agreement.
slots:
- has_or_had_type
- specificity_annotation
@ -248,16 +273,32 @@ classes:
organizational_principle_uri:
equals_string: https://www.ica.org/standards/RiC/vocabularies/recordSetTypes#Fonds
record_note:
equals_string: This RecordSetType classifies record sets following the fonds principle. Personal archives with individual faculty member as creator/accumulator.
equals_string: This RecordSetType classifies record sets following the fonds
principle. Personal archives with individual faculty member as creator/accumulator.
scope_include:
equals_string: '["research documentation", "correspondence", "lecture notes", "manuscripts", "conference papers"]'
equals_string: '["research documentation", "correspondence", "lecture notes",
"manuscripts", "conference papers"]'
scope_exclude:
equals_string: '["official university records", "student records", "administrative files"]'
equals_string: '["official university records", "student records", "administrative
files"]'
CampusDocumentationCollection:
is_a: AcademicArchiveRecordSetType
class_uri: rico:RecordSetType
description: "A rico:RecordSetType for campus life and institutional documentation.\n\n**Definition**:\nMaterials documenting campus life, institutional identity, and university \nculture beyond formal administrative records. Often includes visual materials, \npublications, and ephemera that capture the lived experience of the institution.\n\n**Typical Contents**:\n- Campus photographs and audiovisual materials\n- University publications (yearbooks, newspapers, magazines)\n- Ephemera (programs, posters, invitations)\n- Memorabilia and artifacts\n- Oral histories\n- Event documentation\n- Building and facilities documentation\n\n**Collection Nature**:\nMay be assembled collections (artificial) rather than strictly provenance-based,\nespecially for ephemera and visual materials. Documentation value often takes\nprecedence over strict archival arrangement.\n\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType. Records classified with this\ntype follow the collection organizational\
\ principle as defined by rico-rst:Collection\n(assembled/artificial collection organized by subject or documentation purpose).\n"
description: "A rico:RecordSetType for campus life and institutional documentation.\n\
\n**Definition**:\nMaterials documenting campus life, institutional identity,\
\ and university \nculture beyond formal administrative records. Often includes\
\ visual materials, \npublications, and ephemera that capture the lived experience\
\ of the institution.\n\n**Typical Contents**:\n- Campus photographs and audiovisual\
\ materials\n- University publications (yearbooks, newspapers, magazines)\n\
- Ephemera (programs, posters, invitations)\n- Memorabilia and artifacts\n-\
\ Oral histories\n- Event documentation\n- Building and facilities documentation\n\
\n**Collection Nature**:\nMay be assembled collections (artificial) rather than\
\ strictly provenance-based,\nespecially for ephemera and visual materials.\
\ Documentation value often takes\nprecedence over strict archival arrangement.\n\
\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType. Records\
\ classified with this\ntype follow the collection organizational principle\
\ as defined by rico-rst:Collection\n(assembled/artificial collection organized\
\ by subject or documentation purpose).\n"
structured_aliases:
- literal_form: Campus-Dokumentationssammlung
in_language: de
@ -273,10 +314,7 @@ classes:
- campus photographs
- audiovisual materials
- university publications
- yearbooks
- student newspapers
- ephemera
- memorabilia
- oral histories
- event documentation
- building documentation
@ -287,6 +325,8 @@ classes:
- rico-rst:Collection
broad_mappings:
- wd:Q9388534
- rico:RecordSetType
- skos:Concept
close_mappings:
- skos:Concept
- schema:Collection
@ -295,7 +335,8 @@ classes:
- rico:RecordSetType
- rico-rst:Collection
annotations:
collection_nature_note: Often includes artificial/assembled collections organized by subject, format, or documentation purpose rather than strict provenance.
collection_nature_note: Often includes artificial/assembled collections organized
by subject, format, or documentation purpose rather than strict provenance.
slots:
- has_or_had_type
- specificity_annotation
@ -316,8 +357,11 @@ classes:
organizational_principle_uri:
equals_string: https://www.ica.org/standards/RiC/vocabularies/recordSetTypes#Collection
record_note:
equals_string: This RecordSetType classifies record sets following the collection principle. May be assembled collection (artificial) organized by subject or documentation purpose.
equals_string: This RecordSetType classifies record sets following the collection
principle. May be assembled collection (artificial) organized by subject
or documentation purpose.
scope_include:
equals_string: '["photographs", "audiovisual materials", "publications", "ephemera", "oral histories", "memorabilia"]'
equals_string: '["photographs", "audiovisual materials", "publications", "ephemera",
"oral histories", "memorabilia"]'
scope_exclude:
equals_string: '["administrative records", "student records", "faculty papers"]'

View file

@ -20,4 +20,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -20,4 +20,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -1,52 +1,38 @@
# Access class
# Structured access information for heritage collections and services
#
# Created per slot_fixes.yaml revision for collection_access migration
# Generation date: 2026-01-19
# Rule compliance: 53 (slot_fixes.yaml), 39 (RiC-O naming)
id: https://nde.nl/ontology/hc/class/Access
name: Access
title: Access Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
dcterms: http://purl.org/dc/terms/
crm: http://www.cidoc-crm.org/cidoc-crm/
default_prefix: hc
imports:
- linkml:types
- ../metadata
- ./TimeSpan
- ../slots/has_or_had_frequency
- ./Frequency
- ../slots/condition_of_access
- ../slots/has_or_had_type
- ../slots/has_or_had_description
- ../slots/has_or_had_user_category
- ../enums/AccessTypeEnum
- ../metadata
- ../slots/has_or_had_description
- ../slots/has_or_had_frequency
- ../slots/has_or_had_type
- ../slots/has_or_had_user_category
- ../slots/temporal_extent
- ./Frequency
- ./TimeSpan
classes:
Access:
class_uri: dcterms:RightsStatement
description: |
Structured access information for heritage collections, services, or facilities.
**Purpose**:
Replaces simple string descriptions of access conditions with structured
data capturing access types, eligible users, conditions, and restrictions.
**Key Properties**:
- `has_or_had_type`: Type of access (PUBLIC, BY_APPOINTMENT, RESTRICTED, etc.)
- `has_or_had_user_category`: Who can access (public, students, faculty, researchers)
- `condition_of_access`: Conditions or requirements for access
- `has_or_had_description`: Free-text description
- `temporal_extent`: When this access policy applies
**Access Types**:
- PUBLIC: Open to general public
- BY_APPOINTMENT: Requires advance appointment
@ -56,101 +42,63 @@ classes:
- RESTRICTED: Limited access with specific conditions
- CLOSED: Not currently accessible
- DIGITAL_ONLY: Available only in digital form
**Ontological Alignment**:
- **Primary**: `dcterms:RightsStatement` - Dublin Core rights statement
- **Close**: `schema:publicAccess` - Schema.org access indicator
- **Related**: `crm:E30_Right` - CIDOC-CRM rights
exact_mappings:
- dcterms:RightsStatement
close_mappings:
- schema:publicAccess
related_mappings:
- crm:E30_Right
slots:
- has_or_had_type
- has_or_had_user_category
- condition_of_access
- has_or_had_description
- temporal_extent
- is_digital_access
- has_or_had_frequency
slot_usage:
has_or_had_type:
range: AccessTypeEnum
required: true
description: Type of access offered
has_or_had_user_category:
required: false
description: |
Categories of users eligible for this access.
Examples: "enrolled students", "faculty", "visiting scholars",
"credentialed researchers", "general public"
examples:
- value: "enrolled students"
- value: "faculty and staff"
- value: "visiting researchers with credentials"
temporal_extent:
required: false
range: TimeSpan
inlined: true
description: |
Time period during which this access policy applies.
Useful for temporary restrictions or seasonal access.
is_digital_access:
required: false
range: boolean
description: Whether this is digital access
has_or_had_frequency:
required: false
range: Frequency
description: Frequency of access (e.g., daily, weekly, by appointment)
inlined: true
examples:
- value:
has_or_had_label: "Daily"
description: Access available daily
annotations:
specificity_score: 0.50
specificity_rationale: "Moderately specific - applies to collection and service access contexts"
custodian_types: '["*"]'
custodian_types_rationale: "All institution types offer some form of access"
comments:
- "Created per slot_fixes.yaml revision for collection_access migration"
- "Replaces string-based collection_access with structured access data"
- "RULE 53: Part of collection_access → offers_or_offered_access + Access migration"
examples:
- value:
has_or_had_type: PUBLIC
has_or_had_description: "Open to general public during gallery hours"
has_or_had_user_category:
- "general public"
condition_of_access:
- "during posted gallery hours"
description: "Public access during gallery hours"
- value:
has_or_had_type: BY_APPOINTMENT
has_or_had_user_category:
- "credentialed researchers"
- "graduate students with faculty sponsor"
condition_of_access:
- "48-hour advance booking required"
- "handling training required for original materials"
- "fragile materials limited to supervised viewing only"
description: "Research access by appointment with conditions"
- value:
has_or_had_type: ACADEMIC
has_or_had_description: "Open to enrolled students and faculty; public by appointment"
@ -158,16 +106,8 @@ classes:
- "enrolled students"
- "faculty"
- "research staff"
condition_of_access:
- "valid university ID"
is_digital_access: false
description: "Academic community access with public by appointment"
- value:
has_or_had_type: DIGITAL_ONLY
has_or_had_description: "Collection accessible only through online database"
has_or_had_user_category:
- "anyone with internet access"
is_digital_access: true
description: "Digital-only access"

View file

@ -8,8 +8,8 @@ prefixes:
schema: http://schema.org/
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/has_or_had_label
- ../slots/has_or_had_url
- ./URL
default_prefix: hc
@ -22,10 +22,9 @@ classes:
- has_or_had_url
slot_usage:
has_or_had_url:
range: URL
range: uri
inlined: true
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -20,4 +20,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -8,10 +8,10 @@ prefixes:
dcat: http://www.w3.org/ns/dcat#
imports:
- linkml:types
- ../slots/has_or_had_description
- ../slots/has_or_had_label
- ../slots/has_or_had_url
- ./URL
- ../slots/has_or_had_label
- ../slots/has_or_had_description
default_prefix: hc
classes:
AccessInterface:
@ -22,11 +22,10 @@ classes:
- has_or_had_description
slot_usage:
has_or_had_url:
range: URL
range: uri
inlined: true
required: true
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -20,4 +20,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -13,38 +13,36 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/temporal_extent
- ./TimeSpan
- ../slots/embargo_end_date
- ../slots/policy_id
- ../slots/policy_name
- ../slots/has_or_had_description
- ./Description
- ../slots/has_or_had_level
- ./AccessLevel
- ../slots/requires_appointment
- ../slots/poses_or_posed_condition
- ./Condition
- ../slots/credentials_required
- ../slots/cultural_protocol_url
- ../slots/embargo_reason
- ../slots/has_or_had_description
- ../slots/has_or_had_embargo_end_date
- ../slots/has_or_had_embargo_reason
- ../slots/has_or_had_level
- ../slots/has_or_had_score
- ../slots/imposes_or_imposed
- ./Fee
- ../slots/fee_required
- ../slots/legal_basis
- ../slots/policy_id
- ../slots/policy_name
- ../slots/poses_or_posed_condition
- ../slots/registration_required
- ../slots/requires_appointment
- ../slots/requires_or_required
- ../slots/review_date
- ../slots/rights_statement
- ../slots/rights_statement_url
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/temporal_extent
- ./AccessLevel
- ./Appointment
- ./Condition
- ./Description
- ./Fee
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/condition_of_access
- ../slots/requires_or_required
- ./Appointment
- ./TimeSpan
classes:
AccessPolicy:
class_uri: premis:RightsStatus
@ -66,14 +64,12 @@ classes:
- has_or_had_level
- requires_appointment
- poses_or_posed_condition
- condition_of_access
- requires_or_required
- credentials_required
- cultural_protocol_url
- embargo_end_date
- embargo_reason
- has_or_had_embargo_end_date
- has_or_had_embargo_reason
- imposes_or_imposed
- fee_required
- legal_basis
- policy_id
- policy_name
@ -91,25 +87,14 @@ classes:
identifier: true
examples:
- value: https://nde.nl/ontology/hc/access-policy/open-access
description: Standard open access policy
policy_name:
range: string
required: true
examples:
- value: Open Access
description: Public open access
- value: Researchers Only
description: Restricted to researchers
- value: Embargoed until 2050
description: Time-limited closure
has_or_had_level:
description: 'Access level of the policy.
MIGRATED from has_or_had_access_level per Rule 53.
Uses AccessLevel class.
'
range: AccessLevel
required: true
inlined: true
@ -121,32 +106,18 @@ classes:
- value:
has_or_had_label: EMBARGOED
has_or_had_description:
description: 'Description of the access policy.
MIGRATED from has_or_had_access_description per Rule 53.
Uses Description class.
'
range: Description
range: string
inlined: true
examples:
- value:
description_text: Open to all visitors during reading room hours (Mon-Fri 9-17)
description: Archive public access
- value:
description_text: Access restricted to academic researchers with institutional has_or_had_affiliation
description: University special collections
poses_or_posed_condition:
range: Condition
multivalued: true
inlined: true
inlined_as_list: true
description: 'Access conditions or requirements using structured Condition class.
MIGRATED from condition string slot per slot_fixes.yaml (Rule 53, 2026-01-22).
'
examples:
- value:
- has_or_had_type: AccessCondition
@ -155,118 +126,69 @@ classes:
- has_or_had_type: AccessCondition
has_or_had_description:
description_text: Registration form must be completed
description: Archive access conditions using Condition class
rights_statement:
range: string
examples:
- value: In Copyright
description: Copyright protected
- value: No Copyright - United States
description: Public domain (US)
rights_statement_url:
range: uri
examples:
- value: http://rightsstatements.org/vocab/InC/1.0/
description: In Copyright
- value: http://rightsstatements.org/vocab/NoC-US/1.0/
description: No Copyright - United States
requires_appointment:
range: boolean
description: 'Whether an appointment is required for access.
Uses schema:reservationRequired which is semantically correct for access policies.
'
examples:
- value: true
description: Appointment required
- value: false
description: Walk-in access
registration_required:
range: boolean
examples:
- value: true
description: Must register as reader
credentials_required:
range: string
examples:
- value: INSTITUTIONAL
description: Must be affiliated with research institution
fee_required:
range: boolean
examples:
- value: false
description: Free access
- value: true
description: Fee required
imposes_or_imposed:
description: 'Fees imposed by the access policy.
MIGRATED from fee_amount per Rule 53.
Uses Fee class with structured Quantity.
'
range: Fee
inlined: true
multivalued: true
examples:
- value:
has_or_had_quantity:
quantity_value: 5.0
has_or_had_unit:
unit_value: EUR
has_or_had_description: Daily reading room fee
description: "\u20AC5.00 per day"
- value:
has_or_had_quantity:
quantity_value: 0
has_or_had_description: Free for researchers
description: Free for researchers
- value:
has_or_had_quantity:
quantity_value: 10.0
has_or_had_unit:
unit_value: EUR
has_or_had_description: General public fee
description: "\u20AC10 for general public"
embargo_end_date:
has_or_had_embargo_end_date:
range: date
examples:
- value: '2050-01-01'
description: Embargo lifts January 1, 2050
embargo_reason:
has_or_had_embargo_reason:
range: string
examples:
- value: Donor privacy restrictions per deed of gift
description: Donor-imposed embargo
- value: Contains personal data protected under GDPR
description: Privacy law embargo
cultural_protocol_url:
range: uri
examples:
- value: https://localcontexts.org/tk-labels/
description: Traditional Knowledge labels
legal_basis:
range: string
examples:
- value: General Data Protection Regulation (GDPR)
description: EU privacy law
- value: Freedom of Information Act exemption 6
description: US FOIA exemption
review_date:
range: date
examples:
- value: '2025-12-31'
description: Annual review date
temporal_extent:
description: 'Validity period for this access policy using CIDOC-CRM TimeSpan.
MIGRATED from valid_from + valid_to per slot_fixes.yaml (Rule 53).
Uses begin_of_the_begin for policy start date and end_of_the_end for expiry.
'
range: TimeSpan
inlined: true
required: false
@ -274,34 +196,7 @@ classes:
- value:
begin_of_the_begin: '2024-01-01'
end_of_the_end: '2050-12-31'
description: Policy valid from 2024 until end of 2050
condition_of_access:
description: 'Textual conditions or requirements for access (RiC-O style).
Use for human-readable access requirements. For structured appointment
data, use requires_or_required with Appointment instances.
'
range: string
multivalued: true
examples:
- value:
- Appointment required 48 hours in advance
- Valid researcher credentials required
- Materials must be handled with cotton gloves
description: Multiple access conditions
requires_or_required:
description: 'Links to structured Appointment entities for rich appointment modeling.
ADDED 2026-01-17 per slot_fixes.yaml revision for appointment_required.
Use this for detailed appointment requirements (lead time, booking method,
contact info). For simple boolean, use requires_appointment instead.
'
range: Appointment
multivalued: true
inlined: true
@ -310,13 +205,6 @@ classes:
- appointment_id: hc:appointment/special-collections-48h
has_or_had_label: Special Collections Appointment
has_or_had_description: Book at least 48 hours in advance for manuscript access
lead_time_hours: 48
booking_method:
- email
- online_form
booking_contact: bijzondere.collecties@archive.nl
appointment_required: true
description: Structured appointment requirement with rich metadata
comments:
- AccessPolicy defines access conditions for Collection instances
- Used by Collection.access_policy_ref to link policies to holdings
@ -348,10 +236,7 @@ classes:
description_text: Original materials handled with gloves
registration_required: true
requires_appointment: false
fee_required: false
has_or_had_contact_point:
email: studiezaal@nationaalarchief.nl
description: Standard archive public access policy
- value:
policy_id: https://nde.nl/ontology/hc/access-policy/donor-embargo-2050
policy_name: Embargoed until 2050
@ -359,11 +244,10 @@ classes:
has_or_had_label: EMBARGOED
has_or_had_description:
description_text: Collection closed until 2050 per donor agreement
embargo_end_date: '2050-01-01'
embargo_reason: Donor privacy restrictions per deed of gift
has_or_had_embargo_end_date: '2050-01-01'
has_or_had_embargo_reason: Donor privacy restrictions per deed of gift
legal_basis: Deed of Gift clause 4.2
review_date: '2049-06-01'
description: Time-limited embargo policy
- value:
policy_id: https://nde.nl/ontology/hc/access-policy/dim-archive-preservation
policy_name: DIM Archive - Preservation Only
@ -381,8 +265,6 @@ classes:
requires_appointment: true
credentials_required: PROFESSIONAL
has_or_had_contact_point:
email: preservation@archive.org
description: Dark archive / DIM access policy
- value:
policy_id: https://nde.nl/ontology/hc/access-policy/special-collections-rich
policy_name: Special Collections - Rich Appointment Policy
@ -390,36 +272,17 @@ classes:
has_or_had_label: RESEARCHERS_ONLY
has_or_had_description:
description_text: Academic researchers with institutional affiliation
condition_of_access:
- Valid institutional ID required
- Letter of introduction from supervisor
- Maximum 5 items per visit
requires_or_required:
- appointment_id: hc:appointment/special-collections-booking
has_or_had_label: Special Collections Appointment
has_or_had_description: 'Appointments for manuscript and rare book collections must be made
at least 48 hours in advance. Please specify which materials you
wish to consult.
'
lead_time_hours: 48
booking_method:
- email
- online_form
booking_contact: bijzondere.collecties@archive.nl
confirmation_required: true
cancellation_notice_hours: 24
appointment_required: true
registration_required: true
credentials_required: INSTITUTIONAL
fee_required: false
has_or_had_contact_point:
email: special.collections@archive.nl
description: Rich appointment modeling with structured Appointment entity
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -23,4 +23,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -13,9 +13,8 @@ default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/has_or_had_label
classes:
AccessibilityFeature:
class_uri: schema:LocationFeatureSpecification
@ -23,8 +22,7 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
custodian_types: '["*"]'
slots:
- has_or_had_label

View file

@ -9,12 +9,12 @@ prefixes:
skos: http://www.w3.org/2004/02/skos/core#
imports:
- linkml:types
- ../slots/temporal_extent
- ./TimeSpan
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
- ../slots/temporal_extent
- ./Identifier
- ./TimeSpan
default_prefix: hc
classes:
AccessionEvent:
@ -31,4 +31,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -10,6 +10,8 @@ prefixes:
skos: http://www.w3.org/2004/02/skos/core#
imports:
- linkml:types
- ../slots/has_or_had_description
- ../slots/has_or_had_label
- ./Identifier
default_prefix: hc
classes:
@ -25,4 +27,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -14,7 +14,6 @@ default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_value
classes:
AccountIdentifier:
class_uri: schema:PropertyValue
@ -22,8 +21,7 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
custodian_types: '["*"]'
slots:
- has_or_had_value

View file

@ -14,7 +14,6 @@ default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
classes:
AccountStatus:
class_uri: skos:Concept
@ -22,8 +21,7 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
custodian_types: '["*"]'
slots:
- has_or_had_label

View file

@ -14,7 +14,6 @@ default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
classes:
Accreditation:
class_uri: schema:Permit
@ -22,8 +21,7 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
custodian_types: '["*"]'
slots:
- has_or_had_label

View file

@ -14,7 +14,6 @@ default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_name
classes:
AccreditationBody:
class_uri: schema:Organization
@ -22,8 +21,7 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
custodian_types: '["*"]'
slots:
- has_or_had_name

View file

@ -14,7 +14,6 @@ default_prefix: hc
imports:
- linkml:types
- ../slots/temporal_extent
classes:
AccreditationEvent:
class_uri: prov:Activity
@ -22,8 +21,7 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
custodian_types: '["*"]'
slots:
- temporal_extent

View file

@ -1,7 +1,21 @@
id: https://nde.nl/ontology/hc/class/Accumulation
name: Accumulation
title: Accumulation
description: The relation/period during which the records were accumulated.
prefixes:
linkml: https://w3id.org/linkml/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
rico: https://www.ica.org/standards/RiC/ontology#
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_description
- ../slots/temporal_extent
classes:
Accumulation:
class_uri: rico:Accumulation
description: The period during which the records were accumulated.
class_uri: rico:AccumulationRelation
description: The relation/period during which the records were accumulated.
slots:
- temporal_extent
- has_or_had_description
@ -9,4 +23,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -1,3 +1,18 @@
id: https://nde.nl/ontology/hc/class/AccuracyLevel
name: AccuracyLevel
title: Accuracy Level
description: A qualitative or quantitative level of accuracy (e.g. for coordinates).
prefixes:
linkml: https://w3id.org/linkml/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
rico: https://www.ica.org/standards/RiC/ontology#
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_description
- ../slots/has_or_had_label
- ../slots/has_or_had_value
classes:
AccuracyLevel:
class_uri: skos:Concept
@ -10,4 +25,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -16,14 +16,14 @@ prefixes:
xsd: http://www.w3.org/2001/XMLSchema#
imports:
- linkml:types
- ../slots/temporal_extent
- ./TimeSpan
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/specificity_annotation
- ../slots/temporal_extent
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ./TimeSpan
default_range: string
enums:
AcquisitionMethodEnum:
@ -60,15 +60,25 @@ enums:
classes:
Acquisition:
class_uri: crm:E8_Acquisition
description: 'Represents an acquisition event - how and when an object or specimen was obtained for a collection.
description: 'Represents an acquisition event - how and when an object or specimen
was obtained for a collection.
CIDOC-CRM E8 Acquisition models the transfer of legal ownership rights.
**Key properties**: - `temporal_extent`: When the acquisition occurred (TimeSpan with fuzzy boundaries for historical items) - `acquisition_method`: How the item was acquired (field collection, purchase, donation, etc.) - `acquisition_source`: From whom/where acquired (collector, dealer, previous owner, field location) - `acquisition_agent`: Who performed the acquisition (collector, curator, institution)
**Key properties**: - `temporal_extent`: When the acquisition occurred (TimeSpan
with fuzzy boundaries for historical items) - `acquisition_method`: How the
item was acquired (field collection, purchase, donation, etc.) - `acquisition_source`:
From whom/where acquired (collector, dealer, previous owner, field location)
- `acquisition_agent`: Who performed the acquisition (collector, curator, institution)
**Darwin Core alignment**: For biological specimens: - `temporal_extent` replaces `dwc:eventDate` (collection date) - `acquisition_source` can capture `dwc:locality` and `dwc:recordedBy`
**Darwin Core alignment**: For biological specimens: - `temporal_extent` replaces
`dwc:eventDate` (collection date) - `acquisition_source` can capture `dwc:locality`
and `dwc:recordedBy`
**Use cases**: - Museum object provenance (purchase from dealer, 1923) - Biological specimen collection (field collection, Amazon basin, 1750s) - Archival transfer (transferred from ministry archives, 2001) - Art donation (donated by artist''s estate, 2015)'
**Use cases**: - Museum object provenance (purchase from dealer, 1923) - Biological
specimen collection (field collection, Amazon basin, 1750s) - Archival transfer
(transferred from ministry archives, 2001) - Art donation (donated by artist''s
estate, 2015)'
exact_mappings:
- crm:E8_Acquisition
close_mappings:
@ -81,38 +91,25 @@ classes:
- temporal_extent
- specificity_annotation
- has_or_had_score
attributes:
acquisition_method:
range: AcquisitionMethodEnum
description: Method by which the item was acquired (field collection, purchase, donation, etc.).
acquisition_source:
range: string
description: 'Source from which item was acquired. Can be: - Person name (collector, donor, seller) - Institution name (transferring institution) - Location (field collection locality) - Dealer or auction house'
acquisition_agent:
range: string
description: Agent who performed the acquisition (collector name, curator, institution). For biological specimens, maps to dwc:recordedBy.
acquisition_location:
range: string
description: Location where acquisition occurred (field collection site, auction house location). For biological specimens, can capture field locality.
acquisition_reference:
range: string
description: Reference number or identifier for the acquisition (accession number, lot number).
acquisition_notes:
range: string
description: Additional notes about the acquisition event.
acquisition_date_text:
range: string
description: Original date text as recorded (e.g., "1750s", "pre-1662", "circa 1900"). For backward compatibility with string-based collection_date. The structured date should be in temporal_extent.
comments:
- Created per slot_fixes.yaml revision for collection_date migration
- Replaces simple collection_date string with structured acquisition event
- "RULE 53: Part of collection_date \u2192 was_acquired_through + Acquisition migration"
- 'RULE 53: Part of collection_date → was_acquired_through + Acquisition migration'
annotations:
specificity_score: 0.7
specificity_rationale: Fairly specific - applies to items with acquisition provenance
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'
examples:
- value: "# Biological specimen collected in the field\nacquisition_method: FIELD_COLLECTION\ntemporal_extent:\n begin_of_the_begin: \"1750-01-01\"\n end_of_the_end: \"1759-12-31\"\n notes: \"Collected sometime in the 1750s\"\nacquisition_source: \"Amazon basin, Brazil\"\nacquisition_agent: \"Unknown Dutch collector\"\nacquisition_date_text: \"1750s\"\n"
- value: "# Museum object purchased from dealer\nacquisition_method: PURCHASE\ntemporal_extent:\n begin_of_the_begin: \"1923-03-15\"\n end_of_the_end: \"1923-03-15\"\nacquisition_source: \"Sotheby's London\"\nacquisition_reference: \"Lot 245, Sale of March 1923\"\n"
- value: "# Historical specimen with uncertain date\nacquisition_method: FIELD_COLLECTION\ntemporal_extent:\n begin_of_the_begin: \"1600-01-01\"\n end_of_the_end: \"1662-12-31\"\n notes: \"Pre-1662 (before Great Fire of London)\"\nacquisition_date_text: \"pre-1662\"\n"
- value: "# Biological specimen collected in the field\nacquisition_method: FIELD_COLLECTION\n\
temporal_extent:\n begin_of_the_begin: \"1750-01-01\"\n end_of_the_end:\
\ \"1759-12-31\"\n notes: \"Collected sometime in the 1750s\"\nacquisition_source:\
\ \"Amazon basin, Brazil\"\nacquisition_agent: \"Unknown Dutch collector\"\
\nacquisition_date_text: \"1750s\"\n"
- value: "# Museum object purchased from dealer\nacquisition_method: PURCHASE\n\
temporal_extent:\n begin_of_the_begin: \"1923-03-15\"\n end_of_the_end:\
\ \"1923-03-15\"\nacquisition_source: \"Sotheby's London\"\nacquisition_reference:\
\ \"Lot 245, Sale of March 1923\"\n"
- value: "# Historical specimen with uncertain date\nacquisition_method: FIELD_COLLECTION\n\
temporal_extent:\n begin_of_the_begin: \"1600-01-01\"\n end_of_the_end:\
\ \"1662-12-31\"\n notes: \"Pre-1662 (before Great Fire of London)\"\nacquisition_date_text:\
\ \"pre-1662\"\n"

View file

@ -3,18 +3,13 @@ name: AcquisitionBudget
title: AcquisitionBudget
description: >-
Budget allocated for acquisitions.
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_amount
classes:
AcquisitionBudget:
class_uri: schema:MonetaryAmount
@ -22,8 +17,5 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
custodian_types: '["*"]'
slots:
- has_or_had_amount

View file

@ -9,14 +9,14 @@ prefixes:
skos: http://www.w3.org/2004/02/skos/core#
imports:
- linkml:types
- ../slots/has_or_had_origin
- ../slots/temporal_extent
- ./TimeSpan
- ../slots/has_or_had_method
- ./AcquisitionMethod
- ../slots/has_or_had_origin
- ../slots/has_or_had_provenance
- ./Provenance
- ../slots/temporal_extent
- ./AcquisitionMethod
- ./Entity
- ./Provenance
- ./TimeSpan
default_prefix: hc
classes:
AcquisitionEvent:
@ -34,4 +34,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -15,8 +15,8 @@ prefixes:
xsd: http://www.w3.org/2001/XMLSchema#
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/has_or_had_label
default_prefix: hc
classes:
AcquisitionMethod:
@ -28,4 +28,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -15,24 +15,27 @@ default_prefix: hc
imports:
- linkml:types
- ../metadata
- ./TimeSpan
- ../slots/has_or_had_description
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
- ../slots/has_or_had_score
- ../slots/has_or_had_status
- ../slots/is_or_was_succeeded_by
- ../slots/note
- ../slots/preceding_activity
- ../slots/specificity_annotation
- ../slots/temporal_extent
- ./ActivityType
- ./ActivityTypes
- ../slots/has_activity_identifier
- ../slots/has_or_had_identifier
- ./Identifier
- ../slots/has_or_had_label
- ./Label
- ../slots/has_or_had_description
- ./Description
- ../slots/has_activity_status
- ../slots/note
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ./Identifier
- ./Label
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ./TimeSpan
- ./Activity
classes:
Activity:
class_uri: prov:Activity
@ -50,7 +53,6 @@ classes:
- has_or_had_identifier
- has_or_had_label
- has_or_had_description
- has_or_had_activity_type
- temporal_extent
- is_or_was_succeeded_by
- preceding_activity
@ -60,108 +62,62 @@ classes:
- has_or_had_score
slot_usage:
has_or_had_identifier:
description: 'Unique identifier for this activity instance.
MIGRATED from has_activity_identifier per Rule 53.
Format: URI following NDE Heritage Custodian ontology conventions.
Pattern: `https://nde.nl/ontology/hc/activity/{custodian-slug}-{type}-{year}-{sequence}`
'
range: Identifier
range: uriorcurie
required: true
identifier: true
inlined: true
examples:
- value:
identifier_value: https://nde.nl/ontology/hc/activity/rijksmuseum-inventory-2025-001
description: 2025 inventory at Rijksmuseum
- value:
identifier_value: https://nde.nl/ontology/hc/activity/nationaal-archief-digitization-voc-2024
description: VOC digitization project at Nationaal Archief
has_or_had_label:
range: string
required: true
description: Human-readable name for this activity.
examples:
- value: 2025 Annual Collection Inventory
description: Recurring annual inventory
- value: VOC Archives Digitization Project Phase 2
description: Multi-year digitization project
has_or_had_description:
range: string
required: false
description: Detailed description of the activity scope and objectives.
examples:
- value: "Annual physical inventory of the Dutch Masters collection, \ncovering approximately 450 paintings. Spot-check methodology \nwith 20% sample verified against catalog records.\n"
description: Inventory activity description
has_or_had_activity_type:
range: ActivityType
required: true
multivalued: true
description: 'The type classification(s) for this activity.
Values are ActivityType subclasses from ActivityTypes.yaml.
'
examples:
- value: CurationActivityType
description: Curation activity
- value: '[DigitizationActivityType, ResearchActivityType]'
description: Combined digitization and research project
temporal_extent:
range: TimeSpan
required: false
inlined: true
description: 'Temporal extent of this activity.
Replaces has_timespan, start_date, end_date.
Uses CIDOC-CRM four-point temporal model for fuzzy bounds.
'
examples:
- value:
begin_of_the_begin: '2025-01-15'
end_of_the_end: '2025-03-31'
description: Q1 2025 activity period
is_or_was_succeeded_by:
range: Activity
range: string
multivalued: true
inlined: false
description: Activity/activities that follow this one.
examples:
- value: https://nde.nl/ontology/hc/activity/conservation-treatment-2025
description: Conservation follows condition survey
preceding_activity:
range: Activity
range: string
inlined: false
description: Activity that preceded this one.
examples:
- value: https://nde.nl/ontology/hc/activity/condition-survey-2024
description: Condition survey informed this conservation treatment
has_or_had_status:
range: string
required: false
description: Current status of the activity.
examples:
- value: IN_PROGRESS
description: Activity currently underway
- value: COMPLETED
description: Activity finished
- value: PLANNED
description: Activity scheduled for future
note:
range: string
multivalued: true
description: Additional notes about the activity.
annotations:
specificity_score: '0.50'
specificity_rationale: Moderately specific - Activity is a core domain concept but broadly applicable across all heritage custodian types.
has_or_had_score: null
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
comments:
- Base class for all heritage domain activities
- Extended by CurationActivity, ConservationActivity, etc.
@ -177,25 +133,18 @@ classes:
has_or_had_identifier:
identifier_value: https://nde.nl/ontology/hc/activity/rijksmuseum-inventory-2025-001
has_or_had_label: 2025 Annual Collection Inventory - Dutch Masters
has_or_had_activity_type:
- CurationActivityType
has_or_had_description: "Annual physical inventory of the Dutch Masters collection \n(Gallery of Honour and adjacent galleries). Spot-check methodology \nwith 20% sample verification against CMS records.\n"
temporal_extent:
begin_of_the_begin: '2025-01-15'
end_of_the_end: '2025-03-31'
has_or_had_status: IN_PROGRESS
description: Inventory activity at Rijksmuseum
- value:
has_or_had_identifier:
identifier_value: https://nde.nl/ontology/hc/activity/kb-digitization-medieval-2024
has_or_had_label: Medieval Manuscripts Digitization Project
has_or_had_activity_type:
- DigitizationActivityType
- ResearchActivityType
has_or_had_description: "High-resolution digitization of 342 medieval manuscripts with \nHTR processing and metadata enhancement. IIIF-compliant output.\n"
temporal_extent:
begin_of_the_begin: '2024-03-01'
end_of_the_end: '2025-12-31'
has_or_had_status: IN_PROGRESS
preceding_activity: https://nde.nl/ontology/hc/activity/kb-condition-survey-2023
description: Digitization and research project at KB

View file

@ -14,17 +14,17 @@ default_prefix: hc
imports:
- linkml:types
- ../slots/created
- ../slots/modified
- ../slots/has_or_had_identifier
- ./WikiDataIdentifier
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/has_or_had_description
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
- ../slots/has_or_had_score
- ../slots/modified
- ../slots/specificity_annotation
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ./WikiDataIdentifier
classes:
ActivityType:
class_uri: skos:Concept
@ -54,39 +54,23 @@ classes:
required: true
identifier: true
multivalued: true
description: 'Unique identifier(s) for this activity type.
MIGRATED from type_id per Rule 56 (2026-01-16).
Also includes Wikidata entity references (previously wikidata_entity).
'
examples:
- value: https://nde.nl/ontology/hc/activity-type/curation
description: Internal type identifier for curation
- value: wd:Q1348059
description: Wikidata entity for curation
has_or_had_label:
range: string
required: true
multivalued: true
description: 'Human-readable label for this activity type.
MIGRATED from type_label per slot_fixes.yaml (Rule 53).
'
examples:
- value:
- Curation@en
- curatie@nl
- Kuration@de
description: Multilingual labels for curation type
has_or_had_description:
range: string
required: false
examples:
- value: Activities related to the ongoing management and care of collections
description: Description of curation activity type
created:
range: datetime
modified:
@ -96,7 +80,6 @@ classes:
specificity_rationale: Moderately specific - activity types are domain-relevant but not specific to any single conversation template.
has_or_had_score: null
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
comments:
- Abstract base class - use specific subclasses (CurationType, ConservationType, etc.)
- Represents ACTIVITY TYPES, not activity instances
@ -117,4 +100,3 @@ classes:
- Curation@en
- curatie@nl
has_or_had_description: Activities related to ongoing collection management
description: Curation activity type with multilingual labels and identifiers

View file

@ -1,26 +1,23 @@
id: https://nde.nl/ontology/hc/class/ActivityTypes
name: ActivityTypes
title: ActivityTypes
description: >-
Container for ActivityType instances.
description: Container for ActivityType instances.
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
default_prefix: hc
imports:
- linkml:types
- ./ActivityType
classes:
ActivityTypes:
class_uri: hc:ActivityTypes
description: Activity types container.
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
specificity_rationale: Generic utility class created during migration
custodian_types: '["*"]'
tree_root: true
broad_mappings:
- crm:E7_Activity
- schema:Action

View file

@ -22,4 +22,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -1,12 +1,6 @@
# Address - Generic postal/physical address class
# Aligned with vCard, Schema.org, LOCN, GLEIF ontologies
# Created: 2026-01-12
# Rule 38 compliant: All slots imported from modules/slots/
id: https://nde.nl/ontology/hc/class/Address
name: address_class
title: Address Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
@ -17,63 +11,44 @@ prefixes:
org: http://www.w3.org/ns/org#
dcterms: http://purl.org/dc/terms/
skos: http://www.w3.org/2004/02/skos/core#
imports:
- linkml:types
# REMOVED 2026-01-22: ../slots/address_formatted - migrated to has_or_had_label + Label (Rule 53, Feedback F1)
# REMOVED: ../slots/address_type - migrated to has_or_had_type (2026-01-17, Rule 53/56)
# Address component slots
- ../slots/has_or_had_section
# REMOVED: ../slots/street_name - migrated to has_or_had_label + Label (2026-01-17, Rule 53/56)
# REMOVED: ../slots/street_address - migrated to has_or_had_address + Address class (2026-01-17, Rule 53/56)
# street_address was a redundant string slot; full Address class captures street data via components
- ../slots/postal_code
- ../slots/locality
# REMOVED: ../slots/city - migrated to is_or_was_located_in + City (2026-01-18, Rule 53)
- ../slots/is_or_was_located_in
- ../slots/region
- ../slots/country_name
# Shared slots (replacing address_formatted, address_type)
- ../slots/has_or_had_label
- ../slots/has_or_had_section
- ../slots/has_or_had_type
# Geographic reference slots
- ../slots/is_or_was_derived_from # was: was_derived_from
- ../slots/is_or_was_generated_by # was: was_generated_by
- ../slots/is_or_was_located_in
- ../slots/latitude
- ../slots/locality
- ../slots/longitude
- ../slots/geonames_id
# Provenance slots
- ../slots/is_or_was_derived_from # was: was_derived_from - migrated per Rule 53
- ../slots/is_or_was_generated_by # was: was_generated_by - migrated per Rule 53
# Related classes
- ./Country
- ./Subregion
- ./Settlement
- ../slots/postal_code
- ../slots/region
- ./AddressType
- ./City # Added for is_or_was_located_in range (2026-01-18, Rule 53)
- ./Country
- ./CustodianObservation
- ./ReconstructionActivity
- ./AddressType
- ./Settlement
- ./Subregion
- ./HouseNumber
- ./Label
default_range: string
classes:
Address:
class_uri: vcard:Address
description: |
Physical or postal address for heritage custodians and related entities.
**ONTOLOGY ALIGNMENT**:
This class aligns with multiple established address ontologies:
| Ontology | Class | Notes |
|----------|-------|-------|
| **vCard** | `vcard:Address` | RFC6350 ADR property components |
| **Schema.org** | `schema:PostalAddress` | Web semantics |
| **LOCN** | `locn:Address` | EU Location Core Vocabulary |
| **GLEIF** | `gleif_base:PhysicalAddress` | Legal entity addresses |
**COMPONENT STRUCTURE**:
An address consists of hierarchical components:
```
Address
@ -85,12 +60,9 @@ classes:
├── country_name (e.g., "Netherlands", "NL")
└── has_or_had_label (formatted address as Label)
```
NOTE: street_name slot migrated to has_or_had_label + Label (2026-01-17, Rule 53/56)
NOTE: street_address slot removed - was redundant string; use house_number + has_or_had_label (2026-01-17, Rule 53/56)
**ADDRESS TYPES FOR HERITAGE CUSTODIANS**:
| Type | Use Case |
|------|----------|
| `HEADQUARTERS` | Main organizational address |
@ -99,15 +71,12 @@ classes:
| `MAILING` | Correspondence/postal address |
| `STORAGE` | Depot, warehouse, off-site storage |
| `BRANCH` | Branch office location |
**USAGE EXAMPLES**:
```yaml
# Simple address with formatted string
has_or_had_address:
- address_formatted: "Museumstraat 1, 1071 XX Amsterdam, Netherlands"
address_type: HEADQUARTERS
# Structured address with components
has_or_had_address:
- has_or_had_label:
@ -124,21 +93,16 @@ classes:
longitude: 4.8852
geonames_id: 2759794
```
**RELATIONSHIP TO OTHER CLASSES**:
- `AuxiliaryPlace`: Uses Address for structured address data
- `CustodianPlace`: May reference Address for place location
- `ContactPoint`: Uses Address for contact location
- `Settlement`/`Subregion`/`Country`: Hierarchical geographic entities
**PROVENANCE**:
Address data may be extracted from various sources (websites, Google Maps,
registries). Track provenance with:
- `was_derived_from`: Link to source observation
- `was_generated_by`: Link to extraction activity
- `is_or_was_generated_by`: Link to extraction activity
exact_mappings:
- vcard:Address
close_mappings:
@ -148,7 +112,6 @@ classes:
related_mappings:
- org:siteAddress
- schema:address
slots:
# Street-level components
- has_or_had_section
@ -169,7 +132,6 @@ classes:
# Geographic coordinates (for geocoded addresses)
- latitude
- longitude
- geonames_id
# Provenance
- is_or_was_derived_from # was: was_derived_from - migrated per Rule 53
- is_or_was_generated_by # was: was_generated_by - migrated per Rule 53
@ -177,15 +139,11 @@ classes:
has_or_had_section:
range: HouseNumber
required: false
description: House/building number within street.
examples:
- value:
has_or_had_value: "1"
description: Rijksmuseum
- value:
has_or_had_value: "221B"
description: Baker Street notation
# REMOVED: street_name slot_usage - migrated to has_or_had_label + Label (2026-01-17, Rule 53/56)
# Street names should now use Label class with language tagging via has_or_had_label
# REMOVED: street_address slot_usage - redundant string slot removed (2026-01-17, Rule 53/56)
@ -193,138 +151,88 @@ classes:
postal_code:
range: string
required: false
description: Postal/ZIP code
examples:
- value: "1071 XX"
description: Dutch postal code format
locality:
range: string
required: false
description: City, town, or village name
examples:
- value: "Amsterdam"
description: City name
# REMOVED: city slot_usage - migrated to is_or_was_located_in + City (2026-01-18, Rule 53)
# city:
# range: string
# required: false
# description: Alternative slot for locality (schema:addressLocality)
is_or_was_located_in:
range: City
range: string
required: false
inlined: true
description: |
The city where this address is located, as a structured City entity.
MIGRATED from city (string) slot (2026-01-18, Rule 53).
Provides GeoNames ID, coordinates, and subregion linkage.
examples:
- value:
settlement_name: "Amsterdam"
geonames_id: 2759794
country: "NL"
description: Address located in Amsterdam
region:
range: string
required: false
description: State, province, or region
examples:
- value: "Noord-Holland"
description: Dutch province
- value: "NL-NH"
description: ISO 3166-2 code
country_name:
range: string
required: false
description: Country name or ISO 3166-1 code
examples:
- value: "Netherlands"
description: Full name
- value: "NL"
description: ISO 3166-1 alpha-2 code
# REMOVED 2026-01-22: address_formatted - migrated to has_or_had_label + Label (Rule 53, Feedback F1)
# Formatted address strings now use has_or_had_label slot_usage below
# REMOVED: address_type slot_usage - migrated to has_or_had_type (2026-01-17, Rule 53/56)
has_or_had_label: # was: address_formatted + street_name - migrated per Rule 53 (2026-01-17, 2026-01-22)
range: Label
range: string
multivalued: true
inlined: true
inlined_as_list: true
required: false
description: |
Labels for this address, including:
1. **Street name** as Label with language tag
2. **Formatted address** as Label with language tag
MIGRATED from:
- address_formatted (2026-01-22, Feedback F1) - formatted address strings
- street_name (2026-01-17, Rule 53/56) - street name component
Use Label class with language_code for multilingual support.
examples:
- value:
- has_or_had_label: "Museumstraat"
language: "nl"
- has_or_had_label: "Museumstraat 1, 1071 XX Amsterdam, Netherlands"
language: "nl"
description: Street name and formatted address as labels
has_or_had_type: # was: address_type - migrated per Rule 53/56 (2026-01-17)
range: AddressType
required: false
multivalued: false
description: |
Classification of the address by purpose or type.
MIGRATED from address_type (2026-01-13).
Uses AddressType class hierarchy for rich type semantics.
Common types: HeadquartersAddress, LegalAddress, VisitingAddress,
MailingAddress, StorageAddress, BranchAddress.
examples:
- value: HeadquartersAddress
description: Main organizational headquarters
latitude:
range: float
required: false
description: WGS84 latitude coordinate
examples:
- value: 52.3600
description: Amsterdam latitude
longitude:
range: float
required: false
description: WGS84 longitude coordinate
examples:
- value: 4.8852
description: Amsterdam longitude
geonames_id:
range: integer
required: false
description: GeoNames ID for geocoded locality
examples:
- value: 2759794
description: Amsterdam GeoNames ID
is_or_was_derived_from: # was: was_derived_from - migrated per Rule 53
range: CustodianObservation
multivalued: true
required: false
description: Source observation from which address was extracted
is_or_was_generated_by: # was: was_generated_by - migrated per Rule 53
range: ReconstructionActivity
required: false
description: Activity that generated this address record
comments:
- vCard Address is the primary ontology class (RFC6350 standard)
- Use structured components when available, address_formatted as fallback
- Multiple addresses supported via has_or_had_address slot (multivalued, Rule 39 compliant)
- address_type distinguishes headquarters, legal, visiting, mailing, storage
- Coordinates (lat/lon) optional but recommended for visualization/mapping
see_also:
- https://www.w3.org/TR/vcard-rdf/#d4e936
- https://schema.org/PostalAddress
- https://www.w3.org/ns/locn#Address
- https://www.gleif.org/ontology/Base/PhysicalAddress
examples:
- value:
has_or_had_section:
@ -335,28 +243,19 @@ classes:
- has_or_had_label: "Museumstraat 1, 1071 XX Amsterdam, Netherlands"
language: "nl"
# REMOVED: street_address - migrated to house_number + has_or_had_label (2026-01-17, Rule 53/56)
postal_code: "1071 XX"
locality: "Amsterdam"
region: "Noord-Holland"
country_name: "NL"
address_type: "HEADQUARTERS"
latitude: 52.3600
longitude: 4.8852
geonames_id: 2759794
description: Rijksmuseum headquarters - fully structured address (street_name and street_address migrated to has_or_had_label)
- value:
has_or_had_section:
- has_or_had_value: "40"
# REMOVED: street_address - migrated to house_number + has_or_had_label (2026-01-17, Rule 53/56)
postal_code: "2011 RX"
locality: "Haarlem"
country_name: "NL"
address_type: "HEADQUARTERS"
description: Noord-Hollands Archief address - simplified structure
- value:
has_or_had_label:
- has_or_had_label: "1600 Pennsylvania Avenue NW, Washington, DC 20500, USA"
@ -364,9 +263,6 @@ classes:
locality: "Washington"
region: "DC"
country_name: "US"
address_type: "LEGAL"
description: US address with formatted string primary
- value:
has_or_had_label:
- has_or_had_label: "Euterpelaan"
@ -379,9 +275,6 @@ classes:
locality: "Amersfoort"
region: "Utrecht"
country_name: "NL"
address_type: "STORAGE"
description: Off-site storage depot address (street_name and street_address migrated to has_or_had_label)
annotations:
specificity_score: 0.25
specificity_rationale: "Address is broadly applicable to all heritage custodian types and many other entities. Universal across domains."

View file

@ -1,227 +1,135 @@
# AddressComponent - Generic address component class
# Source-agnostic representation of individual address parts
# Refactored: 2026-01-12 - Removed Google Maps-specific references per user guidance
# Rule 38 compliant: All slots imported from modules/slots/
id: https://nde.nl/ontology/hc/classes/AddressComponent
name: AddressComponent
title: AddressComponent
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
vcard: http://www.w3.org/2006/vcard/ns#
locn: http://www.w3.org/ns/locn#
imports:
- linkml:types
# Centralized slots (Rule 38 compliant)
- ../slots/has_or_had_type
- ../slots/long_name
- ../slots/short_name
# REMOVED 2026-01-22: ../slots/component_type - migrated to has_or_had_type + ComponentType (Rule 53)
- ../slots/has_or_had_type
- ./ComponentType
- ./ComponentTypes
default_range: string
classes:
AddressComponent:
class_uri: hc:AddressComponent
description: |
A single component of a structured address.
**PURPOSE**:
AddressComponent represents one discrete element of an address, such as
the street number, street name, city, region, or country. This enables:
- Parsing addresses from various sources into standardized components
- Normalizing address data from different formats/APIs
- Supporting multilingual address representations (long_name vs short_name)
**COMPONENT STRUCTURE**:
Each AddressComponent has:
- `long_name`: Full form of the value (e.g., "Netherlands", "Noord-Holland")
- `short_name`: Abbreviated form (e.g., "NL", "NH") - may equal long_name
- `has_or_had_type`: Semantic type(s) via ComponentType (e.g., Country, Locality)
**STANDARD COMPONENT TYPES**:
| Type | Description | Example long_name | Example short_name |
|------|-------------|-------------------|-------------------|
| `street_number` | House/building number | "1", "221B" | same |
| `route` | Street/road name | "Museumstraat" | same |
| `locality` | City/town/village | "Amsterdam" | same |
| `postal_code` | ZIP/postal code | "1071 XX" | same |
| `subregion` | County/district | "Amsterdam" | same |
| `region` | State/province | "Noord-Holland" | "NH" |
| `country` | Country | "Netherlands" | "NL" |
| `premise` | Building/complex name | "Rijksmuseum" | same |
| `subpremise` | Unit/floor/suite | "Floor 3" | "3" |
**RELATIONSHIP TO Address CLASS**:
AddressComponent is used for:
1. **Parsing workflows**: Breaking down raw address strings into components
2. **Normalization**: Standardizing addresses from different sources
3. **Intermediate representation**: Before constructing a full Address object
The Address class provides the final, ontology-aligned representation with
dedicated slots (street_name, locality, region, country_name, etc.).
```
Raw Address Data (any source)
└── parse → AddressComponent[] # Intermediate representation
└── normalize → Address # vCard/LOCN aligned
```
**USAGE EXAMPLES**:
```yaml
# Street number component (MIGRATED 2026-01-22: Rule 53)
- long_name: "1"
short_name: "1"
has_or_had_type: [StreetNumber]
# Province with abbreviation
- long_name: "Noord-Holland"
short_name: "NH"
has_or_had_type: [Region]
# Country with ISO code
- long_name: "Netherlands"
short_name: "NL"
has_or_had_type: [Country]
```
**SOURCE-AGNOSTIC DESIGN**:
This class is designed to work with addresses from ANY source:
- Website scraping
- Registry data (ISIL, KvK, etc.)
- API responses (when normalized)
- Manual data entry
- OCR/document extraction
API-specific raw data formats are handled by Endpoint classes.
description: "A single component of a structured address.\n\n**PURPOSE**:\n\n\
AddressComponent represents one discrete element of an address, such as \nthe\
\ street number, street name, city, region, or country. This enables:\n- Parsing\
\ addresses from various sources into standardized components\n- Normalizing\
\ address data from different formats/APIs\n- Supporting multilingual address\
\ representations (long_name vs short_name)\n\n**COMPONENT STRUCTURE**:\n\n\
Each AddressComponent has:\n- `long_name`: Full form of the value (e.g., \"\
Netherlands\", \"Noord-Holland\")\n- `short_name`: Abbreviated form (e.g., \"\
NL\", \"NH\") - may equal long_name\n- `has_or_had_type`: Semantic type(s) via\
\ ComponentType (e.g., Country, Locality)\n\n**STANDARD COMPONENT TYPES**:\n\
\n| Type | Description | Example long_name | Example short_name |\n|------|-------------|-------------------|-------------------|\n\
| `street_number` | House/building number | \"1\", \"221B\" | same |\n| `route`\
\ | Street/road name | \"Museumstraat\" | same |\n| `locality` | City/town/village\
\ | \"Amsterdam\" | same |\n| `postal_code` | ZIP/postal code | \"1071 XX\"\
\ | same |\n| `subregion` | County/district | \"Amsterdam\" | same |\n| `region`\
\ | State/province | \"Noord-Holland\" | \"NH\" |\n| `country` | Country | \"\
Netherlands\" | \"NL\" |\n| `premise` | Building/complex name | \"Rijksmuseum\"\
\ | same |\n| `subpremise` | Unit/floor/suite | \"Floor 3\" | \"3\" |\n\n**RELATIONSHIP\
\ TO Address CLASS**:\n\nAddressComponent is used for:\n1. **Parsing workflows**:\
\ Breaking down raw address strings into components\n2. **Normalization**: Standardizing\
\ addresses from different sources\n3. **Intermediate representation**: Before\
\ constructing a full Address object\n\nThe Address class provides the final,\
\ ontology-aligned representation with \ndedicated slots (street_name, locality,\
\ region, country_name, etc.).\n\n```\nRaw Address Data (any source)\n │\n\
\ └── parse → AddressComponent[] # Intermediate representation\n \
\ │\n └── normalize → Address # vCard/LOCN aligned\n\
```\n\n**USAGE EXAMPLES**:\n\n```yaml\n# Street number component (MIGRATED 2026-01-22:\
\ Rule 53)\n- long_name: \"1\"\n short_name: \"1\"\n has_or_had_type: [StreetNumber]\n\
\n# Province with abbreviation\n- long_name: \"Noord-Holland\"\n short_name:\
\ \"NH\"\n has_or_had_type: [Region]\n\n# Country with ISO code\n- long_name:\
\ \"Netherlands\"\n short_name: \"NL\"\n has_or_had_type: [Country]\n```\n\
\n**SOURCE-AGNOSTIC DESIGN**:\n\nThis class is designed to work with addresses\
\ from ANY source:\n- Website scraping\n- Registry data (ISIL, KvK, etc.)\n\
- API responses (when normalized)\n- Manual data entry\n- OCR/document extraction\n\
\nAPI-specific raw data formats are handled by Endpoint classes.\n"
close_mappings:
- locn:AddressRepresentation
related_mappings:
- schema:PostalAddress
- vcard:Address
slots:
- long_name
- short_name
# REMOVED 2026-01-22: component_type - migrated to has_or_had_type + ComponentType (Rule 53)
- has_or_had_type
attributes:
types:
range: string
multivalued: true
inlined_as_list: true
description: Address component types (alias for component_type for backward compatibility with Google Maps API format)
slot_usage:
long_name:
range: string
required: false
description: Full form of the address component value
examples:
- value: "Netherlands"
description: Country full name
- value: "Noord-Holland"
description: Province full name
- value: "Museumstraat"
description: Street name
- value: Netherlands
- value: Noord-Holland
- value: Museumstraat
short_name:
range: string
required: false
description: Abbreviated or short form of the component value (may equal long_name)
examples:
- value: "NL"
description: ISO 3166-1 alpha-2 country code
- value: "NH"
description: Province abbreviation
- value: "Museumstraat"
description: Same as long_name when no abbreviation exists
# MIGRATED 2026-01-22: component_type → has_or_had_type + ComponentType (Rule 53)
- value: NL
- value: NH
- value: Museumstraat
has_or_had_type:
description: |
Semantic type(s) of this address component.
MIGRATED from component_type per slot_fixes.yaml (Rule 53, 2026-01-22).
Uses ComponentType class hierarchy for structured classification.
range: ComponentType
multivalued: true
inlined_as_list: true
required: false
examples:
- value: StreetNumber
description: House/building number
- value: Locality
description: City or town
- value: Region
description: State or province
- value: Country
description: Country
comments:
- Source-agnostic representation of address components
- Use for parsing/normalization workflows before constructing Address objects
- Component types follow common geographic hierarchy conventions
- Multiple types allowed for components that serve multiple roles
see_also:
- https://nde.nl/ontology/hc/classes/Address
- https://www.w3.org/ns/locn#Address
examples:
# MIGRATED 2026-01-22: component_type → has_or_had_type + ComponentType (Rule 53)
- value:
long_name: "1"
short_name: "1"
has_or_had_type: [StreetNumber]
description: Street number component
long_name: '1'
short_name: '1'
has_or_had_type:
- StreetNumber
- value:
long_name: "Museumstraat"
short_name: "Museumstraat"
has_or_had_type: [Route]
description: Street name component
long_name: Museumstraat
short_name: Museumstraat
has_or_had_type:
- Route
- value:
long_name: "Amsterdam"
short_name: "Amsterdam"
has_or_had_type: [Locality]
description: City component
long_name: Amsterdam
short_name: Amsterdam
has_or_had_type:
- Locality
- value:
long_name: "Noord-Holland"
short_name: "NH"
has_or_had_type: [Region]
description: Province component with abbreviation
long_name: Noord-Holland
short_name: NH
has_or_had_type:
- Region
- value:
long_name: "Netherlands"
short_name: "NL"
has_or_had_type: [Country]
description: Country component with ISO code
long_name: Netherlands
short_name: NL
has_or_had_type:
- Country
- value:
long_name: "1071 XX"
short_name: "1071 XX"
has_or_had_type: [PostalCode]
description: Dutch postal code component
long_name: 1071 XX
short_name: 1071 XX
has_or_had_type:
- PostalCode
annotations:
specificity_score: 0.35
specificity_rationale: "Generic address parsing component. Broadly applicable across all address sources and custodian types."
specificity_rationale: Generic address parsing component. Broadly applicable
across all address sources and custodian types.
custodian_types: '["*"]'
custodian_types_rationale: "Any custodian with address data may use address components during parsing/normalization."
custodian_types_rationale: Any custodian with address data may use address components
during parsing/normalization.

View file

@ -13,15 +13,16 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_identifier
- ../slots/has_or_had_code
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/has_or_had_hypernym
- ../slots/has_or_had_hyponym
- ../slots/is_or_was_related_to
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
- ../slots/is_or_was_equivalent_to
- ../slots/is_or_was_related_to
- ./WikiDataIdentifier
- ./AddressType
classes:
AddressType:
class_uri: skos:Concept
@ -52,9 +53,7 @@ classes:
pattern: ^https://nde\.nl/ontology/hc/address-type/[a-z0-9-]+$
examples:
- value: https://nde.nl/ontology/hc/address-type/headquarters
description: Main organizational headquarters address type
- value: https://nde.nl/ontology/hc/address-type/legal
description: Registered legal address type
has_or_had_code:
range: string
required: true
@ -86,39 +85,28 @@ classes:
- value: Main organizational address where primary operations occur.
has_or_had_hypernym:
range: AddressType
description: Parent address type in the classification hierarchy.
has_or_had_hyponym:
range: AddressType
multivalued: true
inlined_as_list: true
description: Child address types in the classification hierarchy.
is_or_was_related_to:
range: AddressType
multivalued: true
inlined_as_list: true
description: Non-hierarchical associations with other address types.
is_or_was_equivalent_to:
range: WikiDataIdentifier
multivalued: true
inlined: true
inlined_as_list: true
description: 'Wikidata equivalence for this address type concept.
MIGRATED 2026-01-15: Replaces wikidata_id slot per Rule 53.
'
examples:
- value:
- qid: Q1234567
label: Headquarters address
description: Wikidata equivalence for headquarters address type
annotations:
specificity_score: '0.30'
specificity_rationale: Address types are broadly applicable - all heritage custodians have addresses.
has_or_had_score: null
slot_migration: "2026-01-13: Migrated from address_type string slot to AddressType class\n- address_type (string) \u2192 has_or_had_type (AddressType)\n"
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
comments:
- AddressType provides SKOS-based classification for Address instances
- Supports hierarchical type relationships (has_or_had_hypernym/hyponym)
@ -142,7 +130,6 @@ classes:
are located.
'
description: Headquarters address type definition
- value:
has_or_had_identifier: https://nde.nl/ontology/hc/address-type/legal
has_or_had_code: LEGAL
@ -157,7 +144,6 @@ classes:
For Dutch organizations, this is the address registered with KvK.
'
description: Legal/statutory address type definition
- value:
has_or_had_identifier: https://nde.nl/ontology/hc/address-type/visiting
has_or_had_code: VISITING
@ -169,7 +155,6 @@ classes:
or libraries with public reading rooms.
'
description: Public visiting address type definition
- value:
has_or_had_identifier: https://nde.nl/ontology/hc/address-type/storage
has_or_had_code: STORAGE
@ -184,4 +169,3 @@ classes:
'
is_or_was_related_to:
- https://nde.nl/ontology/hc/address-type/branch
description: Storage/depot address type definition

View file

@ -15,7 +15,8 @@ classes:
HeadquartersAddress:
is_a: AddressType
class_uri: hc:HeadquartersAddress
description: 'Main organizational headquarters address where primary operations occur.
description: 'Main organizational headquarters address where primary operations
occur.
This is typically where leadership and central administration are located.
@ -30,8 +31,7 @@ classes:
annotations:
short_code: HEADQUARTERS
specificity_score: '0.25'
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'
examples:
- value:
has_or_had_code: HEADQUARTERS
@ -39,6 +39,8 @@ classes:
- Headquarters@en
- Hoofdkantoor@nl
description: Rijksmuseum main headquarters
broad_mappings:
- skos:Concept
LegalAddress:
is_a: AddressType
class_uri: hc:LegalAddress
@ -70,6 +72,8 @@ classes:
- Juridisch adres@nl
- Statutaire zetel@nl
description: Registered legal address from KvK
broad_mappings:
- skos:Concept
VisitingAddress:
is_a: AddressType
class_uri: hc:VisitingAddress
@ -93,6 +97,8 @@ classes:
- Visiting Address@en
- Bezoekadres@nl
description: Public visitor entrance
broad_mappings:
- skos:Concept
MailingAddress:
is_a: AddressType
class_uri: hc:MailingAddress
@ -115,6 +121,8 @@ classes:
- Postadres@nl
- Correspondentieadres@nl
description: Postal correspondence address
broad_mappings:
- skos:Concept
StorageAddress:
is_a: AddressType
class_uri: hc:StorageAddress
@ -142,6 +150,8 @@ classes:
- Opslaglocatie@nl
- Depot@nl
description: Off-site collection depot
broad_mappings:
- skos:Concept
BranchAddress:
is_a: AddressType
class_uri: hc:BranchAddress
@ -166,6 +176,8 @@ classes:
- Vestiging@nl
- Filiaal@nl
description: Branch office location
broad_mappings:
- skos:Concept
ReadingRoomAddress:
is_a: AddressType
class_uri: hc:ReadingRoomAddress
@ -190,6 +202,8 @@ classes:
- Studiezaal@nl
- Leeszaal@nl
description: Archive/library reading room entrance
broad_mappings:
- skos:Concept
DeliveryAddress:
is_a: AddressType
class_uri: hc:DeliveryAddress
@ -212,6 +226,8 @@ classes:
- Afleveradres@nl
- Goederenontvangst@nl
description: Delivery receiving dock
broad_mappings:
- skos:Concept
ConservationLabAddress:
is_a: AddressType
class_uri: hc:ConservationLabAddress
@ -234,3 +250,5 @@ classes:
- Restauratieatelier@nl
- Conserveringslab@nl
description: Restoration workshop facility
broad_mappings:
- skos:Concept

View file

@ -1,6 +1,24 @@
id: https://nde.nl/ontology/hc/class/Administration
name: Administration
title: Administration
description: An administrative unit or body.
prefixes:
linkml: https://w3id.org/linkml/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
rico: https://www.ica.org/standards/RiC/ontology#
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_description
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
classes:
Administration:
class_uri: org:OrganizationalUnit
close_mappings:
- rico:CorporateBody
- cpov:PublicOrganisation
description: An administrative unit or body.
slots:
- has_or_had_label
@ -10,4 +28,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -15,9 +15,9 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_code
- ../slots/has_or_had_description
- ../slots/has_or_had_label
classes:
AdministrativeLevel:
class_uri: skos:Concept
@ -46,13 +46,10 @@ classes:
- has_or_had_description
slot_usage:
has_or_had_label:
description: Name of the level (e.g., "National")
required: true
has_or_had_code:
description: Code for the level (e.g., "NAT", "ISO-3166-2")
required: false
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -3,31 +3,32 @@ name: administrative_office_class
title: AdministrativeOffice Class
imports:
- linkml:types
- ./ReconstructedEntity
- ./CustodianObservation
- ./ReconstructionActivity
- ./FunctionType
- ../classes/Description
- ../classes/Identifier
- ../classes/Label
- ../slots/has_or_had_description
- ../slots/has_or_had_function
- ../slots/has_or_had_identifier
- ../slots/has_or_had_label
- ../slots/has_or_had_score
- ../slots/has_or_had_staff
- ../slots/is_leased
- ../slots/is_or_was_derived_from
- ../slots/is_or_was_generated_by
- ../slots/has_or_had_access_restriction
- ../slots/has_or_had_description
- ../classes/Description
- ../slots/has_or_had_label
- ../classes/Label
# has_or_had_admin_staff_count REMOVED - migrated to has_or_had_staff + Staff (Rule 53)
- ../slots/has_or_had_staff
- ./Staff
- ../slots/has_or_had_function
- ../slots/is_leased
- ../slots/lease_expiry
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ./CustodianObservation
- ./FunctionType
- ./ReconstructedEntity
- ./ReconstructionActivity
- ./SpecificityAnnotation
- ./Staff
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/has_or_had_identifier
- ../classes/Identifier
- ./Description
- ./Identifier
- ./Label
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
@ -54,7 +55,6 @@ classes:
- schema:Corporation
- org:OrganizationalUnit
slots:
- has_or_had_access_restriction
- has_or_had_description
- has_or_had_identifier
- has_or_had_label
@ -69,49 +69,30 @@ classes:
- is_or_was_generated_by
slot_usage:
has_or_had_identifier:
range: Identifier
range: uriorcurie
required: true
description: Identifier for the administrative office.
has_or_had_label:
range: Label
range: string
required: true
description: Name of the administrative office.
has_or_had_description:
range: Description
description: Description of the administrative office.
range: string
has_or_had_function:
range: FunctionType
multivalued: true
inlined: true
inlined_as_list: true
description: Organizational functions performed at this administrative office. Uses generic FunctionType class with function_category classification.
examples:
- value:
function_category: ADMINISTRATIVE
function_name: Finance and accounting
description: Financial operations
- value:
function_category: ADMINISTRATIVE
function_name: Human resources
description: HR functions
- value:
function_category: SUPPORT
function_name: Information technology
description: IT support
has_or_had_access_restriction:
range: string
required: true
ifabsent: string(Staff access only)
examples:
- value: Staff badge required
description: Badge access
- value: Management access only
description: Restricted access
has_or_had_staff:
description: |
Staff associated with the administrative office.
MIGRATED from has_or_had_admin_staff_count per Rule 53.
Uses Staff class (with Quantity).
range: Staff
multivalued: true
inlined: true
@ -123,19 +104,15 @@ classes:
has_or_had_label: "FTE"
has_or_had_type:
has_or_had_label: "Administrative Staff"
description: Medium admin office
is_leased:
range: boolean
examples:
- value: true
description: Leased office space
- value: false
description: Owned property
lease_expiry:
range: date
examples:
- value: '2028-12-31'
description: Lease expires end of 2028
is_or_was_derived_from:
range: CustodianObservation
multivalued: true
@ -157,7 +134,6 @@ classes:
- value:
has_or_had_identifier:
identifier_value: https://nde.nl/ontology/hc/aux/rijksmuseum-admin-zuidas
identifier_scheme: URI
has_or_had_label:
has_or_had_label: Rijksmuseum Administrative Offices - Zuidas
has_or_had_description:
@ -173,7 +149,6 @@ classes:
function_name: Information technology
- function_category: ADMINISTRATIVE
function_name: Legal affairs
has_or_had_access_restriction: Staff badge required
has_or_had_staff:
- has_or_had_quantity:
has_or_had_value: 45
@ -183,11 +158,9 @@ classes:
has_or_had_label: "Administrative Staff"
is_leased: true
lease_expiry: '2028-12-31'
description: Museum administrative office in business district
- value:
has_or_had_identifier:
identifier_value: https://nde.nl/ontology/hc/aux/kb-digitization-center
identifier_scheme: URI
has_or_had_label:
has_or_had_label: Koninklijke Bibliotheek Digitization Support Center
has_or_had_description:
@ -201,7 +174,6 @@ classes:
function_name: Quality control
- function_category: SUPPORT
function_name: Technical support
has_or_had_access_restriction: Project staff only
has_or_had_staff:
- has_or_had_quantity:
has_or_had_value: 12
@ -211,9 +183,7 @@ classes:
has_or_had_label: "Technical Staff"
is_leased: false
lease_expiry: null
description: Library digitization support facility
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -14,7 +14,6 @@ default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_name
classes:
AdministrativeUnit:
class_uri: org:OrganizationalUnit
@ -22,8 +21,7 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
custodian_types: '["*"]'
slots:
- has_or_had_name

View file

@ -3,18 +3,13 @@ name: AdmissionFee
title: AdmissionFee
description: >-
Fee charged for admission.
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_amount
classes:
AdmissionFee:
class_uri: schema:PriceSpecification
@ -22,8 +17,5 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: "Generic utility class created during migration"
custodian_types: ["*"]
custodian_types_rationale: "Universal utility concept"
custodian_types: '["*"]'
slots:
- has_or_had_amount

View file

@ -12,21 +12,21 @@ imports:
default_range: string
classes:
AdmissionInfo:
description: "Structured admission price information from Google Maps including price value and notes about additional fees or conditions.\nOntology mapping rationale: - class_uri is schema:PriceSpecification because this represents\n structured price information for museum/institution admission\n- close_mappings includes schema:Offer for commercial offering context - related_mappings includes schema:MonetaryAmount for price values"
description: "Structured admission price information from Google Maps including\
\ price value and notes about additional fees or conditions.\nOntology mapping\
\ rationale: - class_uri is schema:PriceSpecification because this represents\n\
\ structured price information for museum/institution admission\n- close_mappings\
\ includes schema:Offer for commercial offering context - related_mappings includes\
\ schema:MonetaryAmount for price values"
class_uri: schema:PriceSpecification
close_mappings:
- schema:Offer
related_mappings:
- schema:MonetaryAmount
attributes:
price:
range: string
description: "Admission price (e.g., \"\u20AC9.00\")"
note:
range: string
description: Additional notes about admission (e.g., "Additional fees might apply")
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'
slots:
- price
- note

View file

@ -5,21 +5,22 @@ prefixes:
linkml: https://w3id.org/linkml/
imports:
- linkml:types
- ../slots/has_or_had_identifier
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/hold_or_held_record_set_type
- ../slots/is_or_was_related_to
- ../slots/specificity_annotation
- ./AdvertisingRadioArchiveRecordSetType
- ./AdvertisingRadioArchiveRecordSetTypes
- ./ArchiveOrganizationType
- ./CollectionType
- ./AdvertisingRadioArchiveRecordSetTypes
- ../slots/hold_or_held_record_set_type
- ../slots/has_or_had_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/is_or_was_related_to
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ./WikidataAlignment
- ./WikiDataEntry
- ./AdvertisingRadioArchiveRecordSetType
- ./WikidataAlignment
classes:
AdvertisingRadioArchive:
is_a: ArchiveOrganizationType
@ -59,7 +60,6 @@ classes:
slot_usage:
has_or_had_identifier:
pattern: ^Q[0-9]+$
description: Wikidata identifier for Advertising Radio Archive concept
exact_mappings:
- skos:Concept
close_mappings:
@ -77,4 +77,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -6,16 +6,12 @@ prefixes:
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/is_or_was_related_to
- ../slots/specificity_annotation
- ./CollectionType
- ../slots/has_or_had_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/is_or_was_related_to
- ./WikidataAlignment
- ../slots/has_or_had_type
- ../slots/is_or_was_related_to
- ../slots/specificity_annotation
- ../slots/has_or_had_score
classes:
AdvertisingRadioArchiveRecordSetType:
description: A rico:RecordSetType for classifying collections of advertising radio productions and commercials within heritage institutions.
@ -40,4 +36,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -12,41 +12,27 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ./AdvertisingRadioArchiveRecordSetType
- ./AdvertisingRadioArchive
- ../slots/has_or_had_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/record_holder
- ../slots/record_holder_note
- ../slots/record_set_type
- ../slots/specificity_annotation
- ./AdvertisingRadioArchive
- ./AdvertisingRadioArchiveRecordSetType
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/record_holder
- ../slots/record_holder_note
- ../slots/record_set_type
- ../slots/has_or_had_type
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/record_holder
- ../slots/record_holder_note
- ../slots/record_set_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/record_holder
- ../slots/record_holder_note
- ../slots/record_set_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
classes:
RadioAdvertisementCollection:
is_a: AdvertisingRadioArchiveRecordSetType
class_uri: rico:RecordSetType
description: "A rico:RecordSetType for Radio commercial recordings.\n\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType following the collection \norganizational principle as defined by rico-rst:Collection.\n"
description: "A rico:RecordSetType for Radio commercial recordings.\n\n**RiC-O\
\ Alignment**:\nThis class is a specialized rico:RecordSetType following the\
\ collection \norganizational principle as defined by rico-rst:Collection.\n"
exact_mappings:
- rico:RecordSetType
related_mappings:
@ -77,16 +63,21 @@ classes:
record_holder:
equals_string: AdvertisingRadioArchive
record_holder_note:
equals_string: This RecordSetType is typically held by AdvertisingRadioArchive custodians. Inverse of rico:isOrWasHolderOf.
equals_string: This RecordSetType is typically held by AdvertisingRadioArchive
custodians. Inverse of rico:isOrWasHolderOf.
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'
broad_mappings:
- rico:RecordSetType
- skos:Concept
CampaignDocumentationSeries:
is_a: AdvertisingRadioArchiveRecordSetType
class_uri: rico:RecordSetType
description: "A rico:RecordSetType for Advertising campaign records.\n\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType following the series \norganizational principle as defined by rico-rst:Series.\n"
description: "A rico:RecordSetType for Advertising campaign records.\n\n**RiC-O\
\ Alignment**:\nThis class is a specialized rico:RecordSetType following the\
\ series \norganizational principle as defined by rico-rst:Series.\n"
exact_mappings:
- rico:RecordSetType
related_mappings:
@ -117,4 +108,8 @@ classes:
record_holder:
equals_string: AdvertisingRadioArchive
record_holder_note:
equals_string: This RecordSetType is typically held by AdvertisingRadioArchive custodians. Inverse of rico:isOrWasHolderOf.
equals_string: This RecordSetType is typically held by AdvertisingRadioArchive
custodians. Inverse of rico:isOrWasHolderOf.
broad_mappings:
- rico:RecordSetType
- skos:Concept

View file

@ -9,9 +9,9 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_description
- ../slots/has_or_had_quantity
- ../slots/has_or_had_unit
- ../slots/has_or_had_description
classes:
Age:
class_uri: schema:QuantitativeValue
@ -37,14 +37,11 @@ classes:
slot_usage:
has_or_had_quantity:
range: integer
description: The age value (in years).
required: true
has_or_had_unit:
description: Unit of time (usually "years", "months").
range: string
required: false
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -9,8 +9,8 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/has_or_had_label
classes:
Agenda:
class_uri: schema:Action
@ -22,4 +22,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -11,13 +11,23 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_identifier
- ../slots/has_or_had_name
- ../slots/has_or_had_type
- ../slots/has_or_had_identifier
classes:
Agent:
class_uri: prov:Agent
description: "An agent (person, organization, or software) that performs actions.\n\n**RULE 53 MIGRATION**:\nReplaces simple string slots with a structured agent model:\n- `is_or_was_acquired_by` \u2192 Agent (this class)\n- Supports typed agents (person, organization, software)\n\n**USAGE**:\n```yaml\nis_or_was_acquired_by:\n - agent_name: \"Dr. Jane Smith\"\n agent_type: person\n has_or_had_identifier:\n - identifier_scheme: ORCID\n identifier_value: \"0000-0001-2345-6789\"\n```\n\n**Ontological Alignment**:\n- **Primary** (`class_uri`): `prov:Agent` - PROV-O agent\n- **Close**: `foaf:Agent` - FOAF agent\n- **Close**: `schema:Person` / `schema:Organization` - Schema.org agents\n- **Close**: `dcterms:Agent` - Dublin Core agent\n\n**Use Cases**:\n- Specimen collectors (field biologists)\n- Artwork donors/sellers\n- Archive depositors\n- Record creators\n"
description: "An agent (person, organization, or software) that performs actions.\n\
\n**RULE 53 MIGRATION**:\nReplaces simple string slots with a structured agent\
\ model:\n- `is_or_was_acquired_by` → Agent (this class)\n- Supports typed agents\
\ (person, organization, software)\n\n**USAGE**:\n```yaml\nis_or_was_acquired_by:\n\
\ - agent_name: \"Dr. Jane Smith\"\n agent_type: person\n has_or_had_identifier:\n\
\ - identifier_scheme: ORCID\n identifier_value: \"0000-0001-2345-6789\"\
\n```\n\n**Ontological Alignment**:\n- **Primary** (`class_uri`): `prov:Agent`\
\ - PROV-O agent\n- **Close**: `foaf:Agent` - FOAF agent\n- **Close**: `schema:Person`\
\ / `schema:Organization` - Schema.org agents\n- **Close**: `dcterms:Agent`\
\ - Dublin Core agent\n\n**Use Cases**:\n- Specimen collectors (field biologists)\n\
- Artwork donors/sellers\n- Archive depositors\n- Record creators\n"
exact_mappings:
- prov:Agent
close_mappings:
@ -30,73 +40,32 @@ classes:
- has_or_had_name
- has_or_had_type
- has_or_had_identifier
attributes:
agent_name:
range: string
description: Name of the agent (person or organization name)
required: true
agent_type:
range: string
description: 'Type of agent: person, organization, software, group
'
required: false
examples:
- value: person
- value: organization
- value: software
- value: group
agent_role:
range: string
description: 'Role of the agent in the action (collector, donor, creator, etc.)
'
required: false
slot_usage:
has_or_had_name:
description: 'Structured name for the agent.
'
range: uriorcurie
required: false
has_or_had_type:
description: 'Classification of the agent type.
'
range: uriorcurie
required: false
has_or_had_identifier:
description: 'Identifiers for the agent (ORCID, ISNI, etc.).
'
range: uriorcurie
multivalued: true
required: false
annotations:
specificity_score: '0.25'
specificity_rationale: Broadly applicable - agents appear across all heritage contexts.
template_specificity: '{"archive_search": 0.30, "museum_search": 0.30, "library_search": 0.30, "collection_discovery": 0.40, "person_research": 0.60, "location_browse": 0.15, "identifier_lookup": 0.35, "organizational_change": 0.25, "digital_platform": 0.20, "general_heritage": 0.25}'
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
specificity_rationale: Broadly applicable - agents appear across all heritage
contexts.
template_specificity: '{"archive_search": 0.30, "museum_search": 0.30, "library_search":
0.30, "collection_discovery": 0.40, "person_research": 0.60, "location_browse":
0.15, "identifier_lookup": 0.35, "organizational_change": 0.25, "digital_platform":
0.20, "general_heritage": 0.25}'
custodian_types: '[''*'']'
examples:
- value: null
- value: null
- value:
agent_name: Dr. Jane Smith
agent_type: person
agent_role: collector
description: Field biologist who collected specimens
- value:
agent_name: Rijksmuseum Foundation
agent_type: organization
agent_role: donor
description: Organization that donated artwork
- value:
agent_name: National Archives of the Netherlands
agent_type: organization
agent_role: transferring_agency
has_or_had_identifier:
- identifier_scheme: ISIL
identifier_value: NL-HaNA
description: Archive transferring records
comments:
- Created per slot_fixes.yaml migration (2026-01-22)
- 'RULE 53: Replaces collector string slot with structured model'

View file

@ -8,9 +8,9 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_code
- ../slots/has_or_had_description
- ../slots/has_or_had_label
classes:
AgentType:
class_uri: skos:Concept
@ -30,13 +30,10 @@ classes:
has_or_had_code:
range: string
required: true
description: Short code for the agent type
has_or_had_label:
range: string
required: false
description: Human-readable name for the agent type
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -14,24 +14,35 @@ prefixes:
hc: https://nde.nl/ontology/hc/
default_prefix: hc
classes:
PersonAgentType:
PersonAgent:
is_a: AgentType
class_uri: hc:PersonAgentType
class_uri: hc:PersonAgent
description: Agent type for natural persons.
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
OrganizationAgentType:
custodian_types: '[''*'']'
broad_mappings:
- crm:E39_Actor
- schema:Organization
OrganizationAgent:
is_a: AgentType
class_uri: hc:OrganizationAgentType
class_uri: hc:OrganizationAgent
description: Agent type for organizations.
SoftwareAgentType:
broad_mappings:
- crm:E39_Actor
- schema:Organization
SoftwareAgent:
is_a: AgentType
class_uri: hc:SoftwareAgentType
class_uri: hc:SoftwareAgent
description: Agent type for software agents or automated processes.
GroupAgentType:
broad_mappings:
- crm:E39_Actor
- schema:Organization
GroupAgent:
is_a: AgentType
class_uri: hc:GroupAgentType
class_uri: hc:GroupAgent
description: Agent type for informal groups or collectives.
broad_mappings:
- crm:E39_Actor
- schema:Organization

View file

@ -15,14 +15,14 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/has_or_had_label
- ../slots/is_or_was_signed_on
- ../slots/temporal_extent
- ./TimeSpan
classes:
Agreement:
class_uri: schema:Agreement
class_uri: schema:Contract
description: 'A formal agreement, contract, or treaty between parties.
@ -37,7 +37,7 @@ classes:
**Ontological Alignment**:
- `schema:Agreement`: A generic agreement.
- `schema:Contract`: A generic agreement.
'
slots:
@ -47,13 +47,9 @@ classes:
- temporal_extent
slot_usage:
has_or_had_label:
description: Title or name of the agreement.
is_or_was_signed_on:
description: Date the agreement was signed.
temporal_extent:
description: Validity period of the agreement.
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -29,14 +29,11 @@ classes:
slot_usage:
has_or_had_quantity:
range: float
description: The number of air changes.
required: true
has_or_had_unit:
range: Unit
description: Unit of measurement (e.g., "per hour").
range: string
required: true
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -2,35 +2,16 @@ id: https://nde.nl/ontology/hc/class/Alignment
name: alignment_class
title: Alignment Class
description: 'Represents positioning or alignment information for content elements.
**USE CASES**:
- Caption/subtitle positioning (top, bottom, left, right)
- Text alignment within containers
- Visual element placement in layouts
**PROPERTIES**:
- horizontal_alignment: left, center, right, justify
- vertical_alignment: top, middle, bottom
- position_value: Numeric or named position value
**RELATIONSHIP TO Caption**:
Alignment can be used with Caption to specify where subtitles appear
on screen (e.g., bottom-center is typical default).
'
imports:
- linkml:types
- ../slots/has_or_had_alignment
- ../slots/has_or_had_unit
- ../slots/has_or_had_value
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
@ -40,73 +21,32 @@ classes:
Alignment:
class_uri: hc:Alignment
description: 'Positioning or alignment information for content elements.
Captures horizontal alignment, vertical alignment, and position values.
Captures alignment, position values, and units.
'
slots:
- horizontal_alignment
- vertical_alignment
- position_value
- position_unit
- has_or_had_alignment
- has_or_had_value
- has_or_had_unit
slot_usage:
horizontal_alignment:
has_or_had_alignment:
range: string
required: false
multivalued: true
examples:
- value: left
description: Left-aligned content
- value: center
description: Center-aligned content
- value: right
description: Right-aligned content
vertical_alignment:
range: string
required: false
examples:
- value: top
description: Top-aligned (e.g., top subtitles)
- value: bottom
description: Bottom-aligned (default for subtitles)
- value: middle
description: Vertically centered
position_value:
has_or_had_value:
range: string
required: false
description: Numeric or named position value
examples:
- value: '10'
description: Position 10 units from reference
- value: default
description: Default positioning
position_unit:
has_or_had_unit:
range: string
required: false
description: Unit of measurement for position (px, %, em, etc.)
examples:
- value: px
description: Pixels
- value: '%'
description: Percentage of container
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
slots:
horizontal_alignment:
slot_uri: hc:horizontalAlignment
range: string
description: Horizontal alignment (left, center, right, justify)
vertical_alignment:
slot_uri: hc:verticalAlignment
range: string
description: Vertical alignment (top, middle, bottom)
position_value:
slot_uri: hc:positionValue
range: string
description: Numeric or named position value
position_unit:
slot_uri: hc:positionUnit
range: string
description: Unit of measurement for position

View file

@ -9,225 +9,58 @@ prefixes:
hc: https://nde.nl/ontology/hc/
imports:
- linkml:types
- ../enums/AllocationDomainEnum
- ../metadata
- ./Standard
- ./RegistrationAuthority
- ./Country
- ./Subregion
- ../slots/description
- ../slots/specificity_annotation
- ../slots/has_or_had_description
- ../slots/has_or_had_score
- ../slots/specificity_annotation
- ./Country
- ./RegistrationAuthority
- ./SpecificityAnnotation
- ./Standard
- ./Subregion
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../enums/AllocationDomainEnum
classes:
AllocationAgency:
class_uri: org:FormalOrganization
description: "An organization that allocates identifiers within a specific geographic area \nand/or domain of heritage institutions.\n\n**Key Distinction from RegistrationAuthority:**\n\n- **RegistrationAuthority**: Maintains the GLOBAL registry for a standard\n - Example: Danish Agency for Culture and Palaces maintains global ISIL registry\n - Example: ISNI International Agency (WIPO) maintains global ISNI database\n\n- **AllocationAgency**: Allocates identifiers LOCALLY within constraints\n - Example: Koninklijke Bibliotheek allocates ISIL for Dutch public libraries\n - Example: OCLC allocates ISIL for Dutch academic libraries\n - Example: Nationaal Archief allocates ISIL for Dutch archives\n\n**Multi-Dimensional Scope:**\n\nAllocationAgencies have both:\n1. **Geographic scope**: Which country/region they serve\n2. **Domain scope**: Which types of institutions they serve\n\nThis allows multiple agencies per country, each serving different domains:\n- NL public libraries \u2192\
\ KB\n- NL academic libraries \u2192 OCLC\n- NL archives \u2192 Nationaal Archief\n\n**Relationship to Standard:**\n\nAn AllocationAgency allocates for one or more Standards:\n- AllocationAgency.allocates_for \u2192 Standard[]\n- Standard can have multiple AllocationAgencies (one per country/domain)\n\n**Examples:**\n\n| Agency | Country | Domain | Standard |\n|--------|---------|--------|----------|\n| Koninklijke Bibliotheek | NL | Public libraries | ISIL |\n| OCLC | NL | Academic libraries | ISIL |\n| Nationaal Archief | NL | Archives | ISIL |\n| British Library | GB | All | ISIL |\n| Library of Congress | US | All | ISIL |\n| OCLC | Global | Academic | VIAF |\n| Deutsche Nationalbibliothek | DE | All | ISNI |\n\n**Ontology Alignment:**\n\n- org:FormalOrganization - W3C Organization Ontology\n- Extends gleif_base:RegistrationAuthority concept (but for allocation, not registration)\n"
description: "An organization that allocates identifiers within a specific geographic\
\ area \nand/or domain of heritage institutions.\n\n**Key Distinction from RegistrationAuthority:**\n\
\n- **RegistrationAuthority**: Maintains the GLOBAL registry for a standard\n\
\ - Example: Danish Agency for Culture and Palaces maintains global ISIL registry\n\
\ - Example: ISNI International Agency (WIPO) maintains global ISNI database\n\
\n- **AllocationAgency**: Allocates identifiers LOCALLY within constraints\n\
\ - Example: Koninklijke Bibliotheek allocates ISIL for Dutch public libraries\n\
\ - Example: OCLC allocates ISIL for Dutch academic libraries\n - Example:\
\ Nationaal Archief allocates ISIL for Dutch archives\n\n**Multi-Dimensional\
\ Scope:**\n\nAllocationAgencies have both:\n1. **Geographic scope**: Which\
\ country/region they serve\n2. **Domain scope**: Which types of institutions\
\ they serve\n\nThis allows multiple agencies per country, each serving different\
\ domains:\n- NL public libraries → KB\n- NL academic libraries → OCLC\n- NL\
\ archives → Nationaal Archief\n\n**Relationship to Standard:**\n\nAn AllocationAgency\
\ allocates for one or more Standards:\n- AllocationAgency.allocates_for → Standard[]\n\
- Standard can have multiple AllocationAgencies (one per country/domain)\n\n\
**Examples:**\n\n| Agency | Country | Domain | Standard |\n|--------|---------|--------|----------|\n\
| Koninklijke Bibliotheek | NL | Public libraries | ISIL |\n| OCLC | NL | Academic\
\ libraries | ISIL |\n| Nationaal Archief | NL | Archives | ISIL |\n| British\
\ Library | GB | All | ISIL |\n| Library of Congress | US | All | ISIL |\n|\
\ OCLC | Global | Academic | VIAF |\n| Deutsche Nationalbibliothek | DE | All\
\ | ISNI |\n\n**Ontology Alignment:**\n\n- org:FormalOrganization - W3C Organization\
\ Ontology\n- Extends gleif_base:RegistrationAuthority concept (but for allocation,\
\ not registration)\n"
exact_mappings:
- org:FormalOrganization
close_mappings:
- gleif_base:RegistrationAuthority
- schema:Organization
attributes:
id:
identifier: true
slot_uri: schema:identifier
description: 'Unique identifier for this allocation agency.
Recommended format: {country}-{abbreviation} or {abbreviation}
Examples: "nl-kb", "nl-oclc", "nl-na", "gb-bl", "us-loc"
'
range: uriorcurie
required: true
name:
slot_uri: schema:name
description: 'Official full name of the allocation agency.
Examples:
- "Koninklijke Bibliotheek"
- "Nationaal Archief"
- "British Library"
- "Library of Congress"
'
range: string
required: true
name_local:
slot_uri: schema:alternateName
description: "Name in local language (if different from English name).\n\nExamples:\n- \"Koninklijke Bibliotheek\" (Dutch)\n- \"Deutsche Nationalbibliothek\" (German)\n- \"Biblioth\xE8que nationale de France\" (French)\n"
range: string
has_or_had_abbreviation:
slot_uri: schema:alternateName
description: 'Common abbreviation.
Examples: "KB", "NA", "BL", "LOC", "BnF", "DNB"
'
range: string
country_scope:
slot_uri: gleif_base:hasCoverageArea
description: 'Geographic area(s) where this agency allocates identifiers.
Usually a single country, but can be multiple countries or subregions.
Examples:
- [NL] for Koninklijke Bibliotheek
- [GB] for British Library
- [US] for Library of Congress
- [DE-BY, DE-BW] for regional German agency
'
range: Country
multivalued: true
required: true
inlined: false
subregion_scope:
slot_uri: schema:areaServed
description: "Subregion-level geographic scope (if more specific than country).\n\nFor agencies that only serve specific regions within a country.\n\nExamples:\n- Staatsarchiv M\xFCnchen: [DE-BY] (Bavaria only)\n"
range: Subregion
multivalued: true
inlined: false
allocation_domain:
slot_uri: schema:audienceType
description: 'Types of institutions this agency allocates identifiers for.
Multiple values allowed for agencies serving multiple domains.
Examples:
- KB: [LIBRARY_PUBLIC]
- OCLC: [LIBRARY_ACADEMIC, LIBRARY_RESEARCH]
- Nationaal Archief: [ARCHIVE]
- British Library: [LIBRARY_PUBLIC, LIBRARY_ACADEMIC, ARCHIVE] (all types)
'
range: AllocationDomainEnum
multivalued: true
required: true
allocates_for:
slot_uri: schema:serviceOutput
description: 'Standards for which this agency allocates identifiers.
Most agencies allocate for a single standard, but some handle multiple.
Examples:
- KB: [ISIL]
- DNB: [ISIL, ISNI]
- OCLC: [ISIL, VIAF]
'
range: Standard
multivalued: true
required: true
inlined: false
allocation_prefix:
slot_uri: schema:identifier
description: 'Prefix used by this agency when allocating identifiers.
For ISIL, this is typically the country code.
Examples:
- Netherlands ISIL: "NL-"
- Germany ISIL: "DE-"
- UK ISIL: "UK-" or "GB-" (both used historically)
'
range: string
parent_registration_authority:
slot_uri: schema:parentOrganization
description: "The registration authority to which this agency reports allocations.\n\nAllocationAgencies report their allocations to the global RegistrationAuthority.\n\nExamples:\n- KB (NL ISIL) \u2192 Danish Agency for Culture and Palaces\n- DNB (DE ISNI) \u2192 ISNI International Agency\n"
range: RegistrationAuthority
inlined: false
allocation_start_date:
slot_uri: schema:startDate
description: 'Date when this agency started allocating identifiers.
Format: ISO 8601 date
'
range: date
allocation_end_date:
slot_uri: schema:endDate
description: 'Date when this agency stopped allocating (if no longer active).
Null if still active.
'
range: date
is_active:
slot_uri: schema:status
description: Whether this agency is currently allocating identifiers
range: boolean
required: true
website:
slot_uri: hc:hasWebsite
description: 'Official website of the allocation agency.
Preferably the page about identifier allocation services.
Note: slot_uri changed from schema:url to hc:hasWebsite to resolve OWL ambiguous type warning. schema:url is typically a DatatypeProperty but range: uri in LinkML can be ambiguous.
'
range: uri
close_mappings:
- schema:url
allocation_policy_url:
slot_uri: schema:usageInfo
description: 'URL to the allocation policy documentation.
Describes eligibility, process, requirements for obtaining identifiers.
'
range: uri
agency_description:
slot_uri: schema:description
description: Description of the agency's allocation services and scope
range: string
slots:
- specificity_annotation
- has_or_had_score
- name
- name_local
- is_active
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'

View file

@ -26,10 +26,8 @@ classes:
- temporal_extent
slot_usage:
temporal_extent:
description: Time period when the allocation occurred.
required: true
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -48,20 +48,15 @@ classes:
has_or_had_code:
pattern: ^[A-Z]{2}$
required: true
description: Two-letter ISO 3166-1 alpha-2 country code
examples:
- value: NL
description: Netherlands
- value: BE
description: Belgium
exact_mappings:
- skos:Concept
annotations:
specificity_score: '0.30'
specificity_rationale: Low specificity - standard country codes used broadly.
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
examples:
- value:
has_or_had_code: NL
description: Netherlands country code

View file

@ -48,20 +48,15 @@ classes:
has_or_had_code:
pattern: ^[A-Z]{3}$
required: true
description: Three-letter ISO 3166-1 alpha-3 country code
examples:
- value: NLD
description: Netherlands
- value: BEL
description: Belgium
exact_mappings:
- skos:Concept
annotations:
specificity_score: '0.30'
specificity_rationale: Low specificity - standard country codes used broadly.
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
examples:
- value:
has_or_had_code: NLD
description: Netherlands country code

View file

@ -13,25 +13,22 @@ imports:
default_range: string
classes:
AlternativeName:
description: "Alternative name with language and source information, representing a variant or translated form of an institution's name.\nOntology mapping rationale: - class_uri is skos:altLabel because this represents an alternative\n lexical label for a concept (the institution)\n- exact_mappings includes schema:alternateName as both represent variant names - related_mappings includes rdfs:label for general labeling context"
description: "Alternative name with language and source information, representing\
\ a variant or translated form of an institution's name.\nOntology mapping rationale:\
\ - class_uri is skos:altLabel because this represents an alternative\n lexical\
\ label for a concept (the institution)\n- exact_mappings includes schema:alternateName\
\ as both represent variant names - related_mappings includes rdfs:label for\
\ general labeling context"
class_uri: skos:altLabel
exact_mappings:
- schema:alternateName
related_mappings:
- rdfs:label
attributes:
name:
range: string
required: true
description: The alternative name
language:
range: string
description: ISO 639-1 language code
source:
range: string
description: Source of this alternative name (e.g., wikidata, isil_registry)
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'
slots:
- name
- language
- source

View file

@ -1,6 +1,22 @@
id: https://nde.nl/ontology/hc/class/Altitude
name: Altitude
title: Altitude
description: The altitude of a place.
prefixes:
linkml: https://w3id.org/linkml/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
rico: https://www.ica.org/standards/RiC/ontology#
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_unit
- ../slots/has_or_had_value
classes:
Altitude:
class_uri: schema:QuantitativeValue
exact_mappings:
- crm:E54_Dimension
description: The altitude of a place.
slots:
- has_or_had_value
@ -9,4 +25,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -1,3 +1,18 @@
id: https://nde.nl/ontology/hc/class/AmendmentEvent
name: AmendmentEvent
title: Amendment Event
description: An event where a document or agreement was amended.
prefixes:
linkml: https://w3id.org/linkml/
schema: http://schema.org/
skos: http://www.w3.org/2004/02/skos/core#
rico: https://www.ica.org/standards/RiC/ontology#
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_description
- ../slots/has_or_had_identifier
- ../slots/temporal_extent
classes:
AmendmentEvent:
class_uri: prov:Activity
@ -10,4 +25,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -16,8 +16,8 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_label
- ../slots/has_or_had_description
- ../slots/has_or_had_label
- ../slots/is_or_was_categorized_as
- ./Species
classes:
@ -38,9 +38,7 @@ classes:
slot_usage:
is_or_was_categorized_as:
range: Species
description: The species classification of the animal.
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -5,21 +5,22 @@ prefixes:
linkml: https://w3id.org/linkml/
imports:
- linkml:types
- ../slots/has_or_had_identifier
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/hold_or_held_record_set_type
- ../slots/is_or_was_related_to
- ../slots/specificity_annotation
- ./AnimalSoundArchiveRecordSetType
- ./AnimalSoundArchiveRecordSetTypes
- ./ArchiveOrganizationType
- ./CollectionType
- ./AnimalSoundArchiveRecordSetTypes
- ../slots/hold_or_held_record_set_type
- ../slots/has_or_had_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/is_or_was_related_to
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ./WikidataAlignment
- ./WikiDataEntry
- ./AnimalSoundArchiveRecordSetType
- ./WikidataAlignment
classes:
AnimalSoundArchive:
is_a: ArchiveOrganizationType
@ -32,7 +33,6 @@ classes:
slot_usage:
has_or_had_identifier:
pattern: ^Q[0-9]+$
description: Wikidata identifier for Animal Sound Archive concept
exact_mappings:
- skos:Concept
close_mappings:
@ -50,4 +50,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -6,16 +6,12 @@ prefixes:
wd: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/is_or_was_related_to
- ../slots/specificity_annotation
- ./CollectionType
- ../slots/has_or_had_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/is_or_was_related_to
- ./WikidataAlignment
- ../slots/has_or_had_type
- ../slots/is_or_was_related_to
- ../slots/specificity_annotation
- ../slots/has_or_had_score
classes:
AnimalSoundArchiveRecordSetType:
description: A rico:RecordSetType for classifying collections of animal sound archive materials within heritage institutions.
@ -40,4 +36,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -12,41 +12,27 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ./AnimalSoundArchiveRecordSetType
- ./AnimalSoundArchive
- ../slots/has_or_had_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/record_holder
- ../slots/record_holder_note
- ../slots/record_set_type
- ../slots/specificity_annotation
- ./AnimalSoundArchive
- ./AnimalSoundArchiveRecordSetType
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/record_holder
- ../slots/record_holder_note
- ../slots/record_set_type
- ../slots/has_or_had_type
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/record_holder
- ../slots/record_holder_note
- ../slots/record_set_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/has_or_had_type
- ../slots/organizational_principle
- ../slots/organizational_principle_uri
- ../slots/record_holder
- ../slots/record_holder_note
- ../slots/record_set_type
- ../slots/specificity_annotation
- ../slots/has_or_had_score
classes:
BioacousticRecordingCollection:
is_a: AnimalSoundArchiveRecordSetType
class_uri: rico:RecordSetType
description: "A rico:RecordSetType for Animal and nature sound recordings.\n\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType following the collection \norganizational principle as defined by rico-rst:Collection.\n"
description: "A rico:RecordSetType for Animal and nature sound recordings.\n\n\
**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType following\
\ the collection \norganizational principle as defined by rico-rst:Collection.\n"
exact_mappings:
- rico:RecordSetType
related_mappings:
@ -77,16 +63,21 @@ classes:
record_holder:
equals_string: AnimalSoundArchive
record_holder_note:
equals_string: This RecordSetType is typically held by AnimalSoundArchive custodians. Inverse of rico:isOrWasHolderOf.
equals_string: This RecordSetType is typically held by AnimalSoundArchive
custodians. Inverse of rico:isOrWasHolderOf.
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'
broad_mappings:
- rico:RecordSetType
- skos:Concept
FieldRecordingSeries:
is_a: AnimalSoundArchiveRecordSetType
class_uri: rico:RecordSetType
description: "A rico:RecordSetType for Field research audio.\n\n**RiC-O Alignment**:\nThis class is a specialized rico:RecordSetType following the series \norganizational principle as defined by rico-rst:Series.\n"
description: "A rico:RecordSetType for Field research audio.\n\n**RiC-O Alignment**:\n\
This class is a specialized rico:RecordSetType following the series \norganizational\
\ principle as defined by rico-rst:Series.\n"
exact_mappings:
- rico:RecordSetType
related_mappings:
@ -117,4 +108,8 @@ classes:
record_holder:
equals_string: AnimalSoundArchive
record_holder_note:
equals_string: This RecordSetType is typically held by AnimalSoundArchive custodians. Inverse of rico:isOrWasHolderOf.
equals_string: This RecordSetType is typically held by AnimalSoundArchive
custodians. Inverse of rico:isOrWasHolderOf.
broad_mappings:
- rico:RecordSetType
- skos:Concept

View file

@ -22,4 +22,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -9,15 +9,19 @@ prefixes:
default_prefix: hc
imports:
- linkml:types
- ../slots/has_or_had_description
- ../slots/is_or_was_created_by
- ../classes/Agent
- ../slots/has_or_had_rationale
- ../classes/Rationale
- ../slots/contains_or_contained
- ../classes/Segment
- ../slots/has_or_had_type
- ../classes/AnnotationType
- ../classes/Rationale
- ../classes/Segment
- ../slots/contains_or_contained
- ../slots/has_or_had_description
- ../slots/has_or_had_rationale
- ../slots/has_or_had_type
- ../slots/is_or_was_created_by
- ./Agent
- ./AnnotationType
- ./Rationale
- ./Segment
classes:
Annotation:
class_uri: oa:Annotation
@ -37,21 +41,15 @@ classes:
- has_or_had_type
slot_usage:
has_or_had_description:
description: The content of the annotation (body).
is_or_was_created_by:
description: The agent who created the annotation.
range: Agent
has_or_had_rationale:
description: The motivation for the annotation (e.g. commenting, tagging).
range: Rationale
contains_or_contained:
description: The target segment being annotated.
range: Segment
has_or_had_type:
description: The type of annotation.
range: AnnotationType
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -18,25 +18,15 @@ default_prefix: hc
imports:
- linkml:types
- ../metadata
- ../slots/has_or_had_score
- ../slots/motivation_type_description
- ../slots/motivation_type_id
- ../slots/motivation_type_name
- ../slots/motivation_type_description
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/motivation_type_description
- ../slots/motivation_type_id
- ../slots/motivation_type_name
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/motivation_type_description
- ../slots/motivation_type_id
- ../slots/motivation_type_name
- ../slots/specificity_annotation
- ../slots/has_or_had_score
classes:
AnnotationMotivationType:
class_uri: oa:Motivation
@ -77,4 +67,3 @@ classes:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept

View file

@ -15,20 +15,14 @@ default_prefix: hc
imports:
- linkml:types
- ../metadata
- ./AnnotationMotivationType
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/motivation_type_name
- ../slots/specificity_annotation
- ./AnnotationMotivationType
- ./SpecificityAnnotation
- ./TemplateSpecificityScore
- ./TemplateSpecificityType
- ./TemplateSpecificityTypes
- ../slots/motivation_type_name
- ../slots/motivation_type_name
- ../slots/specificity_annotation
- ../slots/has_or_had_score
- ../slots/motivation_type_name
- ../slots/specificity_annotation
- ../slots/has_or_had_score
classes:
ClassifyingMotivation:
is_a: AnnotationMotivationType
@ -101,8 +95,9 @@ classes:
annotations:
specificity_score: 0.1
specificity_rationale: Generic utility class/slot created during migration
custodian_types: "['*']"
custodian_types_rationale: Universal utility concept
custodian_types: '[''*'']'
broad_mappings:
- skos:Concept
DescribingMotivation:
is_a: AnnotationMotivationType
class_uri: oa:describing
@ -171,6 +166,8 @@ classes:
comments:
- W3C Web Annotation standard motivation
- Fundamental to heritage cataloging and accessibility
broad_mappings:
- skos:Concept
IdentifyingMotivation:
is_a: AnnotationMotivationType
class_uri: oa:identifying
@ -239,6 +236,8 @@ classes:
comments:
- W3C Web Annotation standard motivation
- Links content to identified entities
broad_mappings:
- skos:Concept
TaggingMotivation:
is_a: AnnotationMotivationType
class_uri: oa:tagging
@ -307,6 +306,8 @@ classes:
comments:
- W3C Web Annotation standard motivation
- User-generated content enrichment
broad_mappings:
- skos:Concept
LinkingMotivation:
is_a: AnnotationMotivationType
class_uri: oa:linking
@ -376,6 +377,8 @@ classes:
comments:
- W3C Web Annotation standard motivation
- Enables Linked Open Data connections
broad_mappings:
- skos:Concept
CommentingMotivation:
is_a: AnnotationMotivationType
class_uri: oa:commenting
@ -442,6 +445,8 @@ classes:
comments:
- W3C Web Annotation standard motivation
- User and scholarly engagement
broad_mappings:
- skos:Concept
AccessibilityMotivation:
is_a: AnnotationMotivationType
class_uri: hc:accessibilityMotivation
@ -525,6 +530,8 @@ classes:
- Heritage-specific extension beyond W3C standard
- Critical for inclusive heritage access
- Supports WCAG compliance
broad_mappings:
- skos:Concept
DiscoveryMotivation:
is_a: AnnotationMotivationType
class_uri: hc:discoveryMotivation
@ -606,6 +613,8 @@ classes:
- Heritage-specific extension beyond W3C standard
- Enables collection discoverability
- Supports aggregator integration
broad_mappings:
- skos:Concept
PreservationMotivation:
is_a: AnnotationMotivationType
class_uri: hc:preservationMotivation
@ -689,6 +698,8 @@ classes:
- Heritage-specific extension beyond W3C standard
- Critical for digital preservation
- Supports OAIS and PREMIS compliance
broad_mappings:
- skos:Concept
ResearchMotivation:
is_a: AnnotationMotivationType
class_uri: hc:researchMotivation
@ -770,3 +781,5 @@ classes:
- Heritage-specific extension beyond W3C standard
- Supports digital humanities and research
- Enables computational analysis documentation
broad_mappings:
- skos:Concept

Some files were not shown because too many files have changed in this diff Show more