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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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__()

Initialize the interface.

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

_run(*owl_files, command, output_file=None, return_graph=True) staticmethod

Run the FaCT++ reasoner using a java command.

Parameters:

Name Type Description Default
*owl_files str

Path to the owl files to load.

()
command str

Either --run-reasoner or --merge-only

required
output_file str

Where the output should be stored. Defaults to None.

None
return_graph bool

Whether the result should be parsed and returned. Defaults to True.

True

Returns:

Type Description
rdflib.Graph

The reasoned result.

Source code in ontopy/factpluspluswrapper/owlapi_interface.py
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
@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

merge_files(*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
46
47
48
49
50
51
52
53
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(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
26
27
28
29
30
31
32
33
34
35
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(*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
37
38
39
40
41
42
43
44
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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,
    )
Back to top