Visitor traits for horned-owl
with overloadable implementations.
This library provides visitor traits for the horned-owl
object model, which can be used to easily implement algorithms to query or
edit an ontology.
Add the latest versions of horned-owl
and horned-visit
to the
[dependencies]
sections of your Cargo.toml
manifest:
[dependencies]
horned-owl = "0.11.0"
horned-visit = "0.1.0"
Then use the horned_visit::Visit
or horned_visit::VisitMut
traits to
implement an algorithm. The horned_visit::visit
and horned_visit::visit_mut
modules contain default methods implementations.
OWL2 does not require all entities to be declared (see the
specification),
but it can be required by convention to help catching typos. Here is how
an algorithm could be implemented with horned-visit
that ensures that
all the IRI referencing OWL2 classes are declared in an ontology document:
extern crate horned_owl;
extern crate horned_visit;
use std::collections::HashSet;
use std::fs::File;
use std::io::BufReader;
use horned_owl::model::*;
use horned_visit::Visit;
#[derive(Default, Debug)]
struct ClassDeclarationChecker<'ast> {
declared: HashSet<&'ast IRI>,
used: HashSet<&'ast IRI>
}
impl<'ast> Visit<'ast> for ClassDeclarationChecker<'ast> {
fn visit_declare_class(&mut self, declare_class: &'ast DeclareClass) {
self.declared.insert(&declare_class.0.0);
horned_visit::visit::visit_declare_class(self, declare_class);
}
fn visit_class(&mut self, class: &'ast Class) {
self.used.insert(&class.0);
}
}
pub fn classes_well_declared(ontology: &horned_owl::ontology::set::SetOntology) -> bool {
let mut checker = ClassDeclarationChecker::default();
ontology.iter().for_each(|aa| checker.visit_annotated_axiom(aa));
checker.used.is_subset(&checker.declared)
}
let mut f = File::open("tests/data/bfo.owl").map(BufReader::new).unwrap();
let ontology = horned_owl::io::rdf::reader::read(&mut f).unwrap().0.into();
assert!(classes_well_declared(&ontology));
Found a bug ? Have an enhancement request ? Head over to the GitHub issue tracker of the project if you need to report or ask something. If you are filling in on a bug, please include as much information as you can about the issue, and try to recreate the same bug in a simple, easily reproducible situation.
This project adheres to Semantic Versioning and provides a changelog in the Keep a Changelog format.
This library is provided under the open-source MIT license.
This project was developed by Martin Larralde during his PhD project at the European Molecular Biology Laboratory in the Zeller team.