Skip to content

Visitor traits for horned-owl with overloadable implementations

License

Notifications You must be signed in to change notification settings

fastobo/horned-visit

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

horned-visit Star me

Visitor traits for horned-owl with overloadable implementations.

Actions Codecov License Source Crate Documentation Changelog GitHub issues

🗺️ Overview

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.

🔌 Usage

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.

💡 Example

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));

💭 Feedback

⚠️ Issue Tracker

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.

📋 Changelog

This project adheres to Semantic Versioning and provides a changelog in the Keep a Changelog format.

📜 License

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.