Topic map in CTM

Introductie

In deze tutorial bouwen we stap voor stap een topic map waarin de basisprincipes van de Topic Maps-standaard aan bod komen. De notatievorm is Compact Topic Maps syntax (CTM), deze is speciaal bedoeld om gemakkelijk door mensen geschreven en gelezen te kunnen worden. Om door de topic map te kunnen navigeren gebruiken we de Omnigator webapplicatie van Ontopia.

Ontopia is een open source framework voor Topic Maps. Het bevat een Topic Maps engine en een aantal webapplicaties om het werken met Topic Maps makkelijker te maken. Omnigator is één van die applicaties welke het mogelijk maakt door iedere willekeurige topic map te browsen. Als je Ontopia nog niet hebt geïnstalleerd kun je de tutorial Ontopia Installeren volgen.

In het vervolg van deze tekst duiden we de plaats waar Ontopia op je harde schijf staat aan met $ONTOPIA_HOME. Dit is bijvoorbeeld C:\Ontopia op Windows of ~/Ontopia op een Unix-systeem. We volgen verder de Unix-conventie door paden te scheiden met een forward-slash (/). Op een Windows-systeem moet je dit vertalen naar een backward-slash (\).


De casus van de tutorial is het opstellen van een domeinmodel rond de algemene ouderdomswet (AOW). We zullen in eerste instantie een eigen ontologie ontwikkelen. Later voegen we de eigen ontologie samen met een thesaurus waardoor een geïntegreerd informatielandschap zal ontstaan. De bron van de informatie uit de casus is de Rijksoverheid.

Benodigdheden

  • Een Windows of Unix-systeem
  • Het Ontopia framework (versie 5.2 of hoger)
  • Een teksteditor

Lijst van bestanden

De onderstaande bestanden zullen we in de tutorial stap voor stap ontwikkelen. Mocht je ergens niet helemaal uit komen dan kun je deze bestanden gebruiken als referentie. Houd er rekening mee dat aow.ctm gebruik maakt van thesaurus.ctm en je deze twee bestanden daarom bij elkaar in een map moet zetten om ze te kunnen gebruiken in de Omnigator.

Stappenplan

  1. Maak het bestand aow.ctm aan
  2. Start Ontopia Omnigator
  3. Maak je eerste topic aan
  4. Geef het topic een naam
  5. Geef het topic een type
  6. Maak een association
  7. Scope de naam van de association
  8. Merge de topic map met een thesaurus
  9. Voeg subject identifiers toe
  10. Gebruik prefixes
  11. [Bonus] Voeg het Topic name topic toe

Stap 1: Maak het bestand aow.ctm aan

Open je teksteditor en maak een nieuw bestand aan. Noem het bestand aow.ctm en sla het op in de map topicmaps van de Omnigator. Deze map is te vinden op het pad $ONTOPIA_HOME/topicmaps waarbij $ONTOPIA_HOME staat voor de hoofdmap van je Ontopia-distributie.

Stap 2: Start Ontopia Omnigator

Om de Omnigator webapplicatie te kunnen gebruiken moet eerst Ontopia worden opgestart. De opstartbestanden staan in de map $ONTOPIA_HOME/apache-tomcat/bin. In Windows dubbelklik je op het bestand startup.bat en in een Unix-systeem geef je het commando om startup.sh te starten. Zie voor meer hulp bij het starten ook de Ontopia installatie tutorial.

Surf met je browser naar http://localhost:8080/omnigator om de Omnigator te starten. In de lijst aan de linkerkant zie je nu de zojuist aangemaakte aow.ctm. Klik op je eigen topic map. De topic map wordt nu ingeladen, maar is natuurlijk nog helemaal leeg.

Stap 3: Maak je eerste topic aan

Ga terug naar het bestand dat je in de eerste stap hebt aangemaakt, aow.ctm. Voeg de volgende regel aan het bestand toe (vergeet de punt '.' op het eind niet) :

aow .

Sla het bestand op en ga weer terug naar de Omnigator in je browser. Klik op Reload rechtsboven in het scherm. Als je nu op Master Index aan de linkerkant klikt zie het overzicht van alle topics in de topic map. Dat is er nu één, namelijk een topic met de naam [No name].

We hebben weliswaar in het CTM-bestand "aow" getypt, maar daar zie je in de topic map niets van terug. Dat komt doordat "aow" zoals we dat hier gebruiken geen naam is van het topic, maar een identifier. Deze identifier kunnen we later in het CTM-bestand weer gebruiken om terug te verwijzen naar dit eerste topic. Klik ook maar eens op [No name]. Je krijgt nu een overzichtspagina van alle informatie die bekend is over het topic. Dat is nu nog helemaal niets, daarom gaan we in de volgende stap beginnen met informatie toevoegen.

Stap 4: Geef het topic een naam

Ga weer terug naar aow.ctm en breid de eerste regel als volgt uit:

aow - "Algemene ouderdomswet" .

Sla het bestand op, ga weer terug naar de Omnigator en herlaad de topic map. In de Master Index zie je weer het overzicht van alle topics in de topic map. Dat zijn er nu twee, namelijk een topic met de naam "Algemene ouderdomswet" en eentje die [No name] heet. Op die laatste komen we later terug. Klik op het topic van de AOW. Op de overzichtspagina zie je nu een namenlijst met daarin "Algemene ouderdomswet".

Een streepje gevolgd door een tekst tussen aanhalingstekens (een string) voegt dus een naam toe aan een topic. Een topic mag je zoveel namen geven als je wilt, probeer dit maar eens:

aow
  - "Algemene ouderdomswet" ;
  - "AOW" .

Voor de leesbaarheid worden hierboven meerdere regels gebruikt voor het topic. Dat mag, zolang je het topic maar aflsuit met een punt. Sla de tekst weer op, herlaad de topic map in de Omnigator en ga weer naar de Master Index. Er zijn nu nog steeds twee topics. Klik weer op het AOW topic. Nu zie je in de linkerlijst twee namen voor het topic; "Algemene ouderdomswet" en "AOW". De namen staan gegroepeerd onder de titel [No name]. Dit is dezelfde topic als die we hiervoor in de Master Index zagen. Dit is het standaardtype van een naam in Topic Maps. In de volgende stap gaan we het typesysteem verder verkennen.

Stap 5: Geef het topic een type

Ga weer terug naar aow.ctm en geef het topic een type:

aow isa wet ;
  - "Algemene ouderdomswet" ;
  - "AOW" .

Herlaad nu het AOW topic. Rechtsbovenin zie je nu het type: weer een [No name]. Het type heeft nog geen naam, omdat we in het het CTM-bestand verwijzen naar een topic met de identifier wet. Dit topic hebben we echter nog niet gedefinieerd en de topic map kan dus ook de naam nog niet kennen. Voeg de volgende tekst toe aan aow.ctm:

wet 
  - "Wet" .

Sla het bestand op en herlaad het AOW topic in de Omnigator. Je ziet nu bij topic types de juiste naam staan: "Wet". Klik op dit type. Je gaat nu naar de overzichtspagina van het topic wet. Je ziet dus dat een topic type ook zelf weer een topic is (waar je dus eventueel ook weer een type aan kun toekennen).

Stap 6: Maak een association

Eén van de grote krachten van Topic Maps is het kunnen leggen van associations tussen topics. We zullen in onze topic map een association leggen tussen de AOW en het ministerie van Sociale Zaken en Werkgelegenheid dat voor de uitvoering van de AOW verantwoordelijk is. Ga weer terug naar aow.ctm en maak eerst een topic aan voor het ministerie van SZW:

swz isa ministerie ; 
  - "Sociale Zaken en Werkgelegenheid" ; 
  - "SZW" . 
  
ministerie 
  - "Ministerie" . 

Nu hebben we de twee topics waartussen we een association willen leggen. Voeg de volgende tekst toe aan aow.ctm:

uitvoerder-van(uitvoerder : szw, wet : aow) 

Dit levert een aantal nieuwe elementen op in de topic map. Ga naar de Index Page in de Omnigator. De bovenste lijst is een overzicht van alle topic types, deze moeten je bekend voorkomen. De andere twee lijsten bevatten de association types en de role types. Deze zijn het gevolg van de bovenstaande regel. De association types en role types hebben nog geen naam, omdat we ze nog niet als topic met een naam hebben toegevoegd. Wet is een uitzondering omdat we al een wet topic gebruiken als topic type voor de AOW. Je ziet dus dat je topics op meerdere manieren in een topic map mag gebruiken. Geef ook de andere elementen een naam door het volgende aan de topic map toe te voegen:

uitvoerder-van - "Uitvoerder van" . 
  
uitvoerder - "Uitvoerder" . 

Na het herladen zijn nu alle types benoemd. Je ziet dat uitvoerder-van een association type is geworden. Uitvoerder en wet zijn de twee roltypen. In Topic Maps wordt een association altijd gelegd tussen rollen, en dus niet direct tussen topics. De reden hiervoor is dat rollen het mogelijk maken om de richting van de association te bepalen. In het bovenstaande voorbeeld weten we daardoor meteen dat het ministerie van SZW uitvoerder is van de AOW, en niet andersom (de AOW uitvoerder van SZW).

Stap 7: Scope de naam van de association

In de vorige stap hebben we een eerste association aangemaakt in de topic map. Op de Index Page van de Omnigator zien we onder "Association types" de naam van het type van de association die we hebben aangemaakt. Als je klikt op die naam "Uitvoerder van" krijg je de overzichtspagina van het association type. Hierin zie je ook een overzicht van de topics die een rol spelen in een association van dit type. Daar staan dus nu onze twee topics over de AOW en het ministerie van SZW. Klik op het topic over SZW. Je krijgt nu de overzichtspagina. In de lijst met associations zie je onder de kop "Uitvoerder van" het topic over de AOW genoemd staan.

Klik nu eens op het topic over de AOW. De overzichtspagina van de AOW heeft ook een lijst met associations. Hier staat het ministerie van SZW onder de kop "Uitvoerder van". Dat lijkt niet te kloppen, want de AOW is niet de uitvoerder van het ministerie van SZW! Wat er gebeurt is dat de Omnigator maar één naam van de association tussen AOW en SZW kent. Deze naam wordt dus steeds weergegeven. De richting van de association wordt nog steeds bepaald door de twee rollen (uitvoerder en wet), maar voor ons ziet het er een beetje vreemd uit. Je kunt daarom in Topic Maps namen een scope geven. Als je de naam van een association type scoopt onder een van de rollen die in de association voorkomen, dan wordt deze naam in het lijstje met associations gebruikt. Breidt het topic uitvoerder-van als volgt uit:

uitvoerder-van 
  - "Uitvoerder van" ; 
  - "uitvoerder van" @ uitvoerder ; 
  - "uitgevoerd door" @ wet . 

"Uitvoerder van" is nu de standaardnaam die bijvoorbeeld gebruikt wordt op de Index page om de naam van het association type weer te geven. Bij topics die de rol uitvoerder spelen wordt de naam "uitvoerder van" gebruikt en bij de topics die de rol wet spelen staat "uitgevoerd door". Als je in de Omnigator heen en weer klikt tussen AOW en SZW zie je het verschil. Het scopen van topic names maakt associations makkelijker leesbaar.

We kunnen het scopen van topic names ook toepassen wanneer we een bepaalde naam alleen in specifieke gevallen willen gebruiken. Dit is bijvoorbeeld het geval bij de Algemene ouderdomswet, waarbij we soms de naam voluit willen gebruiken en soms de afkorting AOW. Hetzelfde geldt voor het ministerie van Sociale Zaken en Werkgegenheid, waarvan we soms de afkorting SZW willen gebruiken. Voeg een nieuw topic toe voor het scopen van afkortingen en breidt de topics aow en szw uit:

afkorting - "Afkorting" . 
  
aow isa wet ; 
  - "Algemene ouderdomswet" ; 
  - "AOW" @ afkorting . 
  
swz isa ministerie ; 
  - "Sociale Zaken en Werkgelegenheid" ; 
  - "SZW" @ afkorting . 

Nu wordt voor beide topics standaard de volledige naam gebruikt, maar kunnen we voor specifieke gevallen aangeven dat we de afkorting willen gebruiken.

Stap 8: Merge de topic map met een thesaurus

Een merge is het samenvoegen van twee topic maps. Deze eigenschap van Topic Maps laat zien dat de standaard bedoeld is als een informatie-uitwisselingsformaat. Iedere denkbare topic map kan met een andere topic map samengevoegd worden. Dit maakt het mogelijk om datasets uit overlappende domeinen te combineren tot één naadloos geheel.

Om dit principe te laten zien zullen we de AOW topic map mergen met een thesaurus. De thesaurus bevat hierarchische informatie over de term AOW. Maak een nieuw bestand thesaurus.ctm aan in de map $ONTOPIA_HOME/topicmaps. Zet de volgende tekst in het bestand:

aow - "Algemene ouderdomswet" . 
  
ouderdomsverzekeringen - "Ouderdomsverzekeringen" . 
  
volksverzekeringen - "Volksverzekeringen" . 
  
sociale-verzekeringen - "Sociale verzekeringen" . 
  
sociale-zekerheid - "Sociale zekerheid" . 
  
sociaal-beleid - "Sociaal beleid" . 
  
at - "Algemenere term" . 
  
st - "Specifiekere term" . 
  
at-st 
  - "Algemenere term - Specifiekere term" ; 
  - "algemenere termen" @ at ; 
  - "specifiekere termen" @ st . 
  
at-st(at : ouderdomsverzekeringen, st : aow) 
  
at-st(at : volksverzekeringen, st : aow) 
  
at-st(at : sociale-verzekeringen, st : ouderdomsverzekeringen) 
  
at-st(at : sociale-verzekeringen, st : volksverzekeringen) 
  
at-st(at : sociale-zekerheid, st : sociale-verzekeringen) 
  
at-st(at : sociaal-beleid, st : sociale-zekerheid) 

Deze topic map geeft aan dat "Ouderdomsverzekeringen" en "Volksverzekeringen" algemenere termen zijn voor "Algemene ouderdomswet". "Sociale Verzekeringen" is een algemenere term voor "Ouderdomsverzekeringen" en "Volksverzekeringen", enzovoort. Om deze thesaurus topic map samen te voegen met de AOW topic map voeg je bovenaan in het bestand aow.ctm de volgende regel toe:

%mergemap <thesaurus.ctm> http://psi.topicmaps.org/iso13250/ctm 

Deze regel geeft aan dat de topic map in het bestand thesaurus.ctm (in dezelfde map als aow.ctm) gemerged moet worden met de AOW topic map. De URL op het einde van de regel geeft aan dat thesaurus.ctm ook in CTM syntax is geschreven.


Herlaad de AOW topic map in de Omnigator. Onder Ontology zie je nu onder andere dat het association type "Algemenere term - Specifiekere term" is overgenomen uit de thesaurus. Kijk nu onder Index of Individuals. Hier zie je nu naast ook de topics uit de thesaurus.

Maar er is nog iets mis. Het topic "Algemene ouderdomswet" komt twee keer voor in de lijst! De reden hiervoor is dat de AOW topics uit aow.ctm en thesaurus.ctm als aparte topics worden behandeld. Om aan te geven dat deze twee topics over hetzelfde gaan moeten we ze identificeren. Dit komt in de volgende stap aan bod.

Stap 9: Voeg subject identifiers toe

De item identifiers die in stap 3 zijn geïntroduceerd indentificeren een topic alleen binnen het CTM-bestand. Binnen Topic Maps kan permanente identificatie worden bereikt met subject identifiers. Een subject identifier heeft de vorm van een URL. Wanneer twee topic een zelfde subject identifier hebben schrijft de Topic Maps-standaard voor dat deze twee topics over hetzelfde subject gaan en dus moeten worden samengevoegd tot één topic. Alle eigenschappen van de twee afzonderlijke topics worden dan overgenomen in het nieuwe topic.

Om dit principe te laten zien voegen we in aow.ctm en thesaurus.ctm een subject identifier toe aan het AOW topic. Pas het topic aow in aow.ctm als volgt aan:

aow isa wet ; 
  - "Algemene ouderdomswet" ; 
  - "AOW" @ afkorting ; 
  http://www.rijksoverheid.nl/aow . 

Voeg dezelfde subject identifier toe aan het aow topic in thesaurus.ctm:

aow - "Algemene ouderdomswet" ; 
  http://www.rijksoverheid.nl/aow . 

Herlaad nu de topic map in de Omnigator en in de Index of Individuals zie je nu nog maar één keer "Algemene ouderdomswet" staan. Klik op dit topic. Je ziet nu de samengevoegde informatie uit de AOW en thesaurus topic maps. Op deze manier zijn twee kennisdomeinen die eerst gescheiden waren met elkaar geïntegreerd. De link tussen de twee domeinen is het topic aow, vandaaruit kunnen we zowel de termhierarchie bekijken als het verantwoordelijk ministerie.

Stap 10: Gebruik prefixes

Het verschil tussen identifiers en subject identifiers is subtiel, maar zeer belangrijk. Een identifier maakt het mogelijk om binnen een CTM-bestand te verwijzen naar andere topics. Een subject identifier voegt een eigenschap aan een topic toe, namelijk diens identificatie in de topic map. Overigens kan in een CTM-bestand een identifier altijd vervangen worden door een subject identifier. We kunnen het topic over de AOW dus ook als volgt definiëren:

http://www.rijksoverheid.nl/aow isa wet ; 
  - "Algemene ouderdomswet" ; 
  - "AOW" @ afkorting . 

In dit voorbeeld is de identifier aow vervangen door de subject identifier http://www.rijksoverheid.nl/aow. Het voordeel hiervan is dat we niet nog eens apart een subject identifier hoeven toe te voegen om ook in de topic map het topic te kunnen identificeren. Een gevolg is we dat we nu in de rest van het CTM-bestand met de subject identifier naar het AOW topic moeten verwijzen. De uitvoerder-van association wordt daardoor bijvoorbeeld:

uitvoerder-van(uitvoerder : szw, wet : http://www.rijksoverheid.nl/aow) 

Dit is niet bevorderlijk voor de leesbaarheid van het CTM-bestand. Om het gebruik van subject identifiers overzichtelijker te maken kun je gebruik maken van prefixes. Een prefix representeert een vooraf gedefinieerde URL waarachter je nog een toevoeging kunt doen. De toevoeging wordt van de prefix gescheiden met een dubbele punt. Zet bovenaan in het bestand aow.ctm de volgende regel:

%prefix rijk http://www.rijksoverheid.nl/ 

Nu kunnen we in het vervolg van het CTM-bestand de prefix rijk gebruiken, welke dan automatische vertaald wordt naar http://www.rijksoverheid.nl/. Het AOW topic kunnen we dan als volgt definiëren:

rijk:aow isa wet ; 
  - "Algemene ouderdomswet" ; 
  - "AOW" @ afkorting . 

En het verwijzen naar dit topic in de uitvoerder-van association gaat nu als volgt:

uitvoerder-van(uitvoerder : szw, wet : rijk:aow) 

Merk op dat na het herladen in de Omnigator de topic map niet veranderd is. Het AOW topic uit aow.ctm wordt nog steeds gemerged met het AOW topic uit thesaurus.ctm. Dit komt omdat ze nog steeds dezelfde subject identifier hebben, ook al wordt die bij beide op een andere manier gedefinieerd.

Stap 11: [Bonus] Voeg het Topic name topic toe

Op de pagina Index of Individuals staat nu nog één onbenoemd topic. Dit topic is ontstaan in stap 4 toen we het topic aow de naam "Algemene ouderdomswet" hebben gegeven. In de Topic Maps-standaard hebben namen van topics een type. Het type van een naam is weer een topic. Standaard is het type van iedere topic naam een topic met de subject identifier http://psi.topicmaps.org/iso13250/model/topic-name. Als je op de laatste No name uit de Index of Individuals klikt zul je deze subject identifier ook zien.

Het standaard topic voor het type van een topic naam is echter nog niet benoemd. Ook dit kun je in het CTM-bestand doen, door het topic met behulp van diens subject identifier een naam te geven. Bijvoorbeeld:

http://psi.topicmaps.org/iso13250/model/topic-name - "Topic name" . 

Je kunt natuurlijk ook een prefix aanmaken voor standaard Topic Maps topics (er zijn er nog een aantal, maar die zijn in deze tutorial niet aan bod gekomen) :

%prefix topicmaps http://psi.topicmaps.org/iso13250/model/ 
  
topicmaps:topic-name - "Topic name" . 

Na het herladen in de Omnigator zul je zien dat nu ook de laatste [No name] uit je topic map is weggewerkt. Je kunt eventueel ook een ander topic als type van een topic name opgeven. Dat gaat als volgt:

thesaurusterm - "Thesaurusterm" . 
  
aow isa wet ; 
  - thesaurusterm : "Algemene ouderdomswet" ; 
  - "AOW" @ afkorting . 

Nu is de topic name "Algemene ouderdomswet" van het AOW topic niet langer getypeerd als "Topic name", maar als een "Thesaurusterm". De topic name "AOW" is nog wel steeds getypeerd als "Topic name" en is bovendien gescoopt onder het topic "Afkorting". Het verschil tussen een type en scope is dat het type gebruikt wordt om soorten topic names te categoriseren en scope gebruikt wordt om te bepalen in welke context welke naam het meest geschikt is.