I've recently been part of taking a closer look at SOFA (I haven't been doing most of the work though). Initially, it looks too good to be true, OWL in 5 classes. Surely it can't be that easy? It's basically an object model for OWL and RDFS. It includes: Concept, Ontology, Relation, Restriction and Thing. A Concept represents a classification item (class) and a Thing represents a knowledge item (instance). Relations are transitive, symmetric or an inversion. Restrictions are by cardinality or value. It can read and write both OWL and RDFS.
* Provides inferencing.
* Support for Java types. This includes mapping to 10 Java datatypes, like String to xsd:string. Other Java objects are base64 encoded - which is a strange feature but kind of cool.
* Events and event listeners (when Things are added, removed or modified).
* Uses URI objects.
* Supports checked exceptions and throws them when you do something wrong.
* Interfaces all the way through.
* DOTWriter which represents an ontology as a directed graph described by Graphviz DOT language syntax.
* Unit tests.
Because it is so small it should be fairly easy to integrate into other stores and APIs.
More information is available here.