Overview

Odeuropa Explorer is a fascinating project that digitizes European olfactory heritage. Funded by the EU’s Horizon 2020 research program, it provides a platform for cross-searching and exploring historical scent experiences.

The project classifies scent-related information into three main categories:

  • Smell sources: Objects and substances that emit odors
  • Fragrant Spaces: Places and spaces associated with scents
  • Gestures and Allegories: Gestures and allegorical expressions related to scents

This article reports the results of investigating what hierarchical structures these vocabularies have, using SKOS (Simple Knowledge Organization System) data published in the Odeuropa vocabularies repository.

Methodology

SKOS Hierarchy Visualization Script

To understand the hierarchical structure of the vocabularies, I created a script in Node.js to parse SKOS Turtle files.

import $rdf from 'rdflib';
import fs from 'fs';

const SKOS = $rdf.Namespace('http://www.w3.org/2004/02/skos/core#');

async function visualizeHierarchy(ttlFile) {
  const store = $rdf.graph();
  const data = fs.readFileSync(ttlFile, 'utf8');
  $rdf.parse(data, store, 'http://example.org/', 'text/turtle');

  // Get all concepts
  const concepts = store.match(null,
    $rdf.sym('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'),
    SKOS('Concept'));

  // Build maps for broader/narrower relationships
  const broaderMap = new Map();
  const narrowerMap = new Map();
  const conceptLabels = new Map();

  for (const concept of concepts) {
    const subject = concept.subject;

    // Get prefLabel
    const labels = store.match(subject, SKOS('prefLabel'), null);
    if (labels.length > 0) {
      conceptLabels.set(subject.value, labels[0].object.value);
    }

    // Get broader concepts
    const broaders = store.match(subject, SKOS('broader'), null);
    if (broaders.length > 0) {
      const broader = broaders[0].object.value;
      broaderMap.set(subject.value, broader);

      if (!narrowerMap.has(broader)) {
        narrowerMap.set(broader, []);
      }
      narrowerMap.get(broader).push(subject.value);
    }
  }

  // Print hierarchy recursively
  function printHierarchy(conceptUri, indent = '', visited = new Set()) {
    if (visited.has(conceptUri)) return;
    visited.add(conceptUri);

    const label = conceptLabels.get(conceptUri);
    const children = narrowerMap.get(conceptUri) || [];

    console.log(`${indent}${label}`);

    children.forEach((child, index) => {
      const isLast = index === children.length - 1;
      const prefix = isLast ? '└── ' : '├── ';
      printHierarchy(child, indent + prefix, new Set(visited));
    });
  }

  // Find and display top-level concepts
  const topLevelConcepts = [];
  for (const concept of concepts) {
    if (!broaderMap.has(concept.subject.value)) {
      topLevelConcepts.push(concept.subject.value);
    }
  }

  topLevelConcepts.forEach(concept => printHierarchy(concept));
}

The main processing steps of this script are:

  1. Loading the RDF graph: Parse vocabulary files in Turtle format using rdflib
  2. Extracting hierarchical relationships: Manage skos:broader and skos:narrower relationships with Map objects
  3. Identifying top-level concepts: Detect concepts that do not have skos:broader
  4. Recursive hierarchy display: Visually represent the data as a tree structure

Execution

The script was run against all three vocabularies:

# Smell sources
node visualize-hierarchy.js olfactory-objects.ttl > olfactory-objects-hierarchy.txt

# Fragrant Spaces
node visualize-hierarchy.js fragrant-spaces.ttl > hierarchy-fragrant-spaces-20251010-231358.txt

# Gestures and Allegories
node visualize-hierarchy.js olfactory-gestures.ttl > olfactory-gestures-hierarchy.txt

Results

1. Smell Sources

Total concepts: 685
Top-level concepts: 13
Concepts with children: 77
Maximum hierarchy depth: 4

Depth distribution:

  • Level 0 (top-level): 13 concepts
  • Level 1: 383 concepts
  • Level 2: 202 concepts
  • Level 3: 42 concepts
  • Level 4: 45 concepts

Top-level categories:

Abstract
Artefact
Being
Body
Element
Flora
Food
Fragrance / Cosmetic
Fumes
Matter
Nature
Product
Religion

Examples of notable deep hierarchical structures:

Being hierarchy (click to expand)
Being (555)
├── Kadaver (23)
├── Onycha (397)
├── Person (539)
├── ├── Man (540)
├── └── Woman (541)
└── Tier (13)
    ├── (gestrandeter) Wal (5)
    ├── Äschen (428)
    ├── Biber (14)
    ├── Big cat (571)
    ├── Drachen (56)
    ├── Dünger (98)
    ├── Fell (76)
    ├── Fisch (68)
    ├── Hunde (55)
    ├── Moschushirsch (101)
    ├── Musk Rat (102)
    ├── Oiselet (387)
    ├── Pottwal (153)
    ├── Stinktier (146)
    ├── Wirbellos (464)
    │   ├── Crustacean (343)
    │   │   ├── Crab (489)
    │   │   └── Languste (469)
    │   ├── Fliegen (468)
    │   ├── Garnele (470)
    │   ├── Insekt (471)
    │   │   ├── Ant (490)
    │   │   ├── Cocoon (518)
    │   │   ├── Dragonfly (491)
    │   │   ├── Grasshopper (504)
    │   │   ├── Maggot (601)
    │   │   ├── Moth (525)
    │   │   └── Vetiver (398)
    │   ├── Muschel (465)
    │   ├── Raupe (467)
    │   ├── Schmetterling (466)
    │   ├── Snail (488)
    │   ├── Spider (526)
    │   └── Worm (542)
    ├── Wirbeltiere (459)
    │   ├── Amphibia (479)
    │   │   └── Frog (524)
    │   ├── Karkasse (460)
    │   ├── Mammal (480)
    │   │   ├── Antilopinae (580)
    │   │   ├── Armadillo (581)
    │   │   ├── Bear (514)
    │   │   ├── Boar (584)
    │   │   ├── Bullen (191)
    │   │   ├── Camel (508)
    │   │   ├── Deer (503)
    │   │   ├── Elephant (590)
    │   │   ├── Ferret (593)
    │   │   ├── Fox (594)
    │   │   ├── Guinea pig (510)
    │   │   ├── Hausesel (463)
    │   │   ├── Hauskatze (462)
    │   │   ├── Hedgehog (599)
    │   │   ├── Kühe (190)
    │   │   ├── Leopard (515)
    │   │   ├── Lion (502)
    │   │   ├── Monkey (499)
    │   │   ├── Mouse (509)
    │   │   ├── Pferde (189)
    │   │   ├── Rabbit (501)
    │   │   ├── Rat (500)
    │   │   ├── Schaf (193)
    │   │   ├── Schweine (188)
    │   │   ├── Squirrel (606)
    │   │   ├── Tiger (512)
    │   │   ├── Wolf (513)
    │   │   └── Ziegenbock (192)
    │   ├── Reptile (478)
    │   │   ├── Lizard (506)
    │   │   └── Snake (516)
    │   ├── Reptile/Amphibia (477)
    │   └── Vogel (461)
    │       ├── Enten (578)
    │       ├── Huhn (194)
    │       └── Tauben (195)
    └── Zibetkatze (45)
Flora hierarchy (click to expand)
Flora (560)
├── Acacia farnesiana (239)
├── Akeleien (91)
├── Algae (543)
├── Aloe (652)
├── Bäume (200)
│   ├── Akazie (221)
│   ├── Bark (625)
│   ├── Conifer (358)
│   │   └── Cedar (Virginia) (359)
│   │       └── Cedar (Lebanon) (360)
│   ├── Eiche (218)
│   ├── Eucalyptus (355)
│   ├── Holz (476)
│   │   ├── Lignum Aquilae (426)
│   │   ├── Oud (396)
│   │   └── Sandelholz (202)
│   ├── Kampfer (24)
│   ├── Linde (201)
│   ├── Lorbeer (232)
│   ├── Myrte (234)
│   ├── Nitre plant (402)
│   ├── Ulme (61)
│   └── Wacholderbeere (231)
├── Bergamot (668)
├── Berry (675)
├── Blossom (557)
│   └── Orange blossom (551)
├── Blumen (72)
│   ├── Agapanthus (579)
│   ├── Calla Lily (585)
│   ├── Chrysanthemum (586)
│   ├── Epidendrum (591)
│   ├── Galanthus (595)
│   ├── Gerbera (597)
│   ├── Hibiscus (600)
│   └── Marigold (684)
... (truncated)

Notable observations:

  1. Deepest hierarchical structure: With a maximum depth of 4, this vocabulary has the most complex hierarchy among the three
  2. 13 top-level categories: A systematic classification including Abstract, Artefact, Being, Body, Element, Flora, Food, Fragrance/Cosmetic, Fumes, Matter, Nature, Product, and Religion
  3. Overwhelming scale: 685 concepts far exceeds the other two vocabularies (138 and 36)
  4. Biological taxonomy approach: Being and Flora have detailed hierarchical structures resembling scientific classification
  5. Fusion of culture and science: Covers a wide range of knowledge domains from religious concepts to chemical substances
  6. Detailed artifact classification: The Artefact category includes diverse scent-related artifacts such as perfume bottles, jewelry, and smoking implements

2. Fragrant Spaces

Total concepts: 138
Top-level concepts: 91
Concepts with children: 23
Maximum hierarchy depth: 2

Depth distribution:

  • Level 0 (top-level): 91 concepts
  • Level 1: 44 concepts
  • Level 2: 3 concepts

Full hierarchical structure:

Click to show all 138 concepts
Anatomical theatre (83)

Arabia (109)

Arcadia (110)

Badehaus (58)

Bakery (105)

Ball (3)

Bauernhof (25)
└── Poultry farm (57)

Bleaching field (7)

Brauerei (6)

Brennerei (17)

Brothel (82)

Building (129)
└── House (69)
    ├── Apartment (118)
    └── Old House (86)

Burg (8)

Chimney (130)

Coal Wagon (113)

Countryside (122)
└── Field (128)
    └── Hayfield (30)

Dilligence (114)

Fabrik (23)
├── Cacao factory (10)
├── Chemical industry (13)
├── Factory-interior (24)
├── Pastry factory (55)
├── Sugar factory (65)
├── Tobacco factory (71)
└── Vinegar factory (90)

Factories and mills in landscape (22)

Field hospital (78)

Garten (27)
├── Botanical garden (84)
├── Fenced garden (81)
└── Tea garden (72)

Gewächshaus (29)
├── Limonaia (43)
└── Orangerie (44)

Graveyard (77)

Grocery (28)

Handicraft place (31)

Haystack (115)

Hell (101)

Hot-house (33)

Hotel (138)

Jagdszene (34)

Jail (137)

Kaffeehaus (36)

Kanal (11)

Kanalisation (98)

Keller (12)

Krankenhaus (32)
└── Hospital ward (74)

Küche (37)
├── Poor kitchen (39)
└── Rich kitchen (38)

Laboratory (136)
└── Alchemist's workshop (1)

Lake (132)

Lane (40)

Laundry place (9)

Library (95)

Lime Kiln (42)

Limkiln (99)

Markt (45)
├── Animal market (2)
├── Fischmarkt (26)
└── Markthalle (46)

Meadow (48)

Medical garden (87)

Misthaufen (18)

Mountain (49)

Museum (54)

Nursery (plants) (50)

Office (52)

Paradise (108)

Place (121)

Place of worship (53)
├── Chapel (131)
├── Kirche (35)
├── Monastery (134)
├── Mosque (89)
└── Synagogue (88)

Pleasure fair (79)

Pond (133)

Print shop (106)

Prison (56)

Pub (100)

Public Bath (59)

Restaurant (92)
└── Kantine (16)

Room (117)
├── Badezimmer (4)
├── Bedroom (111)
├── Living room (112)
├── Refectory (135)
├── Speisesaal (15)
└── Toilet (124)

Ropery (80)

Run factory (97)

Schlachtfeld (76)

School (104)

Sea (93)
└── Ocean (51)

Shop (107)
└── Toko (119)

Slaughter house (61)

Slum (62)

Soap works (85)

Stadt (14)
└── Neighbourhood (123)

Ställe (63)
└── Pensionsstall (116)

Station (120)

Strand (5)
└── Shore (125)

Street (64)
└── Dirt road (103)

Stud farm (60)

Swamps and polders (66)
├── Marshland (47)
├── Polder (96)
└── Swamp (67)

Tannery (68)

Teergrube (94)

Theatre (102)

Tobacco spinning workshop (91)

Town (126)

Tropic (127)

Village (73)

Wald (19)
└── Waldbrand (20)

Walkmühle (21)

Warehouse (41)

Wash house (75)

Wig shop (70)

Notable hierarchical structure highlights:

Fabrik (Factory)
├── Cacao factory
├── Chemical industry
├── Factory-interior
├── Pastry factory
├── Sugar factory
├── Tobacco factory
└── Vinegar factory

Garten (Garden)
├── Botanical garden
├── Fenced garden
└── Tea garden

Place of worship
├── Chapel
├── Kirche (Church)
├── Monastery
├── Mosque
└── Synagogue

Building
└── House
    ├── Apartment
    └── Old House

Notable observations:

  1. Multilingual nature: German (Fabrik, Garten, Wald) and English are mixed, reflecting the characteristics of this pan-European multilingual project
  2. Relatively flat structure: With a maximum depth of 2, most concepts are at the top level or one level below
  3. Diversity of places: Comprehensively covers scent-related locations including factories, markets, religious facilities, and natural environments
  4. Detailed classification of industrial facilities: Fabrik (Factory) in particular has 7 specialized subcategories, suggesting the importance of scents during the Industrial Revolution

3. Gestures and Allegories

Total concepts: 36
Top-level concepts: 34
Concepts with children: 2
Maximum hierarchy depth: 1

Depth distribution:

  • Level 0 (top-level): 34 concepts
  • Level 1: 2 concepts

Full hierarchical structure:

Click to show all 36 concepts
Ash collecting (27)

Bleaching (7)

Burning (19)

Burnt offering (31)

Changing diaper (17)

Defecation (8)

Doctor sniffing cane (34)

Eating (15)

Embalming (10)

Examination of urine (12)

Fainting (20)

Flatulence (4)

Food tasting (16)

Fumigating (health) (33)

Garbage collecting (26)

Hand towards the nose (24)

Harvesting civet from civet cat (30)

Holding one's nose (2)

Holding one's nose closed (3)

Holding something to the nose (14)

Hunting (5)

Making toilet (25)

Per fumum (9)

Perfuming (29)

Rag picking (35)

Scent distributing (23)
└── Censing (21)

Smelling (1)
└── Piss smelling (22)

Smoking (18)

Street sweeping (13)

Urination (11)

Using scents (28)

Vomiting (6)

Washing (36)

Womb fumigation (32)

Concepts with hierarchy:

Scent distributing
└── Censing

Smelling
└── Piss smelling

Key concepts by category:

  • Nasal gestures: Holding one’s nose, Hand towards the nose
  • Hygiene and cleaning activities: Garbage collecting, Street sweeping, Washing
  • Medical practices: Examination of urine, Embalming, Doctor sniffing cane
  • Religious rituals: Burnt offering, Per fumum (through smoke)
  • Daily activities: Eating, Smoking, Defecation

Notable observations:

  1. Nearly flat structure: 34 out of 36 concepts are at the top level, indicating low need for hierarchization
  2. Focus on physical actions: Most concepts are related to physical gestures or actions
  3. Medicine and hygiene: Includes historical medical and hygienic practices such as urine examination and fumigation
  4. Cultural diversity: Covers a wide range of cultural contexts from religious rituals to everyday activities

Technical Analysis

Comparison Among Vocabularies

Comparing the three vocabularies reveals the characteristics of each domain:

VocabularyTotal ConceptsTop-levelMax DepthCharacteristics
Smell sources685134Systematic classification, deep hierarchy
Fragrant Spaces138912Flat structure, diverse places
Gestures and Allegories36341Nearly flat, independent actions

Implications of scale differences:

  • Smell sources is overwhelmingly the largest, reflecting the enormous diversity of scent sources
  • Fragrant Spaces is medium-sized, dealing with concrete concepts of places
  • Gestures and Allegories is the smallest but comprises carefully selected culturally significant actions

Implications of hierarchy depth:

  • Deep hierarchy (Smell sources): Naturally hierarchical knowledge such as biological taxonomy and product categories
  • Shallow hierarchy (Fragrant Spaces, Gestures): Places and actions exist as relatively independent concepts

Alignment with SKOS Design Principles

The three vocabularies investigated have structures faithful to SKOS design principles:

  1. Appropriate hierarchy depth: Maximum depths of 1 to 4, adapted to the nature of each domain
  2. Clear broader/narrower relationships: The hierarchical relationships between concepts are clearly defined
  3. Balanced top-level concepts: Smell sources has 13 systematic categories, Fragrant Spaces has 91 diverse places, and Gestures has 34 independent actions

Data Modeling Characteristics

The differences in hierarchy depth among the three vocabularies reflect the nature of each domain:

  • Smell sources (depth 4): Inherently hierarchical knowledge systems such as natural classification and product hierarchies
    • Example: Being > Tier > Wirbeltiere > Mammal > Lion
    • Example: Flora > Baume > Holz > Sandelholz
  • Fragrant Spaces (depth 2): Shallow hierarchy based on spatial containment relationships
    • Example: Building > House > Apartment
  • Gestures and Allegories (depth 1): Exist as independent actions with low need for hierarchization
    • Example: Smelling > Piss smelling (one of the few hierarchical relationships)

Implementation Considerations

Key points in the script implementation:

  1. Circular reference checking: Using a visited Set to prevent infinite loops
  2. Label retrieval: Fallback from URI when skos:prefLabel is not available
  3. Sorting: Alphabetical sorting to ensure output consistency
  4. Statistics: Aggregating depth distribution and child counts to quantitatively characterize the vocabularies

Summary

Through investigating the structures of the three Odeuropa Explorer vocabularies (Smell sources, Fragrant Spaces, Gestures and Allegories), the following findings emerged:

  1. Domain-appropriate design:

    • Smell sources (685 concepts, depth 4): Systematic classification with deep hierarchy
    • Fragrant Spaces (138 concepts, depth 2): Moderate hierarchy with diversity
    • Gestures and Allegories (36 concepts, depth 1): Flat structure with independence
  2. Cultural and historical richness: The diversity of European olfactory cultural heritage is condensed into a total of 859 concepts

  3. Multilingual nature: A mix of German, English, French, and Latin, embodying the characteristics of a pan-European project

  4. Flexibility of hierarchical structure: Each domain adopts the optimal hierarchy depth, from natural classification to places and actions

  5. Balance of practicality and scholarship: A balance between flat structures suitable for search and exploration and the hierarchy needed for systematic organization of knowledge

Understanding vocabulary hierarchical structures like these provides practical examples of knowledge organization in digital humanities. The analysis of three vocabularies with different characteristics demonstrates that SKOS is an effective tool not only for academic research but also for cultural heritage digitization projects.

References

Data and Code

Files used and generated in this study:

Analysis Target

Generated Files

  • visualize-hierarchy.js - SKOS hierarchy visualization script
  • olfactory-objects-hierarchy.txt - Full hierarchy output for Smell sources (685 concepts)
  • hierarchy-fragrant-spaces-20251010-231358.txt - Full hierarchy output for Fragrant Spaces (138 concepts)
  • olfactory-gestures-hierarchy.txt - Full hierarchy output for Gestures and Allegories (36 concepts)