For future functionality please see roadmap
Small extension releases
This is a full release. It adds both significant functionality in all areas of Tawny, has a significant clean up of the code base, but also includes a number of breaking changes.
The biggest change has been a reworking off the "default ontology" and
"broadcasting" functionality. This results in a cleaner and hopefully in most
cases faster code base. Many functions (such as owl-some and and),
however, no longer have default ontology functionality and, as a result,
can no longer accept string arguments; only the "main" functions (owl-class,
object-property etc) are capable of creating new entities, which probably
better reflects the original intentionality.
This release also includes further internationalization code, including full support for development of ontologies in Arabic (thanks to Aisha Blfgeh) and Italian. Other highlights include a much cleaner print output making Tawny easier to use and debug.
Support for "frame" functions like owl-class has been refactored; this means
that new frame functions can be easily created, and existing functions can be
easily extended with new frames. A new function, defgem has been added which
gives additional support for facets. A new pattern called tier has been
added which generalizes value-partition.
defgem provides new support for facetsframeify allows easy creation of frame oriented functionstier addedfontology, broadcast and broadcast-2defno, defnb and defnb2defn* macros now all add :arglist to their vartawny.query.into-map now supports :object keywordtawny.query adds many new query functions operating on ontologies and owl
entitiestawny-name extractor function addedtier pattern addedinto-map now supports any Entityable objectontology now accepts multiple values for most framesobject-property now parses correctly (and signals an error) when passed a
single incorrect keyword:name frame now namespaced -- this "feature" was never documented.Numerous small changes
The 1.5 release is mostly to move to the OWL API version 4.
The 1.4 release extends Tawny's existing pattern functionality. Patterns created by tawny can now be annotated as belonging to a particular instance of pattern, which in turn makes it easy to find all the entities created by a pattern. As this capability uses OWLs annotation capabilities, this means that the pattern instances are also apparent in the saved OWL ontology so other tools can use this information also.
Tawny-OWL is not also partially documented using http://github.com/phillord/lentic[lentic]. While this is not complete, it does not make sense to delay the release until this is ready as it is developer documentation.
tawny.pattern/pattern-annotator and associated functions,
which links together all the entities in a pattern.The 1.3 release adds three new features. First, we add support for axiom
annotations. While this has always been possible through the direct use of the
OWL API, this also circumvented many of the features of Tawny-OWL. This is now
possible, through use of the tawny.owl/annotate function.
Second, support for building patterns has been reworked in the tawny.pattern
namespace. The functions p and e allow easy expression of patterns in a
way which can cope easily with optional frames, and also integrates well with
pattern-generator which allows easy construction of macro'd versions of
function based patterns; this allows easy interning of pattern entities and
the use of symbols.
Finally, a new annotator function has been added to tawny.owl. This allows
easy construction of short-cut functions like label and owl-comment which
construct annotations of a specific type, while still supporting Tawny-OWLs
default ontology functionality. The motivation for this functionality comes
from Jennifer Warrender, who has shown that it is a common pattern in several
ontologies.
annotate.tawny.pattern.tawny.pattern has been re-written, meaning that value-partition is now a
function, with defpartition offering the same thing in macro form.The main feature for the 1.2 release has been the incorporation of core.logic, through (ab)use of the Tawny's querying facilities. A tighter integration should be possible, having core.logic work directly over the OWL API, but this was relatively simple to implement. It is performant enough for most uses (the Gene Ontology renders to Clojure data structures in 1-2 seconds on my desktop).
Currently, this integration is used only by tawny.query, providing a query
language for searching over the OWL data model. It should also pave the way
for repurposing of other tools, though, including a linter like kibit.
One other substantial change is an aggressive micro-optimisation of
default-ontology and broadcast-ontology functionality. These functions are
called for almost every user function in tawny.owl but had a base call time
in the microsecond range (rather than 10s of nanoseconds for a normal call).
These micro-optimisations cost a slightly longer code-base; however they give
a 3-5x speed increase. Loading a tawny rendered version of GO is now about
only about 3x slower than reading the OWL file. These optimisations have
resulted in two breaking changes to the broadcasting and default ontology
behaviour, both of which now have alternatives.
Finally, rendering has now been cleaned up, so that the ontology form can also be rendered, and this form re-read. This has required a few additional changes.
tawny.query now includes a number of core.logic predicates.tawny.render/as-form can now cope with any OWL object.tawny.render/as-form now takes options, producing output in several
formats: two for evaluation or documentation, and two for querying. It is
also possible to select the set of ontologies or ontology manager with which
to render.tawny.render can now render OWLOntology objects.ontology function now supports :import and :annotation frames which
broadcast.direct-instances function added.defentity form added and made public.defonce semantics which makes
reloading easier.refine now uses default ontologyontology now adds a prefix even if one is not specified. This avoids a NPE
when saving in a prefix format.as-form now renders multiple facts correctlytawny.fixture/ontology-and-reasoner didn't actualy workdefentity forms still accept this (as they must
have a symbol as the first argument) but the :ontology frame must come
first and have a single ontology.tawny.query has been extensively reworked, including changes to the
underlying representation.tawny.render/form has gone (private). Extensions to tawny.render/as-form
should work as a replacement.tawny.render/as-form is no longer a multimethod, just a function. In
practice, this should have been an implementation detail anyway.tawny.render have gone, replaced by options in the
as-form call.tawny.render/as-form now returns a lazy list. In practice, this is should
be breaking change only if you use str (in which case change to pr-str
instead). The laziness may also cause some unpredictable issues if you store
the form, and change the ontology, then realise the form.OWLNamedObject now support
OWLOntology also. These include tawny.lookup/iri-to-var and associated
functions.The 1.1 release has largely been about regularisation of the syntax, enhanced performance and added a few pieces of OWL missing from 1.0.
Regularisation is the biggest change and is, unfortunately, a breaking change. Original Tawny mimicked Manchester syntax; it's "subclassof" frame is back-to-front -- the filler is a superclass of the entity in question. Tawny now uses ":sub", ":super" as slot names; ":subclass" and ":subproperty" are deprecated and will be removed at a later date.
is function (rather than
fact) and owl-not (or tawny.english\not).as-disjoint now supports all of these.as-equivalent which works for classes, object or
date properties.suboproperties',suboproperty?' and related functions added.equivalent? and disjoints? now work for data and object properties
also.inverse function allows for anonymous reference to the inverse of a
property expression.oneof now takes accepts strings, numbers and booleans as literals without
requiring literal.owl-thingtawny.english.tawny.owl about 2x, tawny.render perhaps 5x for very
approximate benchmarks.owl-not now also supports individuals -- this is technically a breaking
change because owl-not previously had arity 1, now also has arity 2.disjoint-classes list has been removed, and disjoint-classes-list has
been renamed to disjoint-classes!tawny.protege-nrepl has now been removed; its had dependencies that were
not explicitly specified as it ran inside protege. It is now in a project
of its own, called tawny.protege.add-subclass functionality has now reversed its functionality -- the
second class is now the subclass rather than the superclass.superclasses and subclasses no longer crash on circular class hierarchiesdatatype equivalents were limited to other datatypes. Now any datarange
is usable.integration_test namespace for errors that could be in several
places.iequivalent-classes was removing top and bottom. This makes sense
isuper and isubclasses but was breaking a pitfall example.individual-explicit was incorrectly declared as variadic and so silently
ignoring all frames.with-suffix and with-prefix were only returning their last form which
prevented their use within as-disjoints and equivalent.tawny.owl was not necessarily being loaded correctly, leading to profile
violations. It is not loaded as a class resource lazily when necessary.tawny-emacs.el was crashing with "Track Entites" should now be fixed.remove-axiom now takes a list, which most of the add-* functions returnsmemorise.clj has changed significantly; this allows
arbitrarily sized files to be created. There is no converter from the old
file format, but I will write one if it is needed.obo.clj has changed to using EDN, rather than a bespoke
properties file. As with memorise.clj there is no converter.protege-nrepl.clj namespace which hooks tawny into core Protege
data structures.This release is intended to be feature complete. New features will not be added for 1.0, although accidentally missing functionality may be added.
This version introduces a few breaking changes.
as-subclasses and as-disjoint macros are now functions, making them
lexically scoped.This version introduces a few breaking changes.
isubclasses,isuperclasses have been changed to direct-subclasses,
direct-superclasses in tawny.owl. This was to avoid a nameclash with
tawny.reasoner*reasoner-progress-monitor* is now an atom. While this enables the use of
reset!, it means an atom must be used in binding. Samples are given in
the documentationCan you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |