FaCT++ is a well-optimized open-source reasoner for SROIQ(D) description logic with simple datatypes (OWL 2), written in C++. FaCT++ was created in 2003-2015 by Dmitry Tsarkov and Ian Horrocks in the University of Manchester, UK.
The pyfactxx
links the FaCT++ reasoner to the Python's RDFLib package. The code is based on the works of Artur Wroblewski: factpp and coras interfaces.
The FaCT++ implements the atomic decomposition algorithms (i.e. represents the ontologies as terse directed acyclic graphs). A tableaux decision procedure is applied for SROIQ(D) together with the set of optimisation heuristics, such as:
- lexical normalisation and simplification,
- synonym replacement,
- rewriting absorption,
- told cycle elimination,
- dependency-directed backtracking (backjumping),
- boolean constant propagation,
- semantic branching,
- ordering heuristics,
- model merging,
- completely defined concepts,
- clustering for wide and shallow taxonomies.
To tackle the OWL 2 computational complexity (double exponential in time for the worst case), the FaCT++ presents persistent and incremental reasoning. In the persistent mode, FaCT++ saves the inferred information together with its internal state into a file, which can be reloaded later with much less computational effort than reasoning would require. In the incremental mode, FaCT++ determines which parts of the precomputed inferences may be affected by an incoming change and only recomputes a subset of the inferences.
The mentioned above allows to achieve a very good performance on such known ontologies as FHKB, SNOMED CT, and Thesaurus.
Apart of our present work, the FaCT++ supports Java OWL-API, Lisp API, and DIG interface. It can also be used in C. There is also a work of Levin and Cowell on C++ usage (unmaintained).
The pyfactxx
presents the following updates to FaCT++:
- drastically improved individuals support (
precacheIndividuals
) - unified access point allowing arbitrary SPARQL queries
- exposing all the required C++ interfaces to RDFLib via the
coras
interface
pip install pyfactxx
NB the PyPI releases plus wheels are done via GitHub action.
See examples
folder. In essense:
from pyfactxx import coras
crs = coras.Coras()
crs.load(ontology_file, format='turtle')
crs.parse()
crs.realise()
result = crs.query('SELECT ?a ?b ?c WHERE {?a ?b ?c}')
- Artur Wroblewski
- Evgeny Blokhin
- Andrey Sobolev
- Ivan Rygaev
- Dmitry Tsarkov
- Ian Horrocks
- Ivan Rygaev
- Kernel reasoner code: GNU LGPL 2.1
- Coras Python interface: GNU GPL 3.0