Skip to content

owlapi_interface

Python interface to the FaCT++ Reasoner.

This module is copied from the SimPhoNy project.

Original author: Matthias Urban

OwlApiInterface

Interface to the FaCT++ reasoner via OWLAPI.

Source code in ontopy/factpluspluswrapper/owlapi_interface.py
class OwlApiInterface:
    """Interface to the FaCT++ reasoner via OWLAPI."""

    def __init__(self):
        """Initialize the interface."""

    def reason(self, graph):
        """Generate the inferred axioms for a given Graph.

        Args:
            graph (Graph): An rdflib graph to execute the reasoner on.

        """
        with tempfile.NamedTemporaryFile("wt") as tmpdir:
            graph.serialize(tmpdir.name, format="xml")
            return self._run(tmpdir.name, command="--run-reasoner")

    def reason_files(self, *owl_files):
        """Merge the given owl and generate the inferred axioms.

        Args:
            *owl_files (os.path): The owl files two merge.

        """
        return self._run(*owl_files, command="--run-reasoner")

    def merge_files(self, *owl_files):
        """Merge the given owl files and its import closure.

        Args:
            *owl_files (os.path): The owl files two merge.

        """
        return self._run(*owl_files, command="--merge-only")

    @staticmethod
    def _run(
        *owl_files, command, output_file=None, return_graph=True
    ) -> rdflib.Graph:
        """Run the FaCT++ reasoner using a java command.

        Args:
            *owl_files (str): Path to the owl files to load.
            command (str): Either --run-reasoner or --merge-only
            output_file (str, optional): Where the output should be stored.
                Defaults to None.
            return_graph (bool, optional): Whether the result should be parsed
                and returned. Defaults to True.

        Returns:
            The reasoned result.

        """
        java_base = os.path.abspath(
            os.path.join(os.path.dirname(__file__), "java")
        )
        cmd = (
            [
                "java",
                "-cp",
                java_base + "/lib/jars/*",
                "-Djava.library.path=" + java_base + "/lib/so",
                "org.simphony.OntologyLoader",
            ]
            + [command]
            + list(owl_files)
        )
        logger.info("Running Reasoner")
        logger.debug("Command %s", cmd)
        subprocess.run(cmd, check=True)  # nosec

        graph = None
        if return_graph:
            graph = rdflib.Graph()
            graph.parse(RESULT_FILE)
        if output_file:
            os.rename(RESULT_FILE, output_file)
        else:
            os.remove(RESULT_FILE)
        return graph

__init__(self) special

Initialize the interface.

Source code in ontopy/factpluspluswrapper/owlapi_interface.py
def __init__(self):
    """Initialize the interface."""

merge_files(self, *owl_files)

Merge the given owl files and its import closure.

Parameters:

Name Type Description Default
*owl_files os.path

The owl files two merge.

()
Source code in ontopy/factpluspluswrapper/owlapi_interface.py
def merge_files(self, *owl_files):
    """Merge the given owl files and its import closure.

    Args:
        *owl_files (os.path): The owl files two merge.

    """
    return self._run(*owl_files, command="--merge-only")

reason(self, graph)

Generate the inferred axioms for a given Graph.

Parameters:

Name Type Description Default
graph Graph

An rdflib graph to execute the reasoner on.

required
Source code in ontopy/factpluspluswrapper/owlapi_interface.py
def reason(self, graph):
    """Generate the inferred axioms for a given Graph.

    Args:
        graph (Graph): An rdflib graph to execute the reasoner on.

    """
    with tempfile.NamedTemporaryFile("wt") as tmpdir:
        graph.serialize(tmpdir.name, format="xml")
        return self._run(tmpdir.name, command="--run-reasoner")

reason_files(self, *owl_files)

Merge the given owl and generate the inferred axioms.

Parameters:

Name Type Description Default
*owl_files os.path

The owl files two merge.

()
Source code in ontopy/factpluspluswrapper/owlapi_interface.py
def reason_files(self, *owl_files):
    """Merge the given owl and generate the inferred axioms.

    Args:
        *owl_files (os.path): The owl files two merge.

    """
    return self._run(*owl_files, command="--run-reasoner")

reason_from_terminal()

Run the reasoner from terminal.

Source code in ontopy/factpluspluswrapper/owlapi_interface.py
def reason_from_terminal():
    """Run the reasoner from terminal."""
    parser = argparse.ArgumentParser(
        description="Run the FaCT++ reasoner on the given OWL file. "
        "Catalog files are used to load the import closure. "
        "Then the reasoner is executed and the inferred triples are merged "
        "with the asserted ones. If multiple OWL files are given, they are "
        "merged beforehand"
    )
    parser.add_argument(
        "owl_file", nargs="+", help="OWL file(s) to run the reasoner on."
    )
    parser.add_argument("output_file", help="Path to store inferred axioms to.")

    args = parser.parse_args()
    OwlApiInterface()._run(  # pylint: disable=protected-access
        *args.owl_file,
        command="--run-reasoner",
        return_graph=False,
        output_file=args.output_file,
    )