def get_or_create_node(self, graph: BELGraph, node: BaseEntity) -> Optional[Node]:
        """Create an entry and object for given node if it does not exist."""
        sha512 = node.as_sha512()
        if sha512 in self.object_cache_node:
            return self.object_cache_node[sha512]

        node_model = self.get_node_by_hash(sha512)

        if node_model is not None:
            self.object_cache_node[sha512] = node_model
            return node_model

        node_model = Node._start_from_base_entity(node)

        namespace = node.get(NAMESPACE)
        if namespace is None:
            pass

        elif namespace in graph.namespace_url:
            url = graph.namespace_url[namespace]
            name = node[NAME]
            entry = self.get_namespace_entry(url, name)

            if entry is None:
                log.debug('skipping node with identifier %s: %s', url, name)
                return

            self.session.add(entry)
            node_model.namespace_entry = entry

        elif namespace in graph.namespace_pattern:
            name = node[NAME]
            pattern = graph.namespace_pattern[namespace]
            entry = self.get_or_create_regex_namespace_entry(namespace, pattern, name)

            self.session.add(entry)
            node_model.namespace_entry = entry

        else:
            log.warning("No reference in BELGraph for namespace: {}".format(node[NAMESPACE]))
            return

        if VARIANTS in node or FUSION in node:
            node_model.is_variant = True
            node_model.has_fusion = FUSION in node

            modifications = self.get_or_create_modification(graph, node)

            if modifications is None:
                log.warning('could not create %s because had an uncachable modification', node.as_bel())
                return

            node_model.modifications = modifications

        self.session.add(node_model)
        self.object_cache_node[sha512] = node_model
        return node_model
def get_or_create_node ( self , graph : BELGraph , node : BaseEntity ) -> Optional [ Node ] : sha512 = node . as_sha512 ( ) if sha512 in self . object_cache_node : return self . object_cache_node [ sha512 ] node_model = self . get_node_by_hash ( sha512 ) if node_model is not None : self . object_cache_node [ sha512 ] = node_model return node_model node_model = Node . _start_from_base_entity ( node ) namespace = node . get ( NAMESPACE ) if namespace is None : pass elif namespace in graph . namespace_url : url = graph . namespace_url [ namespace ] name = node [ NAME ] entry = self . get_namespace_entry ( url , name ) if entry is None : log . debug ( 'skipping node with identifier %s: %s' , url , name ) return self . session . add ( entry ) node_model . namespace_entry = entry elif namespace in graph . namespace_pattern : name = node [ NAME ] pattern = graph . namespace_pattern [ namespace ] entry = self . get_or_create_regex_namespace_entry ( namespace , pattern , name ) self . session . add ( entry ) node_model . namespace_entry = entry else : log . warning ( "No reference in BELGraph for namespace: {}" . format ( node [ NAMESPACE ] ) ) return if VARIANTS in node or FUSION in node : node_model . is_variant = True node_model . has_fusion = FUSION in node modifications = self . get_or_create_modification ( graph , node ) if modifications is None : log . warning ( 'could not create %s because had an uncachable modification' , node . as_bel ( ) ) return node_model . modifications = modifications self . session . add ( node_model ) self . object_cache_node [ sha512 ] = node_model return node_model
Create an entry and object for given node if it does not exist.