ontopia tutorial

205
1 Ontopia Tutorial TMRA 2010-09-29 Lars Marius Garshol & Geir Ove Grønmo

Upload: lars-marius-garshol

Post on 15-Jan-2015

5.750 views

Category:

Technology


0 download

DESCRIPTION

A full-day tutorial covering all modules in the Ontopia Topic Maps engine.

TRANSCRIPT

Page 1: Ontopia tutorial

1

Ontopia Tutorial

TMRA 2010-09-29Lars Marius Garshol & Geir Ove Grønmo

Page 2: Ontopia tutorial

2

Agenda

• About you– who are you?

• About Ontopia• The product• The future• Participating in the project

Page 3: Ontopia tutorial

3

Some background

About Ontopia

Page 4: Ontopia tutorial

4

Brief history

• 1999-2000– private hobby project for Geir Ove

• 2000-2009– commercial software sold by Ontopia AS– lots of international customers in diverse

fields

• 2009-– open source project

Page 5: Ontopia tutorial

5

The project

• Open source hosted at Google Code• Contributors

– Lars Marius Garshol, Bouvet– Geir Ove Grønmo, Bouvet– Thomas Neidhart, SpaceApps– Lars Heuer, Semagia– Hannes Niederhausen, TMLab– Stig Lau, Bouvet– Baard H. Rehn-Johansen, Bouvet– Peter-Paul Kruijssen, Morpheus– Quintin Siebers, Morpheus– Matthias Fischer, HTW Berlin

Page 6: Ontopia tutorial

6

Recent work

• Ontopia/Liferay integration– Matthias Fischer & LMG

• Various fixes and optimizations– everyone

• Tropics (RESTful web service interface)– SpaceApps

• Porting build system to Maven2– Morpheus

Page 7: Ontopia tutorial

7

Architecture and modules

Product overview

Page 8: Ontopia tutorial

8

The big picture

Engine

Ontopoly

Portlet support

CMSintegration

Data integration

OKP

Escenic

A.N.other

A.N.other

OtherCMSs

DB2TM

TMSync

A.N.other

A.N.other

Auto-class.

Taxon.import

Webservice

Page 9: Ontopia tutorial

9

The engine

• Core API• TMAPI 2.0 support• Import/export• RDF conversion• TMSync• Fulltext search• Event API• tolog query

language• tolog update

language

Engine

Page 10: Ontopia tutorial

10

The backends

• In-memory– no persistent storage– thread-safe– no setup

• RDBMS– transactions– persistent– thread-safe– uses caching– clustering

• Remote– uses web service– read-only– unofficial

Engine

Memory RDBMS Remote

Page 11: Ontopia tutorial

11

DB2TM

• Upconversion to TMs– from RDBMS via

JDBC– or from CSV

• Uses XML mapping– can call out to Java

• Supports sync– either full rescan– or change table

Engine

Memory RDBMS Remote

DB2TM TMRAP Nav Classify

Page 12: Ontopia tutorial

12

TMRAP

• Web service interface– via SOAP– via plain HTTP

• Requests– get-topic– get-topic-page– get-tolog– delete-topic– ...

Engine

Memory RDBMS Remote

DB2TM TMRAP Nav Classify

Page 13: Ontopia tutorial

13

Navigator framework

• Servlet-based API– manage topic maps– load/scan/delete/

create

• JSP tag library– XSLT-like– based on tolog– JSTL integration

Engine

Memory RDBMS Remote

DB2TM TMRAP Nav Classify

Page 14: Ontopia tutorial

14

Automated classification

• Undocumented– experimental

• Extracts text– autodetects format– Word, PDF, XML, HTML

• Processes text– detects language– stemming, stop-words

• Extracts keywords– ranked by importance– uses existing topics– supports compound

terms

Engine

Memory RDBMS Remote

DB2TM TMRAP Nav Classify

Page 15: Ontopia tutorial

15

Vizigator

• Graphical visualization

• VizDesktop– Swing app to

configure– filter/style/...

• Vizlet– Java applet for web– uses configuration– loads via TMRAP– uses “Remote”

backend

Engine

Memory RDBMS Remote

DB2TM TMRAP Nav Classify

Viz Ontopoly

Page 16: Ontopia tutorial

16

Ontopoly

• Generic editor– web-based, AJAX– meta-ontology in TM

• Ontology designer– create types and

fields– control user interface– build views– incremental dev

• Instance editor– guided by ontology

Engine

Memory RDBMS Remote

DB2TM TMRAP Nav Classify

Viz Ontopoly

Page 17: Ontopia tutorial

17

Typical deployment

Application server

EngineDB

Backend

DB

DB

DB2TM

Framew

orks

UsersViewingapplication

Editors

Ontopoly

HTTP

TMRAP

External application

Page 18: Ontopia tutorial

18

APIs

The engine

Page 19: Ontopia tutorial

19

Core APIs

• net.ontopia.topicmaps.core.*• Fairly direct mapping from TMDM

– TopicIF– AssociationIF– TopicMapIF– ...

• Set/get methods reflect TMDM properties

Page 20: Ontopia tutorial

20

TopicIF

• Interface, not a class– getTopicNames()– addTopicName(TopicNameIF)– removeTopicName(TopicNameIF)– getOccurrences() + add + remove– getSubjectIdentifiers() + add + remove– getItemIdentifiers() + add + remove– getSubjectLocators() + add + remove– getRoles()– getRolesByType(TopicIF)

Page 21: Ontopia tutorial

21

Core interfaces

TopicMapStoreIF TopicMapIF

TopicIF AssociationIF

TopicNameIF OccurrenceIF AssociationRoleIF

VariantNameIF

Page 22: Ontopia tutorial

22

How to get a TopicMapIF

• Create one directly– new

net...impl.basic.InMemoryTopicMapStore()

• Load one from file– using an importer (next slide)

• Connect to an RDBMS– covered later

• Use a topic map repository– covered later

Page 23: Ontopia tutorial

23

TopicMapReaderIF

import net.ontopia.topicmaps.core.TopicMapIF;import net.ontopia.topicmaps.core.TopicMapReaderIF;import net.ontopia.topicmaps.utils.ImportExportUtils;

public class TopicCounter {

public static void main(String[] argv) throws Exception { TopicMapReaderIF reader = ImportExportUtils.getReader(argv[0]); TopicMapIF tm = reader.read(); System.out.println("TM contains " + tm.getTopics().size()

+ " topics"); } }

[larsga@c716c5ac1 tmp]$ java TopicCounter ~/data/bilder/privat/metadata.xtmTM contains 17035 topics[larsga@c716c5ac1 tmp]$

Page 24: Ontopia tutorial

24

Supported syntaxes

Syntax Export Import

XTM 1.0 Y Y

XTM 2.0 Y Y

XTM 2.1 Y Y

CXTM Y

LTM 1.3 Y Y

CTM Y

TM/XML Y Y

JTM 1.0 Y Y

RDF Y Y

Page 25: Ontopia tutorial

25

The utility classes

• A set of classes outside the core interfaces that perform common tasks– a number of these utilities are obsolete now that tolog is here

• They are all built on top of the core interfaces• Some important utilities

– ImportExportUtils creates readers and writers

– MergeUtilsmerges topics and topic maps– PSI contains important PSIs– DeletionUtils cascading delete of

topics– DuplicateSuppressionUtils removes duplicates– TopicStringifiers find names for topics

Page 26: Ontopia tutorial

26

Topic Maps repository

• Uses a set of topic maps sources to build a set of topics maps– topic maps can be looked up by ID

• Many kinds of sources– scan directory for files matching pattern– download from URL– connect to RDBMS– ...

• Configurable using an XML file– tm-sources.xml

• Used by Navigator Framework

Page 27: Ontopia tutorial

27

Event API

• Allows clients to receive notification of changes

• Must implement TopicMapListenerIF static class TestListener extends AbstractTopicMapListener {

public void objectAdded(TMObjectIF snapshot) { System.out.println("Topic added: " + snapshot.getObjectId()); }

public void objectModified(TMObjectIF snapshot) { System.out.println("Topic modified: " + snapshot.getObjectId()); }

public void objectRemoved(TMObjectIF snapshot) { System.out.println("Topic removed: " + snapshot.getObjectId()); } }

Page 28: Ontopia tutorial

28

Using the API // register to listen for events TestListener listener = new TestListener(); TopicMapEvents.addTopicListener(ref, listener);

// get the store through the reference so the listener is registered ref.createStore(false);

// let's add a topic System.out.println("Off we go"); TopicMapBuilderIF builder = tm.getBuilder(); TopicIF newbie = builder.makeTopic(tm); System.out.println("Let's name this topic"); builder.makeTopicName(newbie, "Newbie topic");

// then let's remove it System.out.println("And now, the exit"); DeletionUtils.remove(newbie); System.out.println("Goodbye, short-lived topic");

[larsga@dhcp-98 tmp]$ java EventTest bkclean.xtm Off we goTopic added: 3409Let's name this topicTopic modified: 3409Topic modified: 3409And now, the exitTopic removed: 3409Goodbye, short-lived topic

Page 29: Ontopia tutorial

29

For more information

• See the Engine Developer's Guide– http://www.ontopia.net/doc/current/doc/

engine/devguide.html

Page 30: Ontopia tutorial

30

Persistence & transactions

RDBMS backend

Page 31: Ontopia tutorial

31

RDBMS backend

• Stores Topic Maps in an RDBMS– generic schema– access via JDBC

• Provides full ACID– transactions– concurrency– ...

• Supports several databases– Oracle, MySQL, PostgreSQL, MS SQL Server,

hsql

• Clustering support

Page 32: Ontopia tutorial

32

Core API implementation

• Implements same API as in-memory impl– theoretically, a switch requires only config

change

• Lazy loading of objects– objects loaded from DB as needed

• Considerable internal caching– for performance reasons

• Separate objects for separate transactions– in order to provide isolation

• Shared cache between transactions

Page 33: Ontopia tutorial

33

Configuration

• A Java property file• Specifies

– database type– JDBC URL– username + password– cache settings– clustering settings– ...

Page 34: Ontopia tutorial

34

jdbcspy

• A built-in SQL profiler• Useful for identifying cause of

performance issues

Page 35: Ontopia tutorial

35

tolog

The Query Engine

Page 36: Ontopia tutorial

36

tolog

• A logic-based query language– a mix of Prolog and SQL– effectively equivalent to Datalog

• Two parts– queries (data retrieval)– updates (data modification)

• Developed by Ontopia– not an ISO standard– eventually to be replaced by TMQL

Page 37: Ontopia tutorial

37

tolog

• The recommended way to interact with the data– API programming is slow and cumbersome– tolog queries perform better

• Available via– Java API– Web service API– Forms interface in Omnigator

• tolog queries return API objects

Page 38: Ontopia tutorial

38

Finding all operas by a composer

Collection operas = new ArrayList(); TopicIF composer = getTopicById("puccini"); TopicIF composed_by = getTopicById("composed-by"); TopicIF work = getTopicById("work"); TopicIF creator = getTopicById("composer");

for (AssociationRoleIF role1 : composer.getRolesByType(creator)) { AssociationIF assoc = role1.getAssociation(); if (assoc.getType() != composed_by) continue;

for (AssociationRoleIF role2 : assoc.getRoles()) { if (role2.getType() != work) continue;

operas.add(role2.getPlayer()); } }

Page 39: Ontopia tutorial

39

Finding all operas by a composer

• composed-by(puccini : composer, $O : work)?

• composed-by($C : composer, tosca : work)?

• composed-by($C : composer, $O : work)?• composed-by(puccini : composer,

tosca : work)?

Page 40: Ontopia tutorial

40

Features

• Access all aspects of a topic map• Generic queries independent of ontology• AND, OR, NOT, OPTIONAL• Count• Sort• LIMIT/OFFSET• Reusable inference rules

Page 41: Ontopia tutorial

41

Chaining predicates (AND)

• Predicates can be chained– born-in($PERSON : person, $PLACE : place),

located-in($PLACE : containee, italy : container)?

• The comma between the predicates means AND• This query finds all the people born in Italy

– It first builds a two-column table of all born-in associations– Then, those rows where the place is not located-in Italy are

removed– (Note that when the PLACE variable is reused above that means

that the birthplace and the location must be the same topic in each match)

• Any number of predicates can be chained• Their order is insignificant

– Actually, the optimizer reorders the predicates– It will start with located-in because it has a topic constant

Page 42: Ontopia tutorial

42

Thinking in predicates

• Most of you are probably used to functions, which work like this:– function(arg1, arg2, arg3) → result

• Predicates, however, are in a sense bidirectional, because of the way the pattern matching works– predicate(topic : role1, $VAR : role2)

– predicate($VAR : role1, topic : role2)

• The order of the roles are, on the other hand, insignificant– predicate(topic : role1, $VAR : role2)

– predicate($VAR : role2, topic : role1)

Page 43: Ontopia tutorial

43

Projection

• Sometimes queries make use of temporary variables that we are not really interested in

• The way to get rid of unwanted variables is projection

• Syntax:select $variable1, $variable2, ... from <query>?

• The query is first run, then projected down to the requested variables

Page 44: Ontopia tutorial

44

The instance-of predicate

• instance-of has the following form:– instance-of ( instance, class )– NOTE: the order of the arguments is significant

• Like players, instance and class may be specified in two ways:– using a variable ($name)– using a topic reference– e.g. instance-of ( $A, city )

• instance-of makes use of the superclass-subclass associations in the topic map– this means that composers will be considered

musicians, and musicians will be considered persons

Page 45: Ontopia tutorial

45

Cities with the most premieres

using o for i"http://psi.ontopedia.net/"

select $CITY, count($OPERA) from instance-of($CITY, o:City), { o:premiere($OPERA : o:Work, $CITY : o:Place) | o:premiere($OPERA : o:Work, $THEATRE : o:Place), o:located_in($THEATRE : o:Containee, $CITY : o:Container) } order by $OPERA desc?

Page 46: Ontopia tutorial

46

All non-hidden photos

select $PHOTO from instance-of($PHOTO, op:Photo) not(ph:hide($PHOTO : ph:hidden)), not(ph:taken-at($PHOTO : op:Image, $PLACE : op:Place), ph:hide($PLACE : ph:hidden)), not(ph:taken-during($PHOTO : op:Image, $EVENT : op:Event), ph:hide($EVENT : ph:hidden)), not(ph:depicted-in($PHOTO : ph:depiction, $PERSON : ph:depicted), ph:hide($PERSON : ph:hidden))?

Page 47: Ontopia tutorial

47

Demo

• Show running queries in Omnigator• Also show query tracing

– Shakespeare– /* #OPTION: optimizer.reorder = false */

Page 48: Ontopia tutorial

48

tologspy

• tolog query profiler– shares code with jdbcspy

Page 49: Ontopia tutorial

49

Using the query engine API

The query engine API is really simple to use1.get a QueryProcessorIF object2.run a query in the QueryProcessorIF and get a

QueryResultIF3.loop over the results and use them4.close the result object5.go back to step 2, or do something else

There are two different QueryProcessorIF implementations

the API lets you write code without worrying about that, however

the two implementations behave identically

Page 50: Ontopia tutorial

50

Running a query with the API

TopicMapIF tm = ...;QueryProcessorIF processor =

QueryUtils.getQueryProcessor(tm);QueryResultIF result = processor.execute(“instance-of($P,

person)?”);try { while (result.next()) { TopicIF person = (TopicIF) result.getValue(0); // do something useful with 'person' } } finally { result.close();}

Page 51: Ontopia tutorial

51

Advanced options

It is possible to parse a query once, and then run it many times the processor returns a ParsedQueryIF

object, which can be executed parameters can be passed to the query on

each execution It is possible to make declarations

and use them across executions

Page 52: Ontopia tutorial

52

Using a parsed query

ParsedQueryIF parsedQuery = processor.parse(“instance-of($P, %TYPE%)?”);

Map params = Collections.singletonMap(“TYPE”, person);QueryResultIF result = parsedQuery.execute(params);try { while (result.next()) { // ... } } finally { result.close();}

Page 53: Ontopia tutorial

53

QueryWrapper

• Designed to make all of this easier• QueryWrapper qw = new

QueryWrapper(tm);• TopicIF topic = qw.queryForTopic(...);• List topics = qw.queryForList(...);• List<Person> people =

– qw.queryForList(..., mapper);

Page 54: Ontopia tutorial

54

tolog updates

• Greatly simplifies TM modification• Also means you can do modification

without API programming– useful with RDBMS topic maps– useful with TMs in running web servers

• By performing a sequence of updates, just about any change can be made

• Potentially allows much more powerful architecture

Page 55: Ontopia tutorial

55

DELETE

• Static form– delete lmg

• Dynamic form– delete $person from instance-of($person,

person)

• Delete a value– delete subject-identifier(topic,

“http://ex.org/tst”)

Page 56: Ontopia tutorial

56

MERGE

• Static form– MERGE topic1, topic2

• Dynamic form– MERGE $p1, $p2 FROM

instance-of($p1, person),instance-of($p2, person),

– email($p1, $email),

– email($p2, $email)

Page 57: Ontopia tutorial

57

INSERT

• Static formINSERT lmg isa person; - “Lars Marius Garshol”

.

• Dynamic formINSERT

tmcl:belongs-to-schema(tmcl:container : theschema, tmcl:containee: $c) FROM instance-of($c, tmcl:constraint)

Page 58: Ontopia tutorial

58

INSERT again

INSERT ?y $psi . event-in-year(event: $e, year: ?y)FROM

start-date($e, $date),str:substring($y, $date, 4),str:concat($psi, "http://psi.semagia.com/iso8601", $y)

Page 59: Ontopia tutorial

59

UPDATE

• Static form– UPDATE value(@3421, “New name”)

• Dynamic form– UPDATE value($TN, “Ontopia”)

FROM topic-name(oks, $TN)

Page 60: Ontopia tutorial

60

More information

• Look at sample queries in Omnigator• tolog tutorial

– http://www.ontopia.net/doc/current/doc/query/tutorial.html

• tolog built-in predicate reference– http://www.ontopia.net/doc/current/doc/

query/predicate-reference.html

Page 61: Ontopia tutorial

61

Conversion from RDBMS data

DB2TM

Page 62: Ontopia tutorial

62

DB2TM

• Upconversion of relational data– either from CSV files or– over JDBC

• Based on an XML file describing the mapping– very highly configurable

• Support for– all of Topic Maps (except variants)– value transformations– synchronization

Page 63: Ontopia tutorial

63

Standard use case

• Pull in data from external source– turn it into Topic Maps following some

ontology

• Enrich it– usually manually, but not necessarily

• Resync from source at intervals

Page 64: Ontopia tutorial

64

DB2TM example

ID Name Website

1 Ontopia http://www.ontopia.net

2 United Nations http://www.un.org

3 Bouvet http://www.bouvet.no

<relation name="organizations.csv" columns="id name url"> <topic type="ex:organization">

<item-identifier>#org${id}</item-identifier>

<topic-name>${name}</topic-name>

<occurrence type="ex:homepage">${url}</occurrence>

</topic></relation>

+ =

Ontopia

United Nations

Bouvet

Page 65: Ontopia tutorial

65

Creating associations

<relation name="people.csv" columns="id given family employer phone"> <topic id="employer"> <item-identifier>#org${employer}</item-identifier> </topic> <topic type="ex:person"> <item-identifier>#person${id}</item-identifier> <topic-name>${given} ${family}</topic-name> <occurrence type="ex:phone">${phone}</occurrence> <player atype="ex:employed-by" rtype="ex:employee"> <other rtype="ex:employer" player="#employer"/> </player> </topic> </relation>

Page 66: Ontopia tutorial

66

Value transformations

<relation name="SCHEMATA" columns="SCHEMA_NAME"> <function-column name='SCHEMA_ID' method='net.ontopia.topicmaps.db2tm.Functions.makePSI'> <param>${SCHEMA_NAME}</param> </function-column> <topic type="mysql:schema"> <item-identifier>#${SCHEMA_ID}</item-identifier> <topic-name>${SCHEMA_NAME}</topic-name> </topic> </relation>

Page 67: Ontopia tutorial

67

Running DB2TM

• java net.ontopia.topicmaps.db2tm.Execute– command-line tool– also works with RDBMS topic maps

• net.ontopia.topicmaps.db2tm.DB2TM– API class to run transformations– methods "add" and "sync"

Page 68: Ontopia tutorial

68

More information

• DB2TM User's Guide– http://www.ontopia.net/doc/current/doc/

db2tm/user-guide.html

Page 69: Ontopia tutorial

69

Synchronizing with other sources

TMSync

Page 70: Ontopia tutorial

70

TMSync

• Configurable module for synchronizing one TM against another– define subset of source TM to sync (using

tolog)– define subset of target TM to sync (using

tolog)– the module handles the rest

• Can also be used with non-TM sources– create a non-updating conversion from the

source to some TM format– then use TMSync to sync against the

converted TM instead of directly against the source

Page 71: Ontopia tutorial

71

How TMSync works

• Define which part of the target topic map you want,• Define which part of the source topic map it is the

master for, and• The algorithm does the rest

Page 72: Ontopia tutorial

72

If the source is not a topic map

• Simply do a normal one-time conversion– let TMSync do the update for you

• In other words, TMSync reduces the update problem to a conversion problem

source.xmlconvert.xslt TMSync

Page 73: Ontopia tutorial

73

The City of Bergen usecase

LOS

Service

Unit Person

City of Bergen

LOS

Norge.no

Page 74: Ontopia tutorial

74

Web service interface

TMRAP

Page 75: Ontopia tutorial

75

TMRAP basics

• Abstract interface– that is, independent of any particular technology– coarse-grained operations, to reduce network

traffic

• Protocol bindings exist– plain HTTP binding– SOAP binding

• Supports many syntaxes– XTM 1.0– LTM– TM/XML– custom tolog result-set syntax

Page 76: Ontopia tutorial

76

get-topic

• Retrieves a single topic from the remote server– topic map may optionally be specified– syntax likewise

• Main use– to build client-side fragments into a bigger

topic map– to present information about a topic on a

different server

Page 77: Ontopia tutorial

77

get-topic

• Parameters– identifier: a set of URIs (subject identifiers of wanted topic)– subject: a set of URIs (subject locators of wanted topic)– item: a set of URIs (item identifiers of wanted topic)– topicmap: identifier for topic map being queried– syntax: string identifying desired Topic Maps syntax in response– view: string identifying TM-Views view used to define fragment

• Response– topic map fragment representing topic in requested syntax– default is XTM fragment with all URI identifiers, names,

occurrences, and associations– in default view types and scopes on these constructs are only

identified by one <*Ref xlink:href=“...”/> XTM element– the same goes for associated topics

Page 78: Ontopia tutorial

78

get-topic-page

• Returns link information about a topic– that is, where does the server present this

topic– mainly useful for realizing the portal

integration scenario– result information contains metadata about

server setup

Page 79: Ontopia tutorial

79

get-topic-page

• Parameters– identifier: a set of URIs (subject identifiers of wanted topic)– subject: a set of URIs (subject locators of wanted topic)– item: a set of URIs (item identifiers of wanted topic)– topicmap: identifier for topic map being queried– syntax: string identifying desired Topic Maps syntax in response

• Response is a topic map fragment[oks : tmrap:server = "OKS Samplers local installation"][opera : tmrap:topicmap = "The Italian Opera Topic Map"] {opera, tmrap:handle, [[opera.xtm]]}tmrap:contained-in(oks : tmrap:container, opera : tmrap:containee)tmrap:contained-in(opera : tmrap:container, view : tmrap:containee)tmrap:contained-in(opera : tmrap:container, edit : tmrap:containee)[view : tmrap:view-page

%"http://localhost:8080/omnigator/models/..."][edit : tmrap:edit-page %"http://localhost:8080/ontopoly/enter.ted?..."][russia = "Russia”

@"http://www.topicmaps.org/xtm/1.0/country.xtm#RU"]

Page 80: Ontopia tutorial

80

get-tolog

• Returns query results– main use is to extract larger chunks of the

topic map to the client for presentation– more flexible than get-topic– can achieve more with less network traffic

Page 81: Ontopia tutorial

81

get-tolog

• Parameters– tolog: tolog query– topicmap: identifier for topic map being queried– syntax: string identifying desired syntax of response– view: string identifying TM-Views view used to

define fragment

• Response– if syntax is “tolog”

• an XML representation of the query result• useful if order of results matter

– otherwise, a topic map fragment containing multiple topics is returned

• as for get-topic

Page 82: Ontopia tutorial

82

add-fragment

• Adds information to topic map on the server– does this by merging in a fragment

• Parameters– fragment: topic map fragment– topicmap: identifier for topic map being

added to– syntax: string identifying syntax of request

fragment

• Result– fragment imported into named topic map

Page 83: Ontopia tutorial

83

update-topic

• Can be used to update a topic– add-fragment only adds information– update sets the topic to exactly the uploaded information

• Parameters– topicmap: the topic map to update– fragment: fragment containing the new topic– syntax: syntax of the uploaded fragment– identifier: a set of URIs (subject identifiers of wanted

topic)– subject: a set of URIs (subject locators of wanted topic)– item: a set of URIs (item identifiers of wanted topic)

• Update happens using TMSync

Page 84: Ontopia tutorial

84

delete-topic

• Removes a topic from the server• Parameters

– identifier: a set of URIs (subject identifiers of wanted topic)

– subject: a set of URIs (subject locators of wanted topic)

– item: a set of URIs (item identifiers of wanted topic)

– topicmap: identifier for topic map being queried

• Result – deletes the identified topic

• includes all names, occurrences, and associations

Page 85: Ontopia tutorial

85

tolog-update

• Runs a tolog update statement• Parameters

– topicmap: topic map to update– statement: tolog statement to run

• Runs the statement & commits the change

Page 86: Ontopia tutorial

86

HTTP binding basics

• The mapping requires a base URL– e.g http://localhost:8080/tmrap/

• This is used to send requests– http://localhost:8080/tmrap/method?

param1=value1&...– GET is used for requests that do not cause

state changes– POST for requests that do

• Responses returned in response body

Page 87: Ontopia tutorial

87

Exercise #1: Retrieve a topic

• Use the get-topic request to retrieve a topic from the server– base URL is http://localhost:8080/tmrap/– find the identifying URI in Omnigator– just print the retrieved fragment to get a look at it

• Note: you must escape the “#” character in URIs– otherwise it is interpreted as the anchor and not

transmitted at all– escape sequence: %23

• Note: you must specify the topic map ID– otherwise results will only be returned from loaded topic

maps– in other words: if the topic map isn’t loaded, you get no

results

Page 88: Ontopia tutorial

88

Solution #1 (in Python)

import urllib

BASE = "http://localhost:8080/tmrap/tmrap/"psi = "http://www.topicmaps.org/xtm/1.0/country.xtm%23RU"

inf = urllib.urlopen(BASE + "get-topic?identifier=" + psi)print inf.read()inf.close()

Page 89: Ontopia tutorial

89

Solution #1 (response)

<topicMap xmlns="http://www.topicmaps.org/xtm/1.0/"

xmlns:xlink="http://www.w3.org/1999/xlink">

<topic id="id458">

<instanceOf>

<subjectIndicatorRef xlink:href="http://psi.ontopia.net/geography/#country"/>

</instanceOf>

<subjectIdentity>

<subjectIndicatorRef xlink:href="http://www.topicmaps.org/xtm/1.0/country.xtm#RU"/>

<topicRef xlink:href="file:/.../WEB-INF/topicmaps/geography.xtmm#russia"/>

</subjectIdentity>

<baseName>

<baseNameString>Russia</baseNameString>

</baseName>

</topic>

Page 90: Ontopia tutorial

90

Processing XTM with XSLT

• This is possible, but unpleasant– the main problem is that the XML is phrased in terms

of Topic Maps, not in domain terms– this means that all the XPath will talk about “topic”,

“association”, ... and not “person”, “works-for” etc

• The structure is also complicated– this makes queries complicated– for example, the XPath to traverse an association looks

like this://xtm:association [xtm:member[xtm:roleSpec / xtm:topicRef / @xlink:href =

'#employer'] [xtm:topicRef / @xlink:href = concat('#', $company)]] [xtm:instanceOf / xtm:topicRef / @xlink:href = '#employed-by']

Page 91: Ontopia tutorial

91

TM/XML

• Non-standard XML syntax for Topic Maps– defined by Ontopia (presented at TMRA’05)– implemented in the OKS

• XSLT-friendly– much easier to process with XSLT than XTM– can be understood by developers who do not

understand Topic Maps– dynamic domain-specific syntaxes instead of

generic syntax– predictable (can generate XML Schema from

TM ontology)

Page 92: Ontopia tutorial

92

TM/XML example<topicmap ... reifier="tmtopic"> <topicmap id="tmtopic"> <iso:topic-name><tm:value>TM/XML example</tm:value> </iso:topic-name> <dc:description>An example of the use of TM/XML.</dc:description> </topicmap>

<person id="lmg"> <iso:topic-name><tm:value>Lars Marius Garshol</tm:value> <tm:variant scope="core:sort">garshol, lars marius</tm:variant> </iso:topic-name> <homepage datatype="http://www.w3.org/2001/XMLSchema#anyURI" >http://www.garshol.priv.no</homepage> <created-by role="creator" topicref="tmtopic" otherrole="work"/> <presentation role="presenter"> <presented topicref="tmxml"/> <event topicref="tmra05"/> </presentation> </person></topicmap>

Page 93: Ontopia tutorial

93

tmphoto

• A topic map to organize my personal photos– contains ~15,000 photos

• A web gallery runs on Ontopia– on www.garshol.priv.no

PhotoPerson

Event

Category

Location

http://www.garshol.priv.no/tmphoto/

Page 94: Ontopia tutorial

94

tmtools

• An index of Topic Maps tools– organized as shown on the

right

• Again, web application for browsing– screenshots below

Softwareproduct

Person

Organization

Platform

Category

Technology

http://www.garshol.priv.no/tmtools/

Page 95: Ontopia tutorial

95

The person page

Boring! No content.

Page 96: Ontopia tutorial

96

And in tmphoto...

Page 97: Ontopia tutorial

97

get-illustration

• A web service in tmphoto– receives the PSI of a person– then automatically picks a suitable photo of that

person

• Based on– vote score for photos,– categories (portrait),– other people in photo– ...

• The service returns– a topic map fragment with links to the person page

and a few different sizes of the selected photo

http://www.garshol.priv.no/blog/183.html

Page 98: Ontopia tutorial

98

get-illustration

tmphoto tmtools

Do you have a photo ofhttp://psi.ontopedia.net/

Benjamin_Bock ?http://www.garshol.priv.no/tmphoto/get-illustration?identifier=http://psi.on....

Hmmm. Scores, categories,

people in photo, ...

Topic mapfragment

Page 99: Ontopia tutorial

99

Voila...

Page 100: Ontopia tutorial

100

Points to note

• No hard-wiring of links– just add identifiers when creating people topics– photos appear automatically– if a better photo is added later, it’s replaced

automatically

• No copying of data– no duplication, no extra maintenance

• Very loose binding– nothing application-specific

• Highly extensible– once the identifiers are in place we can easily pull

in more content from other sources

Page 101: Ontopia tutorial

101

My blog

• Has more content about– people (tmphoto & tmtools),– events (tmphoto),– tools (tmtools),– technologies (tmtools)

• Should be available in those applications

Page 102: Ontopia tutorial

102

Solution

• My blog posts are tagged– but the tags are topics, which can have PSIs– these PSIs are used in tmphoto and tmtools,

too

• The get-topic-page request lets tmphoto & tmtools ask the blog for links to relevant posts– given identifiers for a topic, returns links to

pages about that topic

http://www.garshol.priv.no/blog/145.html

Page 103: Ontopia tutorial

103

get-topic-page

Blog tmphoto

Do you have pages abouthttp://psi.ontopedia.net/

TMRA_2008 ?http://www.garshol.priv.no/blog/get-topic-page?identifier=http://psi.on....

Topic mapfragment

Topics linking toindividual blog posts

Page 104: Ontopia tutorial

104

In tmphoto

Page 105: Ontopia tutorial

105

Making web applications

Navigator Framework

Page 106: Ontopia tutorial

106

Ontopia Navigator Framework

• Java API for interacting with TM repository

• JSP tag library– based on tolog– kind of like XSLT in JSP with tolog instead of

XPath– has JSTL integration

• Undocumented parts– web presentation components– some wrapped as JSP tags– want to build proper portlets from them

Page 107: Ontopia tutorial

107

How it works

Topic MapEngine

TagLibraries

JSP page

JSP page

JSP page

JSP page

Web server with JSP containere.g. Apache Tomcat

Browser

Browser

Browser

Browser

Topic Map

Page 108: Ontopia tutorial

108

The two tag libraries

tolog makes up nearly the entire framework used to extract information from topic maps lets you execute tolog queries to extract

information from the topic map looping and control flow structures

template used to create template pages separates layout and structure from content not Topic Maps-aware optional, but recommended

Page 109: Ontopia tutorial

109

How the tag libraries work

The topic map engine holds a registry of topic maps collected from the tm-sources.xml configuration file each topic map has its own id (usually the file name)

Each page also holds a set of variable bindings each variable holds a collection of objects objects can be topics, base names, locators,

strings, ... Tags access variables

some tags set the values of variables, while others use them

Page 110: Ontopia tutorial

110

Building a JSP page

The <%@ taglib ... %> tags declare your tag libraries Tells the page which tag library to include and binds it

to a prefix Prefixes are used to qualify the tags (and avoid name

collisions) Use the <tolog:context> tag around the entire

page The "topicmap" attribute specifies the ID of the

current topic map The first time you access the page in your

browser the page gets compiled If you modify the page then it will be

recompiled the next time it is accessed

Page 111: Ontopia tutorial

111 http://www.ontopia.net/operamap

Page 112: Ontopia tutorial

112

Navigator tag library example

<%-- assume variable 'composer' is already set --%>

<p><b>Operas:</b><br/><tolog:foreach query=”composed-by(%composer% : composer, $OPERA : opera), { premiere-date($OPERA, $DATE) }?”> <li> <a href="opera.jsp?id=<tolog:id var="OPERA"/>”

><tolog:out var="OPERA"/></a>

<tolog:if var="DATE"> <tolog:out var="DATE"/> </tolog:if> </li></tolog:foreach></p>

Page 113: Ontopia tutorial

113Elmer Preview

Page 114: Ontopia tutorial

114

Page 116: Ontopia tutorial

116

Page 117: Ontopia tutorial

117

Possible configuration

Application directories

webapps myApp/

omnigator/

i18n/

*.jsp

WEB-INF/ config/

topicmaps/

web.xml

*.xml

*.xtm, *.ltm

Page 118: Ontopia tutorial

118

The navigator configuration files

web.xml where to find the other files, plus plug-ins

tm-sources.xml tells the navigator where to find topic

maps log4j.properties

configuration of the log4j logging More details in the "Configuration

Guide" document

Page 119: Ontopia tutorial

119

More information

• Navigator Framework Configuration Guide– http://www.ontopia.net/doc/current/doc/

navigator/config.html

• Navigator Framework Developer's Guide– http://www.ontopia.net/doc/current/doc/

navigator/navguide.html

• Navigator Framework Tag Library Reference– http://www.ontopia.net/doc/current/doc/

navigator/tolog-taglib.html

Page 120: Ontopia tutorial

120

...

Automated classification

Page 121: Ontopia tutorial

121

What is automated classification?

• Create parts of a topic map automatically– using the text in existing content as the source– not necessarily 100% automatic; user may help

out

• A hard task– natural language processing is very complex– result is never perfect

• However, it’s possible to achieve some results

Page 122: Ontopia tutorial

122

Why automate classification?

• Creating a topic map requires intellectual effort– that is, it requires work by humans

• Human effort = cost– added value must be sufficient to justify the cost– in some cases either

• the cost is too high, or• the value added is too limited

• The purpose of automation is to lower the cost– this increases the number of cases where the use

of Topic Maps is justified

Page 123: Ontopia tutorial

123

Automatable tasks

• Ontology– hard– depends on

requirements– one time only

• Instance data– hard– usually exists in

other sources

• Document keywords

– easier– frequent

operation– usually no other

sources

Project Person DepartmentWorked on Worked on

XYZ Project IT groupJane Doe

worked on employed in

Page 124: Ontopia tutorial

124

Two kinds of categorization

• Broad categorization– categories are broadly defined– include many different subjects

• Narrow categorization– uses very specific keywords– each keyword is a single subject

Broad:Environment, Crisis managementNarrow:Water, Norway, drought, Drought Act, Cloud seeding, Morecambe Bay

Page 125: Ontopia tutorial

125

What it does

• Extract keywords from content– goal is to use these for classification

• Not entity recognition– we only care about identifying what the

content is about

• Uses statistical approach– no attempt at full formal parsing of the text

Page 126: Ontopia tutorial

126

Steps of operation

• Identify format– then, extract the text

• Identify language– then, remove stop words– stem remaining words

• Classify– can use terms from preexisting Topic Maps– exploits knowledge of the language

• Return proposed keywords

Page 127: Ontopia tutorial

127

Example of keyword extraction

• topic maps1.0

• metadata0.57

• subject-based class.0.42• Core metadata

0.42• faceted classification

0.34• taxonomy

0.22• monolingual thesauri

0.19• controlled vocabulary

0.19• Dublin Core

0.16• thesauri

0.16• Dublin

0.15• keywords

0.15

Page 128: Ontopia tutorial

128

Example #2

• Automated classification 1.05

• Topic Maps0.51 14

• XSLT0.38 11

• compound keywords 0.292

• keywords 0.2620

• Lars0.23 1

• Marius0.23 1

• Garshol 0.221

• ...

Page 129: Ontopia tutorial

129

So how could this be used?

• To help users classify new documents in a CMS interface– suggest appropriate keywords, screened by user before

approval

• Automate classification of incoming documents– this means lower quality, but also lower cost

• Get an overview of interesting terms in a document corpus– classify all documents, extract the most interesting

terms– this can be used as the starting point for building an

ontology– (keyword extraction only)

Page 130: Ontopia tutorial

130

Example user interface

• The user creates an article– this screen then used to add keywords– user adjusts the proposals from the classifier

Page 131: Ontopia tutorial

131

Interfaces

• java net.ontopia.topicmaps.classify.Chew– <topicmapuri>– <inputfile>– produces textual output only

• net.ontopia.topicmaps.classify.SimpleClassifier– classify(uri, topicmap) -> TermDatabase– classify(uri) -> TermDatabase

Page 132: Ontopia tutorial

132

Supported formats and languages

• XML (any schema)• HTML (non-XML)• PDF• Word (.doc, .docx)• PowerPoint

(.ppt, .pptx)• Plain text

• English• Norwegian

Page 133: Ontopia tutorial

133

Visualization of Topic Maps

Vizigator

Page 134: Ontopia tutorial

134

The Vizigator

• Graphical visualization of Topic Maps• Two parts

– VizDesktop: Swing desktop app for configuration

– Vizlet: Java applet for web deployment

• Configuration stored in XTM file

Page 135: Ontopia tutorial

135

The uses of visualization

• Not really suitable for navigation– doesn't work for all kinds of data

• Great for seeing the big picture

Page 136: Ontopia tutorial

136

Without configuration

Page 137: Ontopia tutorial

137

With configuration

Page 138: Ontopia tutorial

138

VizDesktop

Page 139: Ontopia tutorial

139

The Vizigator

• The Vizigator uses TMRAP– the Vizlet runs in the browser (on the client)– a fragment of the topic map is downloaded from the server– the fragment is grown as needed

ServerTMRAP

Page 140: Ontopia tutorial

140

Embedding the Vizlet

• Set up TMRAP service• Add ontopia-vizlet.jar• Add necessary HTML <applet code="net.ontopia.topicmaps.viz.Vizlet.class" archive="ontopia-vizlet.jar"> <param name="tmrap" value="/omnigator/plugins/viz/"> <param name="config" value="/omnigator/plugins/viz/config.jsp?tm=<%= tmid %>"> <param name="tmid" value="<%= tmid %>"> <param name="idtype" value="<%= idtype %>"> <param name="idvalue" value="<%= idvalue %>"> <param name="propTarget" value="VizletProp"> <param name="controlsVisible" value="true"> <param name="locality" value="1"> <param name="max-locality" value="5"></applet>

Page 141: Ontopia tutorial

141

Topic Maps debugger

Omnigator

Page 142: Ontopia tutorial

142

Omnigator

• Generic Topic Maps browser– very useful for seeing what's in a topic map– the second-oldest part of Ontopia

• Contains other features beyond simple browsing– statistics– management console– merging– tolog querying/updates– export

Page 143: Ontopia tutorial

143

Ontology designer and editor

Ontopoly

Page 144: Ontopia tutorial

144

Ontopoly

• A generic Topic Maps editor, in two parts– ontology editor: used to create the ontology and

schema– instance editor: used to enter instances based on

ontology

• Features– works with both XTM files and topic maps stored in

RDBMS backend– supports access control to administrative functions,

ontology, and instance editors– existing topic maps can be imported– parts of the ontology can be marked as read-only, or

hidden

Page 145: Ontopia tutorial

145

Ontology designer

• Create ontology based on– topic, association, name, occurrence, and role

types

• Supports iterative ontology development– modify and prototype the ontology until it's

right

• Supports ontology annotation– add fields to topic types, for example

• Supports views– define restricted views of certain topic types

Page 146: Ontopia tutorial

146

Instance editor

• Configured by the ontology editor– shows topics as defined by the ontology

• Has several ways to pick associations– drop-down list– by search– from hierarchy

• Avoids conflicts– pages viewed by one user are locked to others

Page 147: Ontopia tutorial

147

Ontopoly is embeddable

• The Ontopoly instance editor can be embedded– basically, the main panel can be inserted into

another web application– uses an iframe

• Requires only ID of topic being edited– can also be restricted to a specific view

• Makes it possible to build easier-to-use editors– so users don't have to learn all of Ontopoly

Page 148: Ontopia tutorial

148

Adding content features

CMS integrations

Page 149: Ontopia tutorial

149

CMS integration

• The best way to add content functionality to Ontopia– the world doesn’t need another CMS– better to reuse those which already exist

• So far two integrations exist– Escenic– OfficeNet Knowledge Portal– more are being worked on

Page 150: Ontopia tutorial

150

Implementation

• A CMS event listener– the listener creates topics for new CMS articles, folders, etc– the mapping is basically the design of the ontology used by this listener

• Presentation integration– it must be possible to list all topics attached to an article– conversely, it must be possible to list all articles attached to a topic– how close the integration needs to be here will vary, as will the difficulty

of the integration

• User interface integration– it needs to be possible to attach topics to an article from within the

normal CMS user interface– this can be quite tricky

• Search integration– the Topic Maps search needs to also search content in the CMS– can be achieved by writing a tolog plug-in

Page 151: Ontopia tutorial

151

Articles as topics

• Goal: associate articles with topics– mainly to say what they are about– typically also want to include other metadata

• Need to create topics for the articles to do this– in fact, a general CMS-to-TM mapping is needed– must decide what metadata and structures to include

New city council appointed

is about

Elections

Page 152: Ontopia tutorial

152

Mapping issues

• Article topics– what topic type to use?– title becomes name? (do you know the title?)– include author? include last modified? include workflow

state?– should all articles be mapped?

• Folders/directories/sections/...– should these be mapped, too?– one topic type for all folders/.../.../...?– if so, use associations to connect articles to folders– use associations to reproduce hierarchical folder structure

• Multimedia objects– should these be included?– what topic type? what name? ...

Page 153: Ontopia tutorial

153

Two styles of mappings

Articles as articles• Topic represents only the article• Topic type is some subclass of “article”• “Is about” association connects article into topic map• Fields are presentational

– title, abstract, body

Articles as concepts• Topic represents some real-world subject (like a person)

– article is just the default content about that subject

• Type is the type of the subject (person)• Semantic associations to the rest of the topic map

– works in department, has competence, ...

• Fields can be semantic– name, phone no, email, ...

Page 154: Ontopia tutorial

154

Article as article

• Article about building of a new school

• Is about association to “Primary schools”

• Topic type is “article”

Page 155: Ontopia tutorial

155

Article as concept

Article about a sports hall

Article really represents the hall

Topic type is “Location”

Associations to– city borough– events in the location– category “Sports”

Page 156: Ontopia tutorial

156

Page 157: Ontopia tutorial

157

Page 158: Ontopia tutorial

158

Page 159: Ontopia tutorial

159

Page 160: Ontopia tutorial

160

Page 161: Ontopia tutorial

161

Ontopia/Liferay

• An integration with the Liferay CMS and portal is in progress– presented Friday 1130-1150 in Schiller 2

Page 162: Ontopia tutorial

162

Two projects

Real-life usage

Page 163: Ontopia tutorial

163

The project

• A new citizen’s portal for the city administration– strategic decision to make portal main interface for

interaction with citizens– as many services as possible are to be moved online

• Big project– started in late 2004, to continue at

least into 2008– ~5 million Euro spent by launch date– 1.7 million Euro budgeted for 2007– Topic Maps development is a fraction

of this (less than 25%)• Many companies involved

– Bouvet/Ontopia– Avenir– KPMG– Karabin– Escenic

Page 164: Ontopia tutorial

164

Simplified original ontology

Externalresource

Category

Subject Department

Service

Employee

Borough

FormArticle

nearlyeverything

LOSService catalog

Payroll++

Escenic (CMS)

Page 165: Ontopia tutorial

165

Data flow

OntopiaEscenic LOS

Fellesdata

Payroll(Agresso)Dexter/Extens Service

Catalog

DB2TM

TMSync

Ontopoly

Integration

Page 166: Ontopia tutorial

166

Conceptual architecture

Ontopia Escenic

Application

Oracle Portal

Oracle Database

Datasources

Page 167: Ontopia tutorial

167

The portal

Page 168: Ontopia tutorial

168

Technical architecture

Page 169: Ontopia tutorial

169

NRK/Skole

• Norwegian National Broadcasting (NRK)– media resources from the archives– published for use in schools– integrated with the National Curriculum

• In production– delayed by copyright wrangling

• Technologies– OKS– Polopoly CMS– MySQL database– Resin application server

Page 170: Ontopia tutorial

170

Curriculum-based browsing (1)

Curriculum

Social studies

High school

Page 171: Ontopia tutorial

171

Curriculum-based browsing (2)

Gender roles

Page 172: Ontopia tutorial

172

Curriculum-based browsing (3)

Feminist movement in the 70s and 80sChanges to the family in the 70sThe prime minister’s husbandChildren choosing careersGay partnerships in 1993

Page 173: Ontopia tutorial

173

One video (prime minister’s husband)

Metadata

Description

Subject

Person

Relatedresources

Page 174: Ontopia tutorial

174

Conceptual architecture

Polopoly

Ontopia

MySQL

MediaDBGrep

RDBMS backend

DB2TMTMSync

HTTP

Editors

Page 175: Ontopia tutorial

175

Implementation

• Domain model in Java– Plain old Java objects built on

• Ontopia’s Java API• tolog

• JSP for presentation– using JSTL on top of the domain model

• Subversion for the source code• Maven2 to build and deploy• Unit tests

Page 176: Ontopia tutorial

176

What we’d like to see

The future

Page 177: Ontopia tutorial

177

The big picture

Engine

Ontopoly

Portlet support

CMSintegration

Data integration

OKP

Escenic

A.N.other

A.N.other

OtherCMSs

DB2TM

XML2TM

A.N.other

A.N.other

Auto-class.

Taxon.import

Webservice

Page 178: Ontopia tutorial

178

CMS integrations

• The more of these, the better• Candidate CMSs

– Liferay (being worked on at Bouvet)– Alfresco – Magnolia– Inspera– JSR-170 Java Content Repository– CMIS (OASIS web service standard)

Page 179: Ontopia tutorial

179

Portlet toolkit

• Subversion contains a number of “portlets”– basically, Java objects doing presentation tasks– some have JSP wrappers as well

• Examples– display tree view– list of topics filterable by facets– show related topics– get-topic-page via TMRAP component

• Not ready for prime-time yet– undocumented– incomplete

Page 180: Ontopia tutorial

180

Ontopoly plug-ins

• Plugins for getting more data from externals– TMSync import plugin– DB2TM plugin– Subj3ct.com plugin– adapted RDF2TM plugin– classify plugin– ...

• Plugins for ontology fragments– menu editor, for example

Page 181: Ontopia tutorial

181

TMCL

• Now implementable• We’d like to see

– an object model for TMCL (supporting changes)

– a validator based on the object model– Ontopoly import/export from TMCL (initially)– refactor Ontopoly API to make it more

portable– Ontopoly ported to use TMCL natively

(eventually)

Page 182: Ontopia tutorial

182

Things we’d like to remove

• OSL support– Ontopia Schema Language

• Web editor framework– unfortunately, still used by some major

customers

• Fulltext search– the old APIs for this are not really of any use

Page 183: Ontopia tutorial

183

Management interface

• Import topic maps (to file or RDBMS)

Page 184: Ontopia tutorial

184

What do you think?

• Suggestions?• Questions?• Plans?• Ideas?

Page 185: Ontopia tutorial

185

Setting up the developer environment

Getting started

Page 186: Ontopia tutorial

186

If you are using Ontopia...

• ...simply download the zip, then– unzip,– set the classpath,– start the server, ...

• ...and you’re good to go

Page 187: Ontopia tutorial

187

If you are developing Ontopia...

• You must have– Java 1.5 (not 1.6 or 1.7 or ...)– Ant 1.6 (or later)– Ivy 2.0 (or later)– Subversion

• Then– check out the source from Subversion

svn checkout http://ontopia.googlecode.com/svn/trunk/ ontopia-read-only

– ant bootstrap– ant dist.jar.ontopia– ant test– ant dist.ontopia

Page 188: Ontopia tutorial

188

Beware

• This is fun, because– you can play around with anything you want– e.g, my build has a faster

TopicIF.getRolesByType– you can track changes as they happen in svn

• However, you’re on your own– if it fails it’s kind of hard to say why– maybe it’s your changes, maybe not

• For production use, official releases are best

Page 189: Ontopia tutorial

189

Participating etc

The project

Page 190: Ontopia tutorial

190

Our goal

• To provide the best toolkit for building Topic Maps-based applications

• We want it to be– actively maintained,– bug-free,– scalable,– easy to use,– well documented,– stable,– reliable

Page 191: Ontopia tutorial

191

Our philosophy

• We want Ontopia to provide as much useful more-or-less generic functionality as possible

• New contributions are generally welcome as long as– they meet the quality requirements, and– they don’t cause problems for others

Page 192: Ontopia tutorial

192

The sandbox

• There’s a lot of Ontopia-related code which does not meet those requirements– some of it can be very useful,– someone may pick it up and improve it

• The sandbox is for these pieces– some are in Ontopia’s Subversion repository,– others are maintained externally

• To be “promoted” into Ontopia a module needs– an active maintainer,– to be generally useful, and– to meet certain quality requirements

Page 193: Ontopia tutorial

193

Communications

• Join the mailing list(s)!– http://groups.google.com/group/ontopia– http://groups.google.com/group/ontopia-dev

• Google Code page– http://code.google.com/p/ontopia/– note the “updates” feed!

• Blog– http://ontopia.wordpress.com

• Twitter– http://twitter.com/ontopia

Page 194: Ontopia tutorial

194

Committers

• These are the people who run the project– they can actually commit to Subversion– they can vote on decisions to be made etc

• Everyone else can– use the software as much as they want,– report and comment on issues,– discuss on the mailing list, and– submit patches for inclusion

Page 195: Ontopia tutorial

195

How to become a committer

• Participate in the project!– that is, get involved first– let people get to know you, show some

commitment

• Once you’ve gotten some way into the project you can ask to become a committer– best if you have provided some patches first

• Unless you’re going to commit changes there’s no need to be a committer

Page 196: Ontopia tutorial

196

Finding a task to work on

• Report bugs!– they exist. if you find any, please report them.

• Look at the open issues– there is always testing/discussion to be done

• Look for issues marked “newbie”– http://code.google.com/p/ontopia/issues/list?

q=label:Newbie

• Look at what’s in the sandbox– most of these modules need work

• Scratch an itch– if there’s something you want

fixed/changed/added...

Page 197: Ontopia tutorial

197

How to fix a bug

• First figure out why you think it fails• Then write a test case

– based on your assumption– make sure the test case fails (test before you

fix)

• Then fix the bug– follow the coding guidelines (see wiki)

• Then run the test suite– verify that you’ve fixed the bug– verify that you haven’t broken anything

• Then submit the patch

Page 198: Ontopia tutorial

198

The test suite

• Lots of *.test packages in the source tree– 3795 test cases as of right now– test data in ontopia/src/test-data– some tests are generators based on files– some of the test files come from cxtm-

tests.sf.net

• Run with– ant test– java net.ontopia.test.TestRunner src/test-

data/config/tests.xml test-group

Page 199: Ontopia tutorial

199

Source tree structure

• net.ontopia.– utils various utilities– test various test

support code– infoset LocatorIF code +

cruft– persistence OR-mapper for RDBMS

backend– product cruft– xml various XML-

related utilities– topicmaps next slides

Page 200: Ontopia tutorial

200

Source tree structure

• net.ontopia.topicmaps.– core core engine API– impl engine backends + utils– utils utilities (see next slide)– cmdlineutils command-line tools– entry TM repository– nav + nav2 navigator framework– query tolog engine– viz– classify– db2tm– webed cruft

Page 201: Ontopia tutorial

201

Source tree structure

• net.ontopia.topicmaps.utils– * various utility classes– ltm LTM reader and writer– ctm CTM reader– rdf RDF converter (both ways)– tmrap TMRAP implementation

Page 202: Ontopia tutorial

202

Let’s write some code!

Page 203: Ontopia tutorial

203

The engine

• The core API corresponds closely to the TMDM– TopicMapIF, TopicIF, TopicNameIF, ...

• Compile with– ant init compile.ontopia– .class files go into ontopia/build/classes– ant dist.ontopia.jar # makes a jar

Page 204: Ontopia tutorial

204

The importers

• Main class implements TopicMapReaderIF– usually, this lets you set up configuration, etc– then uses other classes to do the real work

• XTM importers– use an XML parser– main work done in XTM(2)ContentHandler– some extra code for validation and format detection

• CTM/LTM importers– use Antlr-based parsers– real code in ctm.g/ltm.g

• All importers work via the core API

Page 205: Ontopia tutorial

205

Find an issue in the issue tracker

• (Picking one with “Newbie” might be good, – but isn’t necessary)

• Get set up– check out the source code– build the code– run the test suite

• Then dig in– we’ll help you with any questions you have

• At the end, submit a patch to the issue tracker– remember to use the test suite!