Source code for mowl.base_models.graph_model

from mowl.base_models.model import Model
from mowl.projection.base import ProjectionModel
from mowl.projection import Edge
from mowl.walking import WalkingModel
import mowl.error.messages as msg
import logging
logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
logger.addHandler(handler)
logger.setLevel(logging.INFO)


[docs] class GraphModel(Model): """ Abstract class for graph embedding methods. """ def __init__(self, *args, **kwargs): super(GraphModel, self).__init__(*args, **kwargs) self._edges = None self._graph_node_to_id = None self._graph_relation_to_id = None self._projector = None def _load_edges(self): if self.projector is None: raise ValueError(msg.GRAPH_MODEL_PROJECTOR_NOT_SET) all_classes = set(self.dataset.classes.as_str) self._edges = self.projector.project(self.dataset.ontology) nodes, relations = Edge.get_entities_and_relations(self._edges) nodes = set(nodes) missing_classes = all_classes - nodes logger.warning(f"There are {len(missing_classes)} classes not found in the graph. They might be ignored in the projection or they might be in the validation/testing set but not in the training set.") nodes = nodes.union(missing_classes) nodes = list(set(nodes)) relations = list(set(relations)) nodes.sort() relations.sort() self._graph_node_to_id = {node: i for i, node in enumerate(nodes)} self._graph_relation_to_id = {relation: i for i, relation in enumerate(relations)} @property def edges(self): """ Returns the edges of the graph as a list of :class:`mowl.projection.edge.Edge` objects. :rtype: list of :class:`Edge <mowl.projection.edge.Edge>` objects """ if self._edges is not None: return self._edges self._load_edges() return self._edges @property def graph_node_to_id(self): """ Returns a dictionary that maps graph nodes to ids. :rtype: dict """ if self._graph_node_to_id is not None: return self._graph_node_to_id self._load_edges() return self._graph_node_to_id @property def graph_relation_to_id(self): """ Returns a dictionary that maps graph relations (edge labels) to ids. :rtype: dict """ if self._graph_relation_to_id is not None: return self._graph_relation_to_id self._load_edges() return self._graph_relation_to_id @property def projector(self): """ Returns the projector of the graph model. :rtype: :class:`ProjectionModel <mowl.projection.base.ProjectionModel>` object """ return self._projector
[docs] def set_projector(self, projector): """ Sets the projector of the graph model. :param projector: the projector to be set :type projector: :class:`Projection <mowl.projection.base.ProjectionModel>` object """ if not isinstance(projector, ProjectionModel): raise TypeError("Parameter 'projector' must be a mowl.projection.Projector object") self._projector = projector
[docs] class RandomWalkModel(GraphModel): """ Base class for graph embedding methods that use random walks. """ def __init__(self, *args, **kwargs): super(RandomWalkModel, self).__init__(*args, **kwargs) self._walker = None @property def walker(self): """ Returns the walker object of the random walk model. :rtype: :class:`WalkingModel <mowl.walking.base.WalkingModel>` object """ return self._walker
[docs] def set_walker(self, walker): """ Sets the walker object of the random walk model. :param walker: the walker to be set :type walker: :class:`WalkingModel <mowl.walking.walking.WalkingModel>` object """ if not isinstance(walker, WalkingModel): raise TypeError("Parameter 'walker' must be a mowl.walking.WalkingModel object") self._walker = walker
[docs] def train(self): raise NotImplementedError
[docs] class KGEModel(GraphModel): """ Base class for graph embedding methods that use knowledge graph embedding methods. """ def __init__(self, *args, **kwargs): super(KGEModel, self).__init__(*args, **kwargs) self._kge_method = None @property def kge_method(self): """ Returns the knowledge graph embedding method of the KGE model. :rtype: Defined in child classes """ if self._kge_method is None: raise AttributeError(msg.KGE_METHOD_NOT_SET) return self._kge_method
[docs] def set_kge_method(self, kge_method): """ Sets the knowledge graph embedding method of the KGE model. :param kge_method: the kge method to be set :type kge_method: Defined in child classes """ raise NotImplementedError