Adds an edge between the nodes with the specified indices to the graph.

        Arguments:
            source_index (int): The index of the source node of the edge to add.
            target_index (int): The index of the target node of the edge to add.
            weight (float): The weight of the edge.
            save_to_cache (bool): Whether the edge should be saved to the local database. This
                                  argument is necessary (and `False`) when we load edges from
                                  the local cache.

def add_edge_by_index(self, source_index: int, target_index: int,
                          weight: float, save_to_cache: bool = True) -> None:
        """
        Adds an edge between the nodes with the specified indices to the graph.

        Arguments:
            source_index (int): The index of the source node of the edge to add.
            target_index (int): The index of the target node of the edge to add.
            weight (float): The weight of the edge.
            save_to_cache (bool): Whether the edge should be saved to the local database. This
                                  argument is necessary (and `False`) when we load edges from
                                  the local cache.
        """
        source: Node = self._nodes.get_node(source_index)
        target: Node = self._nodes.get_node(target_index)
        if source is None or target is None:
            return

        self.add_edge(
            source=source,
            target=target,
            weight=weight,
            save_to_cache=save_to_cache
        )