Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
.DS_Store
.vscode/
Gemfile.lock
html_documentation/
images/*.png
reference-docs/*.owl
9 changes: 6 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,19 @@ PNG := $(patsubst views/%.lutaml,images/%.png,$(SRC))

all: $(PNG)

images/%.png: views/%.lutaml
lutaml -t png -o $@ $<
images/%.png: views/%.lutaml | images
lutaml lml generate -t png -o $@ $<

views/%.lutaml: models/%.wsd | views
lutaml-wsd2uml $< > $@

views:
mkdir views

images:
mkdir images

clean:
$(RM) images/*.png
-$(RM) images/*.png

.PHONY: clean
Binary file removed images/ConceptSource.png
Binary file not shown.
Binary file removed images/Concepts.png
Binary file not shown.
Binary file removed images/Designations.png
Binary file not shown.
Binary file removed images/ManagedConcepts.png
Binary file not shown.
136 changes: 136 additions & 0 deletions ontologies/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
# Glossarist Ontology Suite

A comprehensive OWL ontology for the [Glossarist concept model](https://github.com/glossarist/concept-model) implementing ISO 10241-1 terminology management.

## Namespace

| Prefix | IRI | Purpose |
|--------|-----|---------|
| `gloss:` | `https://www.glossarist.org/ontologies/` | Glossarist-specific classes and properties |
| `skos:` | `http://www.w3.org/2004/02/skos/core#` | Concept scheme, labels, relationships |
| `skosxl:` | `http://www.w3.org/2008/05/skos-xl#` | Reified lexical labels (designations) |
| `iso-thes:` | `http://purl.org/iso25964/skos-thes#` | Hierarchical relationship subtypes |
| `dcterms:` | `http://purl.org/dc/terms/` | Language, bibliographic citation |
| `prov:` | `http://www.w3.org/ns/prov#` | Source provenance |

## File Layout

```
ontologies/
├── glossarist.ttl # Core OWL ontology — classes and properties
├── glossarist.context.jsonld # JSON-LD @context for the namespace
├── README.md # This file
├── reference-docs/ # W3C reference ontology copies
│ ├── skos.ttl # SKOS namespace reference
│ ├── skos-xl.ttl # SKOS-XL namespace reference
│ └── iso-25964-skos-thes.ttl # ISO 25964 SKOS-Thes reference
├── taxonomies/ # SKOS ConceptSchemes for enum values
│ ├── concept-status.ttl # Concept lifecycle status
│ ├── entry-status.ttl # Localized entry status
│ ├── normative-status.ttl # Designation normative status
│ ├── source-type.ttl # Source type (authoritative/lineage)
│ ├── source-status.ttl # Source status (identical/modified/...)
│ ├── relationship-type.ttl # Glossarist-specific relationship types
│ ├── designation-type.ttl # Designation types (expression/abbreviation/symbol/...)
│ ├── term-type.ttl # ISO 12620 term types (24 values)
│ ├── grammar-gender.ttl # Grammatical gender
│ └── grammar-number.ttl # Grammatical number
└── shapes/
└── glossarist.shacl.ttl # SHACL validation shapes
```

## Design Principles

1. **SKOS alignment** — `gloss:Concept` is a `skos:Concept`. Designations use `skosxl:Label`. Instant interoperability with SKOS tooling.

2. **SKOS-XL for designations** — Each designation is both a `gloss:Designation` subclass and a `skosxl:Label`, with `skosxl:literalForm` carrying the text. Preferred designations are linked via `skosxl:prefLabel`, non-preferred via `skosxl:altLabel`.

3. **ISO 25964 reuse** — Hierarchical relationship subtypes (`broaderGeneric`/`narrowerGeneric`, `broaderPartitive`/`narrowerPartitive`, `broaderInstantial`/`narrowerInstantial`) are reused directly from `iso-thes:` rather than duplicated.

4. **SKOS taxonomies for enums** — All enumeration values are `skos:Concept` individuals in `skos:ConceptScheme` collections, not OWL named individuals.

5. **No blank nodes** — All instances are identifiable with proper IRIs.

## Core Classes

### Concept Management

| Class | Alignment | Maps to (glossarist-ruby) |
|-------|-----------|--------------------------|
| `gloss:Concept` | `skos:Concept` | `ManagedConcept` |
| `gloss:LocalizedConcept` | `skos:Concept` | `LocalizedConcept` |
| `gloss:ConceptCollection` | `skos:Collection` | `ManagedConceptCollection` |

### Designation Hierarchy (MECE)

```
gloss:Designation (skosxl:Label)
├── gloss:Expression
│ └── gloss:Abbreviation
└── gloss:Symbol
├── gloss:LetterSymbol
└── gloss:GraphicalSymbol
```

### Supporting Classes

`Pronunciation`, `GrammarInfo`, `DetailedDefinition`, `ConceptSource`, `ConceptReference`, `RelatedConcept`, `ConceptDate`, `NonVerbalRepresentation`, `DesignationRelationship`, `Citation`, `Locality`.

## Relationship Property Mapping

Standard relationships are reused directly:

| Glossarist type | RDF property |
|----------------|-------------|
| broader / narrower | `skos:broader` / `skos:narrower` |
| broader_generic | `iso-thes:broaderGeneric` |
| broader_partitive | `iso-thes:broaderPartitive` |
| broader_instantial | `iso-thes:broaderInstantial` |
| equivalent | `skos:exactMatch` |
| close_match | `skos:closeMatch` |
| broad_match | `skos:broadMatch` |
| see / related | `skos:related` |

Glossarist-specific relationships are defined as `gloss:` properties:

`gloss:deprecates`, `gloss:supersedes`, `gloss:compares`, `gloss:contrasts`, `gloss:sequentiallyRelated`, `gloss:spatiallyRelated`, `gloss:temporallyRelated`, `gloss:hasHomograph`, `gloss:hasFalseFriend`, `gloss:abbreviatedFormFor`, `gloss:shortFormFor`.

## Usage Example

```turtle
@prefix gloss: <https://www.glossarist.org/ontologies/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix xl: <http://www.w3.org/2008/05/skos-xl#> .
@prefix iso-thes: <http://purl.org/iso25964/skos-thes#> .
@prefix dcterms: <http://purl.org/dc/terms/> .

<urn:glossarist:concept:103-01-01> a gloss:Concept, skos:Concept ;
gloss:identifier "103-01-01" ;
gloss:hasStatus gloss:status/valid ;
gloss:hasLocalization <urn:glossarist:l10n:103-01-01-eng> .

<urn:glossarist:l10n:103-01-01-eng> a gloss:LocalizedConcept, skos:Concept ;
gloss:isLocalizationOf <urn:glossarist:concept:103-01-01> ;
dcterms:language "eng" ;
skosxl:prefLabel <urn:glossarist:label:103-01-01-eng-pref> ;
gloss:hasDefinition [
rdf:value "a concept within a defined scope..."@eng
] .

<urn:glossarist:label:103-01-01-eng-pref> a gloss:Expression, iso-thes:PreferredTerm ;
xl:literalForm "geometric node"@eng ;
gloss:normativeStatus gloss:norm/preferred .
```

## Validation

SHACL shapes in `shapes/glossarist.shacl.ttl` validate:
- Concept types and required properties
- Designation class hierarchy and property constraints
- Source, citation, and date structure

Use [pySHACL](https://github.com/RDFLib/pySHACL) or [Apache Jena](https://jena.apache.org/) to validate instance data against these shapes.

## License

CC-BY 4.0
189 changes: 189 additions & 0 deletions ontologies/glossarist.context.jsonld
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
{
"@context": {
"@version": 1.1,

"gloss": "https://www.glossarist.org/ontologies/",
"skos": "http://www.w3.org/2004/02/skos/core#",
"skosxl": "http://www.w3.org/2008/05/skos-xl#",
"iso-thes": "http://purl.org/iso25964/skos-thes#",
"dcterms": "http://purl.org/dc/terms/",
"prov": "http://www.w3.org/ns/prov#",
"owl": "http://www.w3.org/2002/07/owl#",
"rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
"rdfs": "http://www.w3.org/2000/01/rdf-schema#",
"xsd": "http://www.w3.org/2001/XMLSchema#",
"vann": "http://purl.org/vocab/vann/",

"Concept": "gloss:Concept",
"ConceptCollection": "gloss:ConceptCollection",
"LocalizedConcept": "gloss:LocalizedConcept",
"Designation": "gloss:Designation",
"Expression": "gloss:Expression",
"Abbreviation": "gloss:Abbreviation",
"Symbol": "gloss:Symbol",
"LetterSymbol": "gloss:LetterSymbol",
"GraphicalSymbol": "gloss:GraphicalSymbol",
"Pronunciation": "gloss:Pronunciation",
"GrammarInfo": "gloss:GrammarInfo",
"DetailedDefinition": "gloss:DetailedDefinition",
"ConceptSource": "gloss:ConceptSource",
"ConceptReference": "gloss:ConceptReference",
"RelatedConcept": "gloss:RelatedConcept",
"ConceptDate": "gloss:ConceptDate",
"NonVerbalRepresentation": "gloss:NonVerbalRepresentation",
"DesignationRelationship": "gloss:DesignationRelationship",
"Citation": "gloss:Citation",
"Locality": "gloss:Locality",

"identifier": { "@id": "gloss:identifier", "@type": "xsd:string" },
"hasLocalization": { "@id": "gloss:hasLocalization", "@type": "@id" },
"isLocalizationOf": { "@id": "gloss:isLocalizationOf", "@type": "@id" },
"hasStatus": { "@id": "gloss:hasStatus", "@type": "@id" },
"hasDomain": { "@id": "gloss:hasDomain", "@type": "@id" },
"hasRelatedConcept": { "@id": "gloss:hasRelatedConcept", "@type": "@id" },
"hasDate": { "@id": "gloss:hasDate", "@type": "@id" },
"hasSource": { "@id": "gloss:hasSource", "@type": "@id" },

"hasEntryStatus": { "@id": "gloss:hasEntryStatus", "@type": "@id" },
"hasDesignation": { "@id": "gloss:hasDesignation", "@type": "@id" },
"hasDefinition": { "@id": "gloss:hasDefinition", "@type": "@id" },
"hasNote": { "@id": "gloss:hasNote", "@type": "@id" },
"hasExample": { "@id": "gloss:hasExample", "@type": "@id" },
"hasNonVerbalRep": { "@id": "gloss:hasNonVerbalRep", "@type": "@id" },
"domain": { "@id": "gloss:domain", "@type": "xsd:anyURI" },
"release": { "@id": "gloss:release", "@type": "xsd:string" },
"lineageSimilarity": { "@id": "gloss:lineageSimilarity", "@type": "xsd:integer" },

"normativeStatus": { "@id": "gloss:normativeStatus", "@type": "@id" },
"hasPronunciation": { "@id": "gloss:hasPronunciation", "@type": "@id" },
"hasTermType": { "@id": "gloss:hasTermType", "@type": "@id" },
"hasDesignationRel": { "@id": "gloss:hasDesignationRel", "@type": "@id" },
"hasGrammarInfo": { "@id": "gloss:hasGrammarInfo", "@type": "@id" },
"geographicalArea": { "@id": "gloss:geographicalArea", "@type": "xsd:string" },
"isInternational": { "@id": "gloss:isInternational", "@type": "xsd:boolean" },
"isAbsent": { "@id": "gloss:isAbsent", "@type": "xsd:boolean" },

"prefix": { "@id": "gloss:prefix", "@type": "xsd:string" },
"usageInfo": { "@id": "gloss:usageInfo", "@type": "xsd:string" },
"fieldOfApplication": { "@id": "gloss:fieldOfApplication", "@type": "xsd:string" },

"isAcronym": { "@id": "gloss:isAcronym", "@type": "xsd:boolean" },
"isInitialism": { "@id": "gloss:isInitialism", "@type": "xsd:boolean" },
"isTruncation": { "@id": "gloss:isTruncation", "@type": "xsd:boolean" },

"text": { "@id": "gloss:text", "@type": "xsd:string" },
"image": { "@id": "gloss:image", "@type": "xsd:anyURI" },

"pronunciationContent": { "@id": "gloss:pronunciationContent", "@type": "xsd:string" },
"pronunciationLanguage": { "@id": "gloss:pronunciationLanguage", "@type": "xsd:string" },
"pronunciationScript": { "@id": "gloss:pronunciationScript", "@type": "xsd:string" },
"pronunciationCountry": { "@id": "gloss:pronunciationCountry", "@type": "xsd:string" },
"pronunciationSystem": { "@id": "gloss:pronunciationSystem", "@type": "xsd:string" },

"relationshipType": { "@id": "gloss:relationshipType", "@type": "@id" },
"relationshipContent": { "@id": "gloss:relationshipContent", "@type": "xsd:string" },
"relationshipRef": { "@id": "gloss:relationshipRef", "@type": "@id" },

"refType": { "@id": "gloss:refType", "@type": "xsd:string" },
"conceptId": { "@id": "gloss:conceptId", "@type": "xsd:string" },
"sourceUri": { "@id": "gloss:sourceUri", "@type": "xsd:anyURI" },
"urn": { "@id": "gloss:urn", "@type": "xsd:anyURI" },

"sourceType": { "@id": "gloss:sourceType", "@type": "@id" },
"sourceStatus": { "@id": "gloss:sourceStatus", "@type": "@id" },
"sourceOrigin": { "@id": "gloss:sourceOrigin", "@type": "@id" },
"modification": { "@id": "gloss:modification", "@type": "xsd:string" },

"citationText": { "@id": "gloss:citationText", "@type": "xsd:string" },
"citationSource": { "@id": "gloss:citationSource", "@type": "xsd:string" },
"citationId": { "@id": "gloss:citationId", "@type": "xsd:string" },
"citationVersion": { "@id": "gloss:citationVersion", "@type": "xsd:string" },
"citationLink": { "@id": "gloss:citationLink", "@type": "xsd:anyURI" },
"hasLocality": { "@id": "gloss:hasLocality", "@type": "@id" },

"dateValue": { "@id": "gloss:dateValue", "@type": "xsd:dateTime" },
"dateType": { "@id": "gloss:dateType", "@type": "@id" },

"representationType": { "@id": "gloss:representationType", "@type": "xsd:string" },
"representationRef": { "@id": "gloss:representationRef", "@type": "xsd:anyURI" },
"representationText": { "@id": "gloss:representationText", "@type": "xsd:string" },

"designationRelType": { "@id": "gloss:designationRelType", "@type": "xsd:string" },
"designationRelTarget": { "@id": "gloss:designationRelTarget", "@type": "xsd:string" },

"localityType": { "@id": "gloss:localityType", "@type": "xsd:string" },
"referenceFrom": { "@id": "gloss:referenceFrom", "@type": "xsd:string" },
"referenceTo": { "@id": "gloss:referenceTo", "@type": "xsd:string" },

"gender": { "@id": "gloss:gender", "@type": "@id" },
"number": { "@id": "gloss:number", "@type": "@id" },
"isNoun": { "@id": "gloss:isNoun", "@type": "xsd:boolean" },
"isVerb": { "@id": "gloss:isVerb", "@type": "xsd:boolean" },
"isAdjective": { "@id": "gloss:isAdjective", "@type": "xsd:boolean" },
"isAdverb": { "@id": "gloss:isAdverb", "@type": "xsd:boolean" },
"isPreposition": { "@id": "gloss:isPreposition", "@type": "xsd:boolean" },
"isParticiple": { "@id": "gloss:isParticiple", "@type": "xsd:boolean" },

"script": { "@id": "gloss:script", "@type": "xsd:string" },
"conversionSystem": { "@id": "gloss:conversionSystem", "@type": "xsd:string" },

"deprecates": { "@id": "gloss:deprecates", "@type": "@id" },
"deprecatedBy": { "@id": "gloss:deprecatedBy", "@type": "@id" },
"supersedes": { "@id": "gloss:supersedes", "@type": "@id" },
"supersededBy": { "@id": "gloss:supersededBy", "@type": "@id" },
"compares": { "@id": "gloss:compares", "@type": "@id" },
"contrasts": { "@id": "gloss:contrasts", "@type": "@id" },
"sequentiallyRelated": { "@id": "gloss:sequentiallyRelated", "@type": "@id" },
"spatiallyRelated": { "@id": "gloss:spatiallyRelated", "@type": "@id" },
"temporallyRelated": { "@id": "gloss:temporallyRelated", "@type": "@id" },
"hasHomograph": { "@id": "gloss:hasHomograph", "@type": "@id" },
"hasFalseFriend": { "@id": "gloss:hasFalseFriend", "@type": "@id" },
"abbreviatedFormFor": { "@id": "gloss:abbreviatedFormFor", "@type": "@id" },
"shortFormFor": { "@id": "gloss:shortFormFor", "@type": "@id" },

"prefLabel": "skos:prefLabel",
"altLabel": "skos:altLabel",
"hiddenLabel": "skos:hiddenLabel",
"definition": "skos:definition",
"scopeNote": "skos:scopeNote",
"note": "skos:note",
"example": "skos:example",
"notation": "skos:notation",
"inScheme": { "@id": "skos:inScheme", "@type": "@id" },
"hasTopConcept": { "@id": "skos:hasTopConcept", "@type": "@id" },
"broader": { "@id": "skos:broader", "@type": "@id" },
"narrower": { "@id": "skos:narrower", "@type": "@id" },
"related": { "@id": "skos:related", "@type": "@id" },
"exactMatch": { "@id": "skos:exactMatch", "@type": "@id" },
"closeMatch": { "@id": "skos:closeMatch", "@type": "@id" },
"broadMatch": { "@id": "skos:broadMatch", "@type": "@id" },
"narrowMatch": { "@id": "skos:narrowMatch", "@type": "@id" },
"relatedMatch": { "@id": "skos:relatedMatch", "@type": "@id" },

"literalForm": "skosxl:literalForm",
"labelRelation": "skosxl:labelRelation",

"broaderGeneric": { "@id": "iso-thes:broaderGeneric", "@type": "@id" },
"narrowerGeneric": { "@id": "iso-thes:narrowerGeneric", "@type": "@id" },
"broaderPartitive": { "@id": "iso-thes:broaderPartitive", "@type": "@id" },
"narrowerPartitive": { "@id": "iso-thes:narrowerPartitive", "@type": "@id" },
"broaderInstantial": { "@id": "iso-thes:broaderInstantial", "@type": "@id" },
"narrowerInstantial": { "@id": "iso-thes:narrowerInstantial", "@type": "@id" },

"language": { "@id": "dcterms:language", "@type": "@id" },
"bibliographicCitation": { "@id": "dcterms:bibliographicCitation", "@type": "xsd:string" },

"wasDerivedFrom": { "@id": "prov:wasDerivedFrom", "@type": "@id" },
"hadDerivation": { "@id": "prov:hadDerivation", "@type": "@id" },
"qualifiedDerivation": { "@id": "prov:qualifiedDerivation", "@type": "@id" },

"label": "rdfs:label",
"comment": "rdfs:comment",
"seeAlso": { "@id": "rdfs:seeAlso", "@type": "@id" },
"subClassOf": { "@id": "rdfs:subClassOf", "@type": "@id" },

"type": { "@id": "@type", "@container": "@set" },
"id": "@id",
"value": "rdf:value"
}
}
Loading
Loading