ontocore-reasoner 0.10.0

OntoLogos-backed reasoner facade for OntoCore (ontocore-*)
Documentation
use ontocore_catalog::ClassHierarchy;
use ontologos_core::{EntityKind, Ontology};

pub fn subclass_edges_from_ontology(
    ontology: &Ontology,
    asserted: &ClassHierarchy,
) -> Vec<(String, String)> {
    let asserted_set: std::collections::BTreeSet<(String, String)> =
        asserted.edges.iter().map(|e| (e.child.clone(), e.parent.clone())).collect();

    let mut edges = Vec::new();
    for (id, entity) in ontology.entities().iter() {
        if entity.kind != EntityKind::Class {
            continue;
        }
        let child = match ontology.resolve_iri(entity.iri) {
            Ok(s) => s.to_string(),
            Err(_) => continue,
        };
        for &parent_id in ontology.direct_superclasses(id) {
            let parent_entity = match ontology.entity(parent_id) {
                Ok(e) => e,
                Err(_) => continue,
            };
            let parent = match ontology.resolve_iri(parent_entity.iri) {
                Ok(s) => s.to_string(),
                Err(_) => continue,
            };
            if !asserted_set.contains(&(child.clone(), parent.clone())) {
                edges.push((child.clone(), parent));
            }
        }
    }
    edges
}