ontocore-reasoner 0.14.0

OntoLogos-backed reasoner facade for OntoCore (ontocore-*)
Documentation
use crate::adapter::{ReasonerAdapter, ReasonerId, ReasonerProfile};
use crate::error::{ReasonerError, Result};
use crate::explain::explain_unsatisfiable_rdfs;
use crate::hierarchy::subclass_edges_from_ontology;
use crate::input::ReasonerInput;
use crate::result::{
    build_inferred_hierarchy, detect_unsatisfiable_classes, new_inferences, ClassificationResult,
    ExplanationRequest, ExplanationResult,
};
use ontologos_rl::rdfs::RdfsEngine;
use std::time::Instant;

pub struct RdfsAdapter;

impl ReasonerAdapter for RdfsAdapter {
    fn id(&self) -> ReasonerId {
        ReasonerId::Rdfs
    }

    fn profile(&self) -> ReasonerProfile {
        ReasonerProfile::Rdfs
    }

    fn classify(&self, input: &ReasonerInput) -> Result<ClassificationResult> {
        let started = Instant::now();
        let mut ontology = input.ontology.clone();
        let report = RdfsEngine::new()
            .materialize(&mut ontology)
            .map_err(|e| ReasonerError::Classify(e.to_string()))?;

        let iri_edges = subclass_edges_from_ontology(&ontology, &input.asserted_hierarchy);
        let unsatisfiable =
            detect_unsatisfiable_classes(&ontology).map_err(ReasonerError::Classify)?;
        let inferred =
            build_inferred_hierarchy(&iri_edges, &unsatisfiable, &input.asserted_hierarchy);
        let new_inferences = new_inferences(&input.asserted_hierarchy, &inferred.edges);

        Ok(ClassificationResult {
            profile_used: "rdfs".to_string(),
            consistent: unsatisfiable.is_empty(),
            unsatisfiable,
            inferred,
            new_inferences,
            warnings: Vec::new(),
            duration_ms: started.elapsed().as_millis() as u64,
            subsumption_count: iri_edges.len(),
            inferred_axiom_count: report.inferred_total(),
        })
    }

    fn explain(
        &self,
        input: &ReasonerInput,
        request: &ExplanationRequest,
    ) -> Result<ExplanationResult> {
        explain_unsatisfiable_rdfs(&input.ontology, &request.class_iri)
    }
}