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-2
defno
, defnb
and defnb2
defn*
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-thing
tawny.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 is a website building & hosting documentation for Clojure/Script libraries
× close