- Introduced a comprehensive class diagram for the heritage custodian observation reconstruction schema. - Defined multiple classes including AllocationAgency, ArchiveOrganizationType, AuxiliaryDigitalPlatform, and others, with relevant attributes and relationships. - Established inheritance and associations among classes to represent complex relationships within the schema. - Generated on 2025-11-28, version 0.9.0, excluding the Container class.
218 lines
5.9 KiB
Markdown
218 lines
5.9 KiB
Markdown
# LinkML Technical Classes: Exclusion from Visualizations
|
|
|
|
**Date**: 2025-11-28
|
|
**Purpose**: Document technical LinkML classes that should be excluded from semantic visualizations (UML, ERD, etc.)
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
Some LinkML classes exist solely for **technical validation purposes** and have **no semantic/ontological significance**. These classes should be excluded from UML diagrams, entity-relationship diagrams, and other visualizations that represent the domain model.
|
|
|
|
**Metaphor**: Like construction scaffolding - essential for building but not part of the final structure.
|
|
|
|
---
|
|
|
|
## Excluded Classes
|
|
|
|
### `Container`
|
|
|
|
**Definition**: `schemas/20251121/linkml/modules/classes/Container.yaml`
|
|
|
|
```yaml
|
|
Container:
|
|
description: >-
|
|
Root container for validating complete instance documents.
|
|
Contains top-level entity lists for each major class.
|
|
Not used in RDF serialization (flattened).
|
|
tree_root: true
|
|
attributes:
|
|
# Lists of all entity types for validation
|
|
custodian_observations: ...
|
|
custodian_names: ...
|
|
# ... etc.
|
|
```
|
|
|
|
**Purpose**:
|
|
- Enables `linkml-validate -C Container instance.yaml` validation
|
|
- Provides a `tree_root` entry point for parsing YAML/JSON instance documents
|
|
- Aggregates all entity types into a single validation target
|
|
|
|
**Why Excluded**:
|
|
- ❌ Has NO `class_uri` (not mapped to any ontology)
|
|
- ❌ Not serialized to RDF (explicitly stated in description)
|
|
- ❌ Purely structural - no domain semantics
|
|
- ❌ Would clutter diagrams with non-semantic relationships
|
|
|
|
**Evidence**:
|
|
```yaml
|
|
# From Container.yaml - NO class_uri mapping
|
|
Container:
|
|
tree_root: true
|
|
# Notice: NO class_uri field - not mapped to any ontology
|
|
```
|
|
|
|
---
|
|
|
|
## Exclusion Implementation
|
|
|
|
### Python: Mermaid Diagram Generators
|
|
|
|
**Files**:
|
|
- `scripts/generate_complete_mermaid_diagram.py`
|
|
- `scripts/generate_mermaid_modular.py`
|
|
|
|
**Pattern**:
|
|
```python
|
|
# Define excluded classes at module level
|
|
EXCLUDED_CLASSES = {"Container"}
|
|
|
|
# Filter in entity generation
|
|
for class_name, class_def in schema.classes.items():
|
|
if class_name in EXCLUDED_CLASSES:
|
|
continue # Skip technical classes
|
|
# ... generate entity definition
|
|
|
|
# Filter in relationship generation
|
|
for class_name, class_def in schema.classes.items():
|
|
if class_name in EXCLUDED_CLASSES:
|
|
continue
|
|
for slot in class_def.attributes.values():
|
|
if slot.range in EXCLUDED_CLASSES:
|
|
continue # Skip relationships to technical classes
|
|
```
|
|
|
|
### TypeScript: Frontend UML Parsers
|
|
|
|
**File**: `frontend/src/components/uml/UMLParser.ts`
|
|
|
|
**Pattern**:
|
|
```typescript
|
|
// Excluded technical classes (no semantic significance)
|
|
const EXCLUDED_CLASSES = new Set(['Container']);
|
|
|
|
// Filter function applied to all parsers
|
|
function filterExcludedClasses(entities: UMLEntity[]): UMLEntity[] {
|
|
return entities.filter(entity => !EXCLUDED_CLASSES.has(entity.name));
|
|
}
|
|
|
|
// Applied in each parser
|
|
export const parseMermaidClassDiagram = (content: string): UMLDiagram => {
|
|
// ... parse entities
|
|
const filteredEntities = filterExcludedClasses(entities);
|
|
// ... return filtered diagram
|
|
};
|
|
```
|
|
|
|
---
|
|
|
|
## How to Add New Exclusions
|
|
|
|
When you identify a new technical class that should be excluded:
|
|
|
|
### Step 1: Verify It's Truly Technical
|
|
|
|
Check these criteria:
|
|
- [ ] Has no `class_uri` (not mapped to any ontology)
|
|
- [ ] Documentation states it's not for RDF serialization
|
|
- [ ] Exists only for validation/parsing purposes
|
|
- [ ] Has no domain semantics
|
|
|
|
### Step 2: Add to Python Generators
|
|
|
|
In both generator scripts, add to the `EXCLUDED_CLASSES` set:
|
|
|
|
```python
|
|
# scripts/generate_complete_mermaid_diagram.py
|
|
# scripts/generate_mermaid_modular.py
|
|
|
|
EXCLUDED_CLASSES = {"Container", "NewTechnicalClass"}
|
|
```
|
|
|
|
### Step 3: Add to Frontend Parser
|
|
|
|
In `frontend/src/components/uml/UMLParser.ts`:
|
|
|
|
```typescript
|
|
const EXCLUDED_CLASSES = new Set(['Container', 'NewTechnicalClass']);
|
|
```
|
|
|
|
### Step 4: Document in This File
|
|
|
|
Add a new section under "Excluded Classes" with:
|
|
- Definition location
|
|
- Purpose description
|
|
- Reason for exclusion
|
|
- Evidence (no class_uri, etc.)
|
|
|
|
### Step 5: Regenerate Diagrams
|
|
|
|
```bash
|
|
cd /Users/kempersc/apps/glam
|
|
python scripts/generate_complete_mermaid_diagram.py
|
|
python scripts/generate_mermaid_modular.py
|
|
# Verify class count decreased
|
|
```
|
|
|
|
---
|
|
|
|
## Verification
|
|
|
|
### Check Current Diagram Class Count
|
|
|
|
```bash
|
|
# Count classes in latest diagram (should NOT include Container)
|
|
grep -c "class " schemas/20251121/uml/mermaid/complete_schema_*.mmd | tail -1
|
|
|
|
# Verify Container is NOT in diagram
|
|
grep "Container" schemas/20251121/uml/mermaid/complete_schema_*.mmd
|
|
# Should return no matches
|
|
```
|
|
|
|
### Expected Results (as of 2025-11-28)
|
|
|
|
- **Total classes in schema**: 72 (including Container)
|
|
- **Classes in diagrams**: 71 (Container excluded)
|
|
- **Frontend visualization**: 71 classes (Container filtered)
|
|
|
|
---
|
|
|
|
## Why This Matters
|
|
|
|
### For AI Agents
|
|
|
|
When generating or analyzing UML diagrams:
|
|
- ✅ **DO**: Focus on the 71 semantic classes
|
|
- ❌ **DON'T**: Expect to see Container in diagrams
|
|
- ❌ **DON'T**: Add Container to ontology mappings
|
|
|
|
### For Developers
|
|
|
|
When modifying diagram generators:
|
|
- ✅ **DO**: Apply exclusion filters consistently
|
|
- ❌ **DON'T**: Hardcode class names in multiple places (use the constant)
|
|
- ✅ **DO**: Document new exclusions in this file
|
|
|
|
### For Schema Designers
|
|
|
|
When adding new technical classes:
|
|
- ✅ **DO**: Mark them with `tree_root: true` if for validation
|
|
- ✅ **DO**: Omit `class_uri` if not semantically meaningful
|
|
- ✅ **DO**: Add to exclusion lists in generators
|
|
- ✅ **DO**: Document purpose in class description
|
|
|
|
---
|
|
|
|
## Related Documentation
|
|
|
|
- **AGENTS.md**: Rule 0 - LinkML Schemas Are Single Source of Truth
|
|
- `.opencode/SCHEMA_GENERATION_RULES.md`: Generation workflow
|
|
- `.opencode/HYPER_MODULAR_STRUCTURE.md`: Module organization
|
|
- `schemas/20251121/linkml/modules/classes/Container.yaml`: Container definition
|
|
|
|
---
|
|
|
|
**Status**: ✅ ACTIVE
|
|
**Version**: 1.0
|
|
**Last Updated**: 2025-11-28
|
|
**Applies To**: All UML/ERD diagram generation in this project
|