<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">The Semantic Web takes Wing: Programming Ontologies with Tawny-OWL</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author>
							<persName><forename type="first">Phillip</forename><surname>Lord</surname></persName>
							<affiliation key="aff0">
								<orgName type="department">School of Computing Science</orgName>
								<orgName type="institution">Newcastle University</orgName>
							</affiliation>
						</author>
						<title level="a" type="main">The Semantic Web takes Wing: Programming Ontologies with Tawny-OWL</title>
					</analytic>
					<monogr>
						<imprint>
							<date/>
						</imprint>
					</monogr>
					<idno type="MD5">E8E8B5500D9B2EB2E11845B29EF4201F</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2023-03-24T17:45+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>The Tawny-OWL library provides a fully-programmatic environment for ontology building; it enables the use of a rich set of tools for ontology development by recasting development as a form of programming. It is built in Clojure -a modern Lisp dialect, and is backed by the OWL API. Used simply, it has a similar syntax to OWL Manchester syntax, but it provides arbitrary extensibility and abstraction. It builds on existing facilities for Clojure, which provides a rich and modern programming tool chain, for versioning, distributed development, build, testing and continuous integration. In this paper, we describe the library, this environment and the its potential implications for the ontology development process.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1">Introduction</head><p>Ontology building remains a difficult and demanding task. Partly this is intrinsic, but also stems from the tooling. For example, while ontology editors like Protégé <ref type="bibr" target="#b0">[1]</ref> do allow manual ontology development, they are not ideal for automation or template-driven development; as a result, languages such as OPPL <ref type="bibr" target="#b1">[2]</ref> have been developed which allow a slightly higher-level of abstraction over the base OWL axiomatisation. However, they involve a move away from OWL syntax, which in turn requires integration into which ever environment the developers are using. There has also been significant interest in collaborative development of ontologies, either using collaborative development tools such as Web-Protege <ref type="bibr" target="#b2">[3]</ref>, or through copy-modify-merge versioning <ref type="bibr" target="#b3">[4]</ref>.</p><p>In this work, we<ref type="foot" target="#foot_0">1</ref> take an alternative approach. Instead of developing tools for ontology development, many of which are similar or follow on from software development tools, we attempt to recast ontology development as a software engineering problem, and then simply reuse the standard tools that exist for software engineering. We have achieved this by developing a library, named Tawny OWL, that at its simplest operates as a domain specific language for OWL, while still retaining the full capabilities of a modern programming language with all this entails. We demonstrate the application of this library to a standard exemplar -namely the Pizza Ontology <ref type="bibr" target="#b4">[5]</ref>, as well as several other scenarios. Finally, we consider the implications of this approach for enabling collaborative and more agile forms of ontology development.</p><p>The Tawny-OWL library is being developed on GitHub (https://github. com/phillord/tawny-owl); it currently consists of around 3000 lines of code, and supports OWL2 object and annotation properties.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2">Requirements</head><p>Interaction between OWL and a programming API is not a new idea. For example, OWL2Perl <ref type="bibr" target="#b5">[6]</ref> allows generation of Perl classes from an OWL Ontology, FuXi does similar in Python http://code.google.com/p/fuxi/, while the OWL API allows OWL ontology development in Java <ref type="bibr" target="#b6">[7]</ref>. The OWL API, however, is rather unwieldy for direct ontology development; for example, it has a complex type hierarchy, indirect instantiation of objects through factories, and a set of change objects following a command design pattern; while these support one of its original intended use case -building a GUI -they make direct ontology development cumbersome. One response to this is Brain <ref type="bibr" target="#b7">[8,</ref><ref type="bibr" target="#b8">9]</ref>, which is a much lighter-weight facade over the OWL API also implemented in Java. Brain is, effectively, typeless as expressions are generated using Strings; the API distinguishes between OWL class creation (addClass) and retrieval (getClass), throwing exceptions to indicate an illegal state. While Brain is useful, it is not clear how an ontology should be structured in Java's object paradigm, and it suffers the major drawback of Java -an elongated compile-test-debug cycle, something likely to be problematic for interactive development as the ontology increases in size.</p><p>For programmatic ontology development, we wanted an interactive and dynamic environment rather like the R environment for statistics, where the ontology could be explored, extended and reworked on-the-fly. For this reason we choose to build in Clojure; a modern Lisp derivative with many attractive features: persistent data structures; specialised mechanisms for state. It suffers somewhat from being built on the Java Virtual Machine (JVM) -this gives it a rather slow start-up time. However, in this case, it was a key reason for its use. Interoperability with the JVM is integrated deeply into Clojure which makes building on top of the OWL API both possible and convenient; this interoperability means any feature of the OWL API can be used within tawny, without moving from the Lisp syntax; so, while tawny does not currently wrap for isntance either datatype properties, nor ontology explanation code, both are still easily accessible. Like all lisps, Clojure has three other advantages: first, it is untyped which, in common with Brain, in this context, we consider to be an advantage<ref type="foot" target="#foot_1">2</ref> ; second, it is highly dynamic -almost any aspect of the language can be redefined at any time -and it has a full featured read-eval-print-loop (REPL); finally, it has very little syntax, so libraries can manipulate the look of the language very easily. Consider, for example, a simple class definition as shown in Listing1, taken from a pizza ontology available at https://github.com/phillord/tawny-pizza. The syntax has been designed after Manchester syntax <ref type="bibr" target="#b9">[10]</ref>.</p><p>( defclass Pizza : label " Pizza " : comment " An oven-baked flat bread with toppings , originating from Italy . " ) Listing 1. A basic class definition A more complex definition shows the generation of restrictions and anonymous classes.</p><p>( defclass CheesyPizza : equivalent ( owland Pizza ( owlsome hasTopping CheeseTopping )))</p><p>Listing 2. A Cheesy Pizza</p><p>These definitions bind a new symbol (Pizza and CheesyPizza) to a OWL-API Java object. These symbols resolve as a normal Var does in Clojure. Strictly, this binding is not necessary (and can be avoided if the user wishes), however this provides the same semantics as Brain's addClass and getClass -classes, properties, etc must be created before use; a valuable feature protecting against typing errors <ref type="bibr" target="#b10">[11]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.1">Lisp Terminology</head><p>Here we give a brief introduction to Clojure and its terminology. Like all lisps, it has a regular syntax consisting of parenthesis delimited (lists), defining an expression. The first element is usually a function, giving lisps a prefix notation. Elements can be literals, such as strings e.g. "Pizza", symbols e.g. defclass or keywords e.g. :equivalent. Symbols resolve to their values, keywords resolve to themselves, and literals are, well, literal. Unlike many languages, these constructs are directly manipulable in the language itself which combined with macros enable extension of the language.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3">A Rich Development Environment</head><p>There are a dizzying array of ontology development tools available <ref type="bibr" target="#b11">[12]</ref>. Probably the most popular is Protégé; while it provides a very rich environment for viewing and interacting with an ontology, it lacks many features that are present in most IDEs. For instance, it lacks support for version control or adding to ChangeLogs; it is not possible to edit documentation along side the ontology; nor to edit code in other languages when, for instance, driving a build process, or using an ontology in an application.</p><p>We have previously attempted to work around this problem by providing support for Manchester syntax -OMN -within Emacs through omn-mode <ref type="bibr">[13]</ref>; while this provides a richer general-purpose environment, the ontology environment is comparatively poor. In particular, only syntactic completion is available and there is no support for documentation look-up beyond file navigation. Finally, we used Protégé (and the OWL API) to check syntax, which required a complete re-parse of the file, and with relatively poor feedback from Protégé when errors occurred <ref type="foot" target="#foot_2">3</ref> .</p><p>With tawny, using a general purpose programming language, a richer development environment comes nearly for free. In this paper, we describe the use within Emacs; however, support for Clojure is also available within Eclipse, In-telliJ, Netbeans and other environments <ref type="bibr" target="#b13">[14]</ref>. Compared with direct editing of OMN files, tawny provides immediate advantages. The use of paren delimiters makes indentation straight-forward, well-defined, and well-supported; advanced tools like paredit ensures that expressions are always balanced. Clojure provides a REPL, and interaction within this allows more semantic completion of symbols even when they are not syntactically present in the buffer <ref type="foot" target="#foot_3">4</ref> , which is common when using levels of abstraction (Section 4) or external OWL files (Section 8). Syntax checking is easy, and can be performed on buffer, marked region or specific expression. New entities can be added or removed from the ontology on-thefly without reloading the entire ontology, enabling progressive development. We have also provided support for documentation look-up of OWL entities, hooked into Clojure's native documentation facility so should function within all development environments. We do not currently provide a rich environment for browsing ontologies, except at the code level; however, Protégé works well here, reloading OWL files when they are changed underneath it. Similarly, omn-mode can be used to view individual generated OMN files.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4">Supporting Higher Levels of Abstraction</head><p>Most ontologies include a certain amount of "boilerplate" code, where many classes follow a similar pattern. Tools such as OPPL were built specifically to address this issue; with tawny, the use of a full programming language, makes the use of levels of abstraction above that in OWL straight-forward. We have used this in many areas of tawny; at its simplest, by providing convenience macros. For example, it is common-place to define many subclasses for a single superclass; using OMN each subclass must describe its superclass. Within tawny, a dynamically-scoped block can be used as shown in Listing 3. As shown here, disjoint axioms can also be added <ref type="bibr" target="#b14">[15]</ref>; and, not used here, covering axioms <ref type="bibr" target="#b15">[16]</ref>. The equivalent OMN generated by these expressions is also shown in Listing 4.</p><p>( as -d is joi nt -s ubc la ss es PizzaBase ( defclass ThinAndCrispyBase : annotation ( label " BaseFinaEQuebradica " " pt " ))</p><p>( defclass DeepPanBase : annotation ( label " BaseEspessa " " pt " )))</p><p>Listing 3. Subclass Specification It is also possible to add suffixes or prefixes to all classes created within a lexical scope. For example, we can create classes ending in Topping as shown in Listing 5. While similar functionality could be provided with a GUI, this has the significant advantage that the developers intent remains present in the source; so subsequent addition of new toppings are more likely to preserve the naming scheme.</p><p>( with-suffix Topping ( defclass GoatsCheese ) ( defclass Gorgonzola ) ( defclass Mozzarella ) ( defclass Parmesan ))</p><p>Listing 5. Adding Suffixes Tawny also includes initial support for ontology design patterns; in particular, we have added explicit support for the value partition <ref type="bibr" target="#b16">[17]</ref>. This generates classes, disjoints and properties necessary to fulfil a pattern, but is represented in tawny succinctly (Listing 6)</p><formula xml:id="formula_0">( p / value-partition Spiciness [ Mild Medium Hot ]) Listing 6. A Value Partition</formula><p>While some abstractions are generally useful, an important advantage of a full-programmatic language for OWL is that abstractions can be added to any ontology including those which are likely to be useful only within a single ontology. These can defined as functions or macros in the same file as their use. For example, within the pizza ontology, Listing 7 generates two pizzas -in each case the pizza class comes first, followed by its constituent parts; a closure axiom is added to each pizza. As well, as being somewhat more concise than the equivalent OMN, this approach also has the significant advantage that it is possible to change the axiomatisation for all the named pizzas by altering a single function; this is likely to increase the consistency and maintainability of ontologies. Listing 7. Generating Named Pizzas</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5">Separating Concerns for Different Developer Groups</head><p>One common requirement in ontology development is a separation of concerns; different contributors to the ontology may need different editing environments, as for instance with RightField or Populous <ref type="bibr" target="#b17">[18]</ref>. tawny enables this approach also; here, we describe how this enables internationalisation. Originally, the pizza ontology had identifiers in English and Portuguese but, ironically, not Italian. While it would be possible to have a translator operate directly on a tawny source file, this is not ideal as they would need to need to embed their translations within OWL entity definitions as shown in Listing 3; which is likely to be particularly troublesome if machine assisted translation is required due to the non-standard format. We have, therefore added support with the polyglot library. Labels are stored in a Java properties file (Listing 8) and are loaded using a single Lisp form (Listing 9). tawny will generate a skeleton resources file, with no translations, on demand, and reports missing labels to the REPL on loading.</p><formula xml:id="formula_1">AnchoviesTopping = Acciughe Ingredienti ArtichokeTopping = Carciofi Ingredienti AsparagusTopping = Asparagi Ingredienti</formula><p>Listing 8. Italian Resources ( tawny . polyglot / polyglot-load-label " pizza / pizzalabel_it . properties " " it " )</p><p>Listing 9. Loading Multi-Lingual Labels Currently, only loading labels is supported in this way, but extending this to comments or other forms of annotation is possible. While, in this case, we are loading extra-logical aspects of the ontology from file, it would also be possible to load logical axioms; for instance, named pizzas (Section 4) could be loaded from text file, spreadsheet or database.</p><p>Collaborative development is not a new problem; many software engineering projects involve many developers, geographically separated, in different time zones, with teams changing over time. Tools for enabling this form of collaboration are well developed and well supported. Some of these tools are also available for ontology development; for instance, Web-Protégé enables online collaborative editing. However, use of this tool requires installation of a bespoke Tomcat based server, nor does it yet support offline, concurrent modification <ref type="bibr" target="#b2">[3]</ref>.</p><p>Alternatively, the ContentCVS system does support offline concurrent modification. It uses the notion of structural equivalence for comparison and resolution of conflicts <ref type="bibr" target="#b3">[4]</ref>; the authors argue that an ontology is a set of axioms. However, as the named suggests, their versioning system mirrors the capabilities of CVS -a client-server based system, which is now considered archaic.</p><p>For tawny, the notion of structural equivalence is not appropriate. With tawny, the axioms are generated, rather than being source; the source cannot, therefore, be abstracted to a set of axioms. A single change in the source file, might result in 1000s of changes in the axiomatisation. Additionally, programmer intent is often represented through non-axiomitised sections of the code -whitespace, indentation and even comments which may drive a "literate" development approach. Moreover, a definition of a difference based purely on axiomatisation cannot account for these differences; the use of a line-oriented syntactic diff will.</p><p>We argue here that by provision of an attractive and well-supported syntax, we do not need to provide specific collaborative tooling. Tawny itself has been built using distributed versioning systems (first Mercurial and then git). These are already advanced systems supporting multiple workflows including tiered development with authorisation, branching, cherry-picking and so on. While ontology-specific tooling may have some advantages, it is unlikely to replicate the functionality offered by these systems, aside from issues of developer familiarity.</p><p>Later, we also describe support for automated testing, which can also ease the difficulty of collaborative working (Section 9).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="7">Enabling Modularity</head><p>Tawny provides explicit support for name spacing and does this by building on Clojure's namespace support. It is possible to build a set of ontologies spread across a number of different files. Normally, each file contains a single namespace; tawny mirrors this, with each namespace containing a single ontology, with a defined IRI.</p><p>OWL itself does not provide a distribution mechanism for ontologies; the IRI of an ontology does not need to resolve, but in practice, is often a distribution mechanism. By default Protégé will check for resolution if other mechanisms fail; OBO ontologies, for example, are all delivered from their IRI.</p><p>In contrast, tawny builds on the Clojure environment; most projects are built using the Leiningen tool which, in turn, uses the repository and dependency management from Maven. When building the Pizza ontology in tawny, the build tool will fetch tawny itself, the OWL API and HermiT, as well as their dependencies. Ontological dependencies can be fetched likewise. Maven builds come with a defined semantics for versioning, including release and snapshot differentiation. A key advantage of this system is that multiple versions of a single ontology can be supported, with different dependency graphs.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="8">Coping With Semantics Free Identifiers</head><p>Importing one ontology from another is straight-forward in tawny. However, not all ontologies are developed using tawny; we need to be able interact with external ontologies only accessible through an OWL file. Tawny provides facilities for this use-case: the library reads the OWL file, creates symbols for all entities 5 , then associates the relevant Java object with this symbol. This approach is reasonably scalable; tawny can import the Gene Ontology within a minute on a desktop machine. Clojure is a highly-dynamic language and allows this form of programmatic creation of variables as a first-class part of the language; so an ontology read in this way functions in every sense like a tawny native ontology. Ontology classes can be queried for their documentation, auto-completion works and so forth.</p><p>However, there is a significant problem with this import mechanism. Tawny must create a symbol for each OWL entity in the source ontology. By default, tawny uses the IRI fragment for this purpose; while Clojure symbols have a restricted character set which is not the same as that of the IRI fragment, in practice this works well. However, this is unusable for ontologies built according to the OBO ontology standard, which uses semantics-free, numeric identifiers such as OBI_0000107. While these are valid Clojure symbols, it is unreadable for a developer. This issue also causes significant difficulties for ontology development in any syntax; OMN is relatively human-readable but ceases to be so when all identifiers become numeric. We have previously suggested a number of solutions to this problem, either through the use of comments or specialised denormalisations <ref type="bibr" target="#b18">[19]</ref>, or through the addition of an Alias directive providing a mapping between numeric and readable identifier <ref type="bibr" target="#b19">[20]</ref>. However, all of these require changes to the specification and tooling updates, potentially in several syntaxes.</p><p>For tawny, we have worked around this problem by enabling an arbitrary mapping between the OWL entity and symbol name <ref type="bibr" target="#b20">[21]</ref>. For OBO ontologies, a syntactic transformation of the rdfs:label works well. Thus, OBI_0000107 can be referred to as provides_service_consumer_with, while BFO_0000051 becomes the rather more prosaic has_part.</p><p>While this solves the usability problem, it causes another issue for ontology evolution; the label is open to change, independently of any changes in semantics; unfortunately, any dependent ontology built with tawny will break, as the relevant symbol will no longer exist. This problem does not exist for GUI editors such as Protégé because, ironically, they are not WYSIWYG -the ontology In addition to coherence/consistency checking, unit tests are also useful to check the OWL profile in use; particularly useful when using higher levels of abstraction (see Section 4) which hides the exact axiom in use.</p><p>The use of Unit testing in this way has implications beyond simple ontology development; it also allows a richer form of continuous integration where dependent ontologies can be developed by independent developers, but continuously checked for breaking changes. The tawny pizza ontology, for example, is currently being tested using Travis<ref type="foot" target="#foot_5">7</ref> . Unlike, other ontology CI systems <ref type="bibr" target="#b26">[27]</ref>, this requires no installation and integrates directly with the DVCS in use. It is also useful for integration with software that operates on the ontology; for example, both our version of Hermit, the OWL API and tawny-owl are built and tested using this tool.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="10">Discussion</head><p>In this paper, we have described tawny, a library which enables the user to develop ontologies, using the tooling and environments that have long been available to programmers. Although they both involve producing artifacts with strong computational properties ontology development and software engineering have long been disjoint. This has significant negative impacts; there are far more programmers than knowledge engineers, and as a result the tooling that they use is far better developed. Tawny seeks to address this imbalance, not by providing richer tools for ontology development, but by recasting ontology development as a form of programming.</p><p>By allowing knowledge engineers to use any level of abstraction that they choose, tawny can also improve current knowledge engineering process significantly. It can help to remove duplication, for example, in class names. It can clearly delineate disjoint classes protecting against future additions; this helps to address a common ontological error <ref type="bibr" target="#b27">[28]</ref>. It is also possible to model directly using common ontology design patterns generating many axioms in a succinct syntax. Bespoke templates can be built for a specific ontology; this mirrors functionality of tools like OPPL <ref type="bibr" target="#b1">[2]</ref>, but uses the power of a full programming language and environment. Trivially, for example, tawny can log its activity and comes with debugger support.</p><p>Of course, direct use of a programmatic library like tawny is not suitable for all users; however, even for these users a library like tawny could be useful. It is straight-forward to integrate ontologies developed directly with tawny as a DSL with knowledge stored in other formalisms or locations. In this paper, we described loading multi-lingual labels from properties files, isolating the translator from the ontology, and interacting with OWL files generated by another tool. It would also be possible to load axioms from a database or spreadsheet, using existing JVM libraries.</p><p>While with tawny, we have provided a programmatic alternative to many facilities that exist in other tools, we also seek to provide tooling for a more ag-ile and reactive form of ontology development. Current waterfall methodologies, exemplified by BFO-style realism, lack agility, failing to meet the requirement for regular releases to address short-comings, as has been seen with both BFO 1.1 <ref type="bibr" target="#b28">[29]</ref> and BFO 2.0 <ref type="bibr" target="#b29">[30]</ref>. Likewise, the OBO foundry places great emphasis on a review process which is, unfortunately, backlogged <ref type="bibr" target="#b30">[31]</ref> -in short, as with waterfall software methodologies, the centralised aspects of this development model appear to scale poorly.</p><p>Tawny uses many ready-made and well tested software engineering facilities: amenability to modern DVCS, a versioning and release semantics, a test framework and continuous integration. The provision of a test environment is particularly important; while ontology developers may benefit from testing their own ontologies, the ability to contribute tests to their ontological dependencies is even more valuable. They can provide upstream developers precise and executable descriptions of the facilities which they depend on; giving upstream developers more confidence that their changes will not have unexpected consequences. When this does happen, downstream developers can track against older versions of their dependencies, obviating the need for co-ordination of updates; when they do decide to update, the re-factoring necessary to cope with external changes will be supported by their own test sets; finally, continuous integration will provide early warning if a developer's own changes impact others. In short, tawny provides the tools for a more pragmatic and agile form of ontology development which is more suited to fulfilling the changing and varied requirements found in the real world <ref type="bibr" target="#b31">[32]</ref>.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>(</head><label></label><figDesc>generate-named-pizza [ MargheritaPizza MozzarellaTopping TomatoTopping ] [ CajunPizza MozzarellaTopping OnionTopping PeperonataTopping PrawnsTopping TobascoPepperSauce TomatoTopping ]</figDesc></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">Plurals are used throughout, and do not indicate multiple authorship.</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_1">We do not argue that type systems are bad; just that they are less appropriate in this environment</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="3" xml:id="foot_2">This is not a criticism of the Protégé interface; it was not designed to operate on hand-edited files</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="4" xml:id="foot_3">We follow Emacs terminology here -a buffer is a file being edited</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="6" xml:id="foot_4">Available at http://homepages.cs.ncl.ac.uk/phillip.lord/maven/, or on Github</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="7" xml:id="foot_5">http://travis-ci.org</note>
		</body>
		<back>
			<div type="annex">
<div xmlns="http://www.tei-c.org/ns/1.0"><p>stores an IRI, while the user sees the label; changes to labels percolate when reloading the dependent ontology. Tawny provides a solution to this; it is possible to memorise mappings between symbols and IRIs at one point in time <ref type="bibr" target="#b21">[22]</ref>. If the dependency changes its label, while keeping the same IRI, tawny will recognise this situation, and generate a deprecated symbol; dependent ontologies will still work, but will signal warnings stating that a label has changed and suggesting appropriate updates. Currently these must be performed manually, although this could be automated.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="9">Enabling Unit Testing and Continuous Integration</head><p>Unit testing is a key addition to the software development process which has enabled more agile development. Adapting this process for ontology development has previously been suggested <ref type="bibr" target="#b22">[23]</ref>, and implemented as a plugin to Protégé <ref type="bibr" target="#b23">[24]</ref>. To add this capability to tawny, we have integrated reasoning; at the time of writing, only ELK <ref type="bibr" target="#b24">[25]</ref> is available as a Maven resource in the Maven Central repository, therefore we have developed a secondary maven build for HermiT which allows use of this reasoner also <ref type="bibr" target="#b25">[26]</ref> 6 , so both these reasoners are available for use; others can be added trivially as they are mavenised. A number of test frameworks exist in Clojure; here we use clojure.test. As shown in Listing 10, we check that various inferences have occurred (or not as appropriate), using the isuperclass? predicate. We have also added support for "probe" classes. In our second test, we use the with-probe-entities macro; this adds a subclass of VegetarianPizza and CajunPizza -as the latter contains meat, this should result in an incoherent ontology if both definitions are correct; probe entities are automatically removed by the macro, returning the ontology to its previous state, ensuring independence of tests. </p></div>			</div>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<ptr target="http://protege.stanford.edu/" />
		<title level="m">Various: The protégé; ontology editor and knowledge acquisition system</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<analytic>
		<title level="a" type="main">Transforming the axiomisation of ontologies: The ontology pre-processor language</title>
		<author>
			<persName><forename type="first">M</forename><surname>Egana Aranguren</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Stevens</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Antezana</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Nature Precedings</title>
		<imprint>
			<date type="published" when="2009-12">Dec 2009</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">WebProtg: a collaborative ontology editor and knowledge acquisition tool for the web</title>
		<author>
			<persName><forename type="first">T</forename><surname>Tudorache</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Nyulas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><forename type="middle">F</forename><surname>Noy</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">A</forename><surname>Musen</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Semantic Web</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Supporting concurrent ontology development: Framework, algorithms and tool</title>
		<author>
			<persName><forename type="first">Jiminez</forename><surname>Ruiz</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Grau</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><forename type="middle">C</forename><surname>Horrocks</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>Berlanga</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Data &amp; Knowledge Engineering</title>
		<imprint>
			<biblScope unit="volume">70</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page" from="146" to="164" />
			<date type="published" when="2011-01">Jan 2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b4">
	<monogr>
		<author>
			<persName><forename type="first">R</forename><surname>Stevens</surname></persName>
		</author>
		<ptr target="http://robertdavidstevens.wordpress.com/2010/01/22/why-the-pizza-ontology-tutorial/" />
		<title level="m">Why the pizza ontology tutorial?</title>
				<imprint>
			<date type="published" when="2010">2010</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Owl2perl: creating perl modules from owl class definitions</title>
		<author>
			<persName><forename type="first">E</forename><surname>Kawas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><forename type="middle">D</forename><surname>Wilkinson</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Bioinformatics</title>
		<imprint>
			<biblScope unit="volume">26</biblScope>
			<biblScope unit="issue">18</biblScope>
			<biblScope unit="page" from="2357" to="2358" />
			<date type="published" when="2010-09">Sep 2010</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Cooking the semantic web with the OWL API</title>
		<author>
			<persName><forename type="first">S</forename><surname>Bechhofer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Volz</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Lord</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Internaional Semantic Web Conference</title>
				<imprint>
			<date type="published" when="2003">2003</date>
			<biblScope unit="page" from="659" to="675" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">Brain: Biomedical knowledge manipulation</title>
		<author>
			<persName><forename type="first">S</forename><surname>Croset</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Overington</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Rebholz-Schuhman</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Bioinformatics</title>
		<imprint>
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
	<note>Submitted</note>
</biblStruct>

<biblStruct xml:id="b8">
	<monogr>
		<ptr target="https://github.com/loopasam/Brain" />
		<title level="m">loopasam</title>
				<imprint/>
	</monogr>
	<note>Brain</note>
</biblStruct>

<biblStruct xml:id="b9">
	<monogr>
		<author>
			<persName><forename type="first">M</forename><surname>Horridge</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Patel-Schneider</surname></persName>
		</author>
		<ptr target="http://www.w3.org/TR/owl2-manchester-syntax/(2012" />
		<title level="m">Owl 2 web ontology language manchester syntax</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<monogr>
		<author>
			<persName><forename type="first">P</forename><surname>Lord</surname></persName>
		</author>
		<ptr target="http://www.russet.org.uk/blog/2254" />
		<title level="m">Owl concepts as lisp atoms</title>
				<imprint>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<monogr>
		<author>
			<persName><forename type="first">M</forename><surname>Bergman</surname></persName>
		</author>
		<ptr target="http://www.mkbergman.com/862/the-sweet-compendium-of-ontology-building-tools/" />
		<title level="m">The sweet compendium of ontology building tools</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<monogr>
		<author>
			<persName><forename type="first">P</forename><surname>Lord</surname></persName>
		</author>
		<ptr target="http://www.russet.org.uk/blog/2161" />
		<title level="m">Ontology building with emacs</title>
				<imprint>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<monogr>
		<ptr target="http://dev.clojure.org/display/doc/Getting+Started" />
		<title level="m">Various: Getting started -clojure documentation -clojure development</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b14">
	<monogr>
		<author>
			<persName><forename type="first">P</forename><surname>Lord</surname></persName>
		</author>
		<ptr target="http://www.russet.org.uk/blog/2275" />
		<title level="m">Disjoints in clojure-owl</title>
				<imprint>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<monogr>
		<author>
			<persName><forename type="first">R</forename><surname>Stevens</surname></persName>
		</author>
		<ptr target="http://ontogenesis.knowledgeblog.org/1001" />
		<title level="m">Closing down the open world: Covering axioms and closure axioms</title>
				<imprint>
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<monogr>
		<author>
			<persName><forename type="first">A</forename><surname>Rector</surname></persName>
		</author>
		<title level="m">Representing specified values in owl: &quot;value partitions&quot; and &quot;value sets</title>
				<imprint>
			<publisher>W3C Working Group Note</publisher>
			<date type="published" when="2005">2005</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">Populous: a tool for building owl ontologies from templates</title>
		<author>
			<persName><forename type="first">S</forename><surname>Jupp</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Horridge</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Iannone</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Klein</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Owen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Schanstra</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Wolstencroft</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Stevens</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">BMC Bioinformatics</title>
		<imprint>
			<biblScope unit="volume">13</biblScope>
			<biblScope unit="issue">1</biblScope>
			<biblScope unit="page">S5</biblScope>
			<date type="published" when="2011">2011</date>
		</imprint>
	</monogr>
	<note>Suppl</note>
</biblStruct>

<biblStruct xml:id="b18">
	<monogr>
		<author>
			<persName><forename type="first">P</forename><surname>Lord</surname></persName>
		</author>
		<ptr target="http://www.russet.org.uk/blog/1470" />
		<title level="m">Obo format and manchester syntax</title>
				<imprint>
			<date type="published" when="2009">2009</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b19">
	<monogr>
		<author>
			<persName><forename type="first">P</forename><surname>Lord</surname></persName>
		</author>
		<ptr target="http://www.russet.org.uk/blog/2040" />
		<title level="m">Semantics-free ontologies</title>
				<imprint>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b20">
	<monogr>
		<author>
			<persName><forename type="first">P</forename><surname>Lord</surname></persName>
		</author>
		<ptr target="http://www.russet.org.uk/blog/2303" />
		<title level="m">Clojure owl 0</title>
				<imprint>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b21">
	<monogr>
		<author>
			<persName><forename type="first">P</forename><surname>Lord</surname></persName>
		</author>
		<ptr target="http://www.russet.org.uk/blog/2316" />
		<title level="m">Remembering the world as it used to be</title>
				<imprint>
			<date type="published" when="2013">2013</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b22">
	<analytic>
		<title level="a" type="main">Unit tests for ontologies</title>
		<author>
			<persName><forename type="first">D</forename><surname>Vrandecić</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Gangemi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">OTM Workshops</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b23">
	<monogr>
		<author>
			<persName><forename type="first">N</forename><surname>Drummond</surname></persName>
		</author>
		<ptr target="http://www.co-ode.org/downloads/owlunittest/" />
		<title level="m">Co-ode &amp; downloads &amp; the owl unit test framework</title>
				<imprint>
			<date type="published" when="2013-01-28">2013-01-28 15:22:03</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b24">
	<analytic>
		<title level="a" type="main">Elk reasoner: Architecture and evaluation</title>
		<author>
			<persName><forename type="first">Y</forename><surname>Kazakov</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Krtzsch</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Simancik</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 1st International Workshop on OWL Reasoner Evaluation</title>
				<meeting>the 1st International Workshop on OWL Reasoner Evaluation<address><addrLine>ORE-</addrLine></address></meeting>
		<imprint>
			<date type="published" when="2012">2012. 2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b25">
	<monogr>
		<ptr target="http://hermit-reasoner.com/" />
		<title level="m">Hermit reasoner: Home</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b26">
	<monogr>
		<author>
			<persName><forename type="first">C</forename><surname>Mungall</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Dietze</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Carbon</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Ireland</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Bauer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Lewis</surname></persName>
		</author>
		<ptr target="http://bio-ontologies.knowledgeblog.org/405" />
		<title level="m">Continuous integration of open biological ontology libraries</title>
				<imprint>
			<date type="published" when="2012">2012</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b27">
	<analytic>
		<title level="a" type="main">OWL pizzas: Practical experience of teaching OWL-DL: common errors &amp; common patterns</title>
		<author>
			<persName><forename type="first">A</forename><surname>Rector</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Drummond</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Horridge</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Rogers</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Knublauch</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Stevens</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Wang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Wroe</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Engineering Knowledge in the Age of the Semantic Web</title>
				<imprint>
			<date type="published" when="2004">2004</date>
			<biblScope unit="page">6381</biblScope>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b28">
	<monogr>
		<ptr target="https://groups.google.com/d/topic/bfo-discuss/HQSnudUUM4E/discussion" />
		<title level="m">Various: New version of bfo 1.1 available</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b29">
	<monogr>
		<ptr target="https://groups.google.com/d/topic/bfo-discuss/iKBlfDPv5GM/discussion" />
		<title level="m">Various: Proposal for an official bfo 1</title>
				<imprint/>
	</monogr>
	<note>2 release</note>
</biblStruct>

<biblStruct xml:id="b30">
	<monogr>
		<ptr target="http://sourceforge.net/mailarchive/message.php?msg_id=30391720" />
		<title level="m">OBO Foundry Outreach Working Group: New obo foundry tracker for feedback, requests, and other issues</title>
				<imprint/>
	</monogr>
</biblStruct>

<biblStruct xml:id="b31">
	<analytic>
		<title level="a" type="main">Adding a little reality to building ontologies for biology</title>
		<author>
			<persName><forename type="first">P</forename><surname>Lord</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Stevens</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">PLoS One</title>
		<imprint>
			<date type="published" when="2010">2010</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
