Ontology Explorer
Goal
Enable an agent to understand, navigate, and query the structure of materials science ontologies without loading verbose OWL/XML files directly. Provides fast access to class hierarchies, property definitions, and domain-range relationships through pre-processed JSON summaries.
Requirements
- Python 3.8+
- No external dependencies (Python standard library only)
- Internet access required only for
owl_parser.py and ontology_summarizer.py when fetching remote OWL files
Inputs to Gather
| Input |
Description |
Example |
| Ontology name |
Registered ontology to query |
cmso |
| Class name |
A specific class to inspect |
Material, UnitCell |
| Property name |
A specific property to look up |
hasMaterial, hasSpaceGroupNumber |
| Search term |
Keyword to search across labels |
crystal, lattice |
| OWL source |
Path or URL to an OWL/XML file (for parsing/summarizing) |
https://raw.githubusercontent.com/OCDO/cmso/main/cmso.owl |
Decision Guidance
What do you need?
├── Understand overall ontology structure
│ └── class_browser.py --ontology cmso --list-roots
├── Inspect a specific class
│ └── class_browser.py --ontology cmso --class <name>
├── Find properties for a class
│ └── property_lookup.py --ontology cmso --class <name>
├── Look up a specific property
│ └── property_lookup.py --ontology cmso --property <name>
├── Search for a concept
│ ├── class_browser.py --ontology cmso --search <term>
│ └── property_lookup.py --ontology cmso --search <term>
├── Parse a new/updated OWL file
│ └── owl_parser.py --source <path-or-url>
└── Generate/refresh a summary JSON
└── ontology_summarizer.py --source <url> --output <path>
Script Outputs (JSON Fields)
| Script |
Key Outputs |
scripts/owl_parser.py |
results.metadata, results.classes, results.object_properties, results.data_properties, results.class_hierarchy |
scripts/ontology_summarizer.py |
results.output_file, results.statistics |
scripts/class_browser.py |
results.class_info, results.subtree, results.properties, results.path_to_root, results.roots, results.search_results |
scripts/property_lookup.py |
results.property_info, results.class_properties, results.search_results |
Workflow
- Identify which ontology the user is working with (default: CMSO).
- Use
class_browser.py --list-roots to see the top-level concepts.
- Drill into specific classes with
class_browser.py --class <name> to see hierarchy, children, and applicable properties.
- Look up individual properties with
property_lookup.py --property <name>.
- If the user mentions a concept but not its ontology name, use
--search to find matching classes or properties.
- For a new or updated ontology, run
owl_parser.py to parse the raw OWL, then ontology_summarizer.py to generate a summary JSON.
Conversational Workflow Example
User: I have an FCC copper simulation. What CMSO classes should I use to describe it?
Agent: Let me explore the CMSO ontology to find the relevant classes.
[Runs: class_browser.py --ontology cmso --search "crystal" --json]
For an FCC copper simulation, the relevant CMSO classes are:
- **Computational Sample** → **Atomic Scale Sample**: your simulation is an atomic-scale sample
- **Material** → **Crystalline Material**: copper is crystalline
- **Crystal Structure**: describes the FCC arrangement
- **Unit Cell**: the repeating FCC unit cell (a=b=c=3.615 Å, α=β=γ=90°)
- **Space Group**: FCC copper is space group 225 (Fm-3m)
- **Chemical Element**: Cu
The key relationships:
AtomicScaleSample → hasMaterial → CrystallineMaterial → hasStructure → CrystalStructure → hasUnitCell → UnitCell
Shall I look up the specific properties for any of these classes?
CLI Examples
# List root classes in CMSO
python3 skills/ontology/ontology-explorer/scripts/class_browser.py \
--ontology cmso --list-roots --json
# Inspect the Material class hierarchy
python3 skills/ontology/ontology-explorer/scripts/class_browser.py \
--ontology cmso --class Material --json
# Search for crystal-related classes
python3 skills/ontology/ontology-explorer/scripts/class_browser.py \
--ontology cmso --search crystal --json
# Find all properties for UnitCell
python3 skills/ontology/ontology-explorer/scripts/property_lookup.py \
--ontology cmso --class UnitCell --json
# Look up a specific property
python3 skills/ontology/ontology-explorer/scripts/property_lookup.py \
--ontology cmso --property "has space group" --json
# Parse a remote OWL file
python3 skills/ontology/ontology-explorer/scripts/owl_parser.py \
--source https://raw.githubusercontent.com/OCDO/cmso/main/cmso.owl --json
# Generate a summary JSON from an OWL file
python3 skills/ontology/ontology-explorer/scripts/ontology_summarizer.py \
--source https://raw.githubusercontent.com/OCDO/cmso/main/cmso.owl \
--output summary.json --json
Error Handling
| Error |
Cause |
Resolution |
Ontology 'X' not in registry |
Ontology name not registered |
Check references/ontology_registry.json for available names |
Class 'X' not found |
Class label doesn't match any entry |
Use --search to find similar names, or --list-roots to see available classes |
Property 'X' not found |
Property label doesn't match |
Use --search to find similar properties |
Cannot parse OWL source |
Invalid XML or unreachable URL |
Check file path or URL; ensure the file is valid OWL/XML |
Summary file not found |
Summary JSON hasn't been generated |
Run ontology_summarizer.py first |
Interpretation Guidance
- Class hierarchy: root classes are the broadest concepts; leaf classes are the most specific. A class inherits all properties from its ancestors.
- Object properties: show how classes relate to each other (domain → range). A property with domain
UnitCell and range Basis means a unit cell has a basis.
- Data properties: show what literal values a class carries. A property with domain
ChemicalElement and range xsd:string means an element has a string-valued attribute.
- Union domains: some properties apply to multiple classes (e.g.,
hasVector applies to both SimulationCell and UnitCell), shown as SimulationCell | UnitCell.
- Search relevance: 1.0 = label match, 0.5 = description match only.
Limitations
- Only supports OWL/XML format (not Turtle, JSON-LD, or N-Triples)
- Does not support OWL reasoning or inference (e.g., does not compute transitive closures)
- Class hierarchy extraction handles simple
rdfs:subClassOf only (not complex OWL restrictions)
- Descriptions may be missing for classes that lack
rdfs:comment, skos:definition, or IAO annotations
- URL fetching requires internet access and may time out (30-second limit)
References
- OWL/RDF Primer — brief introduction to OWL concepts
- CMSO Guide — narrative guide to the CMSO ontology
- Ontology Registry — registered ontologies and their metadata
- CMSO Summary — pre-processed CMSO structure
- CMSO Documentation — official CMSO docs
- CMSO Repository — source OWL file and development
Version History
| Date |
Version |
Changes |
| 2026-02-25 |
1.0 |
Initial release with CMSO support |
1---2name: ontology-explorer3description: Parse, navigate, and query materials science ontology structure (classes, properties, hierarchy). Use when exploring an ontology like CMSO, understanding class relationships, finding properties for a given class, or searching for ontology terms related to a materials science concept. Supports OWL/XML format from the OCDO ecosystem (CMSO, ASMO, CDCO, PODO, PLDO, LDO).4---5
6# Ontology Explorer
7
8## Goal
9
10Enable an agent to understand, navigate, and query the structure of materials science ontologies without loading verbose OWL/XML files directly. Provides fast access to class hierarchies, property definitions, and domain-range relationships through pre-processed JSON summaries.
11
12## Requirements
13
14- Python 3.8+
15- No external dependencies (Python standard library only)
16- Internet access required only for `owl_parser.py` and `ontology_summarizer.py` when fetching remote OWL files
17
18## Inputs to Gather
19
20| Input | Description | Example |
21|-------|-------------|---------|
22| Ontology name | Registered ontology to query | `cmso` |
23| Class name | A specific class to inspect | `Material`, `UnitCell` |
24| Property name | A specific property to look up | `hasMaterial`, `hasSpaceGroupNumber` |
25| Search term | Keyword to search across labels | `crystal`, `lattice` |
26| OWL source | Path or URL to an OWL/XML file (for parsing/summarizing) | `https://raw.githubusercontent.com/OCDO/cmso/main/cmso.owl` |
27
28## Decision Guidance
29
30```
31What do you need?
32├── Understand overall ontology structure
33│ └── class_browser.py --ontology cmso --list-roots
34├── Inspect a specific class
35│ └── class_browser.py --ontology cmso --class <name>
36├── Find properties for a class
37│ └── property_lookup.py --ontology cmso --class <name>
38├── Look up a specific property
39│ └── property_lookup.py --ontology cmso --property <name>
40├── Search for a concept
41│ ├── class_browser.py --ontology cmso --search <term>
42│ └── property_lookup.py --ontology cmso --search <term>
43├── Parse a new/updated OWL file
44│ └── owl_parser.py --source <path-or-url>
45└── Generate/refresh a summary JSON
46 └── ontology_summarizer.py --source <url> --output <path>
47```
48
49## Script Outputs (JSON Fields)
50
51| Script | Key Outputs |
52|--------|-------------|
53| `scripts/owl_parser.py` | `results.metadata`, `results.classes`, `results.object_properties`, `results.data_properties`, `results.class_hierarchy` |
54| `scripts/ontology_summarizer.py` | `results.output_file`, `results.statistics` |
55| `scripts/class_browser.py` | `results.class_info`, `results.subtree`, `results.properties`, `results.path_to_root`, `results.roots`, `results.search_results` |
56| `scripts/property_lookup.py` | `results.property_info`, `results.class_properties`, `results.search_results` |
57
58## Workflow
59
601. Identify which ontology the user is working with (default: CMSO).
612. Use `class_browser.py --list-roots` to see the top-level concepts.
623. Drill into specific classes with `class_browser.py --class <name>` to see hierarchy, children, and applicable properties.
634. Look up individual properties with `property_lookup.py --property <name>`.
645. If the user mentions a concept but not its ontology name, use `--search` to find matching classes or properties.
656. For a new or updated ontology, run `owl_parser.py` to parse the raw OWL, then `ontology_summarizer.py` to generate a summary JSON.
66
67## Conversational Workflow Example
68
69```
70User: I have an FCC copper simulation. What CMSO classes should I use to describe it?
71
72Agent: Let me explore the CMSO ontology to find the relevant classes.
73
74[Runs: class_browser.py --ontology cmso --search "crystal" --json]
75
76For an FCC copper simulation, the relevant CMSO classes are:
77
78- **Computational Sample** → **Atomic Scale Sample**: your simulation is an atomic-scale sample
79- **Material** → **Crystalline Material**: copper is crystalline
80- **Crystal Structure**: describes the FCC arrangement
81- **Unit Cell**: the repeating FCC unit cell (a=b=c=3.615 Å, α=β=γ=90°)
82- **Space Group**: FCC copper is space group 225 (Fm-3m)
83- **Chemical Element**: Cu
84
85The key relationships:
86 AtomicScaleSample → hasMaterial → CrystallineMaterial → hasStructure → CrystalStructure → hasUnitCell → UnitCell
87
88Shall I look up the specific properties for any of these classes?
89```
90
91## CLI Examples
92
93```bash
94# List root classes in CMSO
95python3 skills/ontology/ontology-explorer/scripts/class_browser.py \
96 --ontology cmso --list-roots --json
97
98# Inspect the Material class hierarchy
99python3 skills/ontology/ontology-explorer/scripts/class_browser.py \
100 --ontology cmso --class Material --json
101
102# Search for crystal-related classes
103python3 skills/ontology/ontology-explorer/scripts/class_browser.py \
104 --ontology cmso --search crystal --json
105
106# Find all properties for UnitCell
107python3 skills/ontology/ontology-explorer/scripts/property_lookup.py \
108 --ontology cmso --class UnitCell --json
109
110# Look up a specific property
111python3 skills/ontology/ontology-explorer/scripts/property_lookup.py \
112 --ontology cmso --property "has space group" --json
113
114# Parse a remote OWL file
115python3 skills/ontology/ontology-explorer/scripts/owl_parser.py \
116 --source https://raw.githubusercontent.com/OCDO/cmso/main/cmso.owl --json
117
118# Generate a summary JSON from an OWL file
119python3 skills/ontology/ontology-explorer/scripts/ontology_summarizer.py \
120 --source https://raw.githubusercontent.com/OCDO/cmso/main/cmso.owl \
121 --output summary.json --json
122```
123
124## Error Handling
125
126| Error | Cause | Resolution |
127|-------|-------|------------|
128| `Ontology 'X' not in registry` | Ontology name not registered | Check `references/ontology_registry.json` for available names |
129| `Class 'X' not found` | Class label doesn't match any entry | Use `--search` to find similar names, or `--list-roots` to see available classes |
130| `Property 'X' not found` | Property label doesn't match | Use `--search` to find similar properties |
131| `Cannot parse OWL source` | Invalid XML or unreachable URL | Check file path or URL; ensure the file is valid OWL/XML |
132| `Summary file not found` | Summary JSON hasn't been generated | Run `ontology_summarizer.py` first |
133
134## Interpretation Guidance
135
136- **Class hierarchy**: root classes are the broadest concepts; leaf classes are the most specific. A class inherits all properties from its ancestors.
137- **Object properties**: show how classes relate to each other (domain → range). A property with domain `UnitCell` and range `Basis` means a unit cell *has a* basis.
138- **Data properties**: show what literal values a class carries. A property with domain `ChemicalElement` and range `xsd:string` means an element has a string-valued attribute.
139- **Union domains**: some properties apply to multiple classes (e.g., `hasVector` applies to both `SimulationCell` and `UnitCell`), shown as `SimulationCell | UnitCell`.
140- **Search relevance**: 1.0 = label match, 0.5 = description match only.
141
142## Limitations
143
144- Only supports OWL/XML format (not Turtle, JSON-LD, or N-Triples)
145- Does not support OWL reasoning or inference (e.g., does not compute transitive closures)
146- Class hierarchy extraction handles simple `rdfs:subClassOf` only (not complex OWL restrictions)
147- Descriptions may be missing for classes that lack `rdfs:comment`, `skos:definition`, or IAO annotations
148- URL fetching requires internet access and may time out (30-second limit)
149
150## References
151
152- [OWL/RDF Primer](references/owl_primer.md) — brief introduction to OWL concepts
153- [CMSO Guide](references/cmso_guide.md) — narrative guide to the CMSO ontology
154- [Ontology Registry](references/ontology_registry.json) — registered ontologies and their metadata
155- [CMSO Summary](references/cmso_summary.json) — pre-processed CMSO structure
156- [CMSO Documentation](https://ocdo.github.io/cmso/) — official CMSO docs
157- [CMSO Repository](https://github.com/OCDO/cmso) — source OWL file and development
158
159## Version History
160
161| Date | Version | Changes |
162|------|---------|---------|
163| 2026-02-25 | 1.0 | Initial release with CMSO support |