Introduction ============ Owlready2 is a package for manipulating OWL 2.0 ontologies in Python. It can load, modify, save ontologies, and it supports reasoning via HermiT (included). Owlready allows a transparent access to OWL ontologies. Owlready2 can: - Import ontologies in RDF/XML, OWL/XML or NTriples format. - Manipulates ontology classes, instances and annotations as if they were Python objects. - Add Python methods to ontology classes. - Re-classify instances automatically, using the HermiT reasoner. - Import medical terminologies from UMLS (see :doc:`pymedtermino2`). If you need to "convert" formulas between Protégé, Owlready2 and/or Description Logics, the following cheat sheet may be of interest: `The great table of Description Logics and formal ontology notations `_ Short example: What can I do with Owlready? ------------------------------------------- Load an ontology from a local repository, or from Internet: :: >>> from owlready2 import * >>> onto_path.append("/path/to/your/local/ontology/repository") >>> onto = get_ontology("http://www.lesfleursdunormal.fr/static/_downloads/pizza_onto.owl") >>> onto.load() Create new classes in the ontology, possibly mixing OWL constructs and Python methods: :: >>> class NonVegetarianPizza(onto.Pizza): ... equivalent_to = [ ... onto.Pizza ... & ( onto.has_topping.some(onto.MeatTopping) ... | onto.has_topping.some(onto.FishTopping) ... ) ] ... def eat(self): print("Beurk! I'm vegetarian!") Access the classes of the ontology, and create new instances / individuals: :: >>> onto.Pizza pizza_onto.Pizza >>> test_pizza = onto.Pizza("test_pizza_owl_identifier") >>> test_pizza.has_topping = [ onto.CheeseTopping(), ... onto.TomatoTopping() ] In Owlready2, almost any lists can be modified *in place*, for example by appending/removing items from lists. Owlready2 automatically updates the RDF quadstore. :: >>> test_pizza.has_topping.append(onto.MeatTopping()) Perform reasoning, and classify instances and classes: :: >>> test_pizza.__class__ onto.Pizza >>> # Execute HermiT and reparent instances and classes >>> sync_reasoner() >>> test_pizza.__class__ onto.NonVegetarianPizza >>> test_pizza.eat() Beurk! I'm vegetarian ! Export to OWL file: :: >>> onto.save() Load Gene Ontology (GO), a large ontology (~ 170 Mb, can take a moment!): :: >>> go = get_ontology("http://purl.obolibrary.org/obo/go.owl").load() Access entities with an IRI that does not start with the ontology's IRI, by creating a Namespace: :: >>> obo = get_namespace("http://purl.obolibrary.org/obo/") >>> print(obo.GO_0000001.label) ['mitochondrion inheritance'] Architecture ------------ Owlready2 maintains a RDF quadstore in an optimized database (SQLite3), either in memory or on the disk (see :doc:`world`). It provides a high-level access to the Classes and the objects in the ontology (aka. ontology-oriented programming). Classes and Invididuals are loaded dynamically from the quadstore as needed, cached in memory and destroyed when no longer needed.