diff --git a/nxontology/imports.py b/nxontology/imports.py index 5820a75..43ddf56 100644 --- a/nxontology/imports.py +++ b/nxontology/imports.py @@ -163,6 +163,7 @@ def multidigraph_to_digraph( """ logging.info(f"Received MultiDiGraph with {graph.number_of_edges():,} edges.") if rel_types is not None: + graph = graph.copy() graph.remove_edges_from( [ (u, v, key) @@ -178,7 +179,14 @@ def multidigraph_to_digraph( digraph = nx.DiGraph(graph) if reduce: n_edges_before = digraph.number_of_edges() - digraph = nx.transitive_reduction(digraph) + no_data_digraph = nx.transitive_reduction(digraph) + # restore data https://github.com/networkx/networkx/issues/3392 + no_data_digraph.add_nodes_from(digraph.nodes.items()) + no_data_digraph.add_edges_from( + (u, v, digraph[u][v]) for (u, v) in no_data_digraph.edges() + ) + no_data_digraph.update(digraph.graph) + digraph = no_data_digraph logging.info( f"Reduced DiGraph by removing {n_edges_before - digraph.number_of_edges():,} redundant edges." ) diff --git a/nxontology/tests/imports_test.py b/nxontology/tests/imports_test.py index ba007d6..e7e4f34 100644 --- a/nxontology/tests/imports_test.py +++ b/nxontology/tests/imports_test.py @@ -69,18 +69,24 @@ def test_multigraph_to_digraph(): mdg.add_edge("a", "b", key="rel_type 1") mdg.add_edge("a", "b", key="rel_type 2") mdg.add_edge("b", "c", key="rel_type 1") + mdg.nodes["a"]["attribute"] = "preserve me" dg = multidigraph_to_digraph(mdg) assert dg.number_of_nodes() == 3 assert dg.number_of_edges() == 2 assert dg["b"]["a"]["rel_types"] == ["rel_type 1", "rel_type 2"] assert dg["c"]["b"]["rel_types"] == ["rel_type 1"] + # make sure node data is preserved + # https://github.com/networkx/networkx/issues/3392 + assert dg.nodes["a"]["attribute"] == "preserve me" dg = multidigraph_to_digraph(mdg, reverse=False) assert dg.has_edge("a", "b") assert not dg.has_edge("b", "a") + assert dg.nodes["a"]["attribute"] == "preserve me" dg = multidigraph_to_digraph(mdg, rel_types=["rel_type 2"]) assert dg.number_of_nodes() == 3 assert dg.number_of_edges() == 1 assert dg.has_edge("b", "a") + assert dg.nodes["a"]["attribute"] == "preserve me" def test_read_gene_ontology(): @@ -89,6 +95,9 @@ def test_read_gene_ontology(): nxo.graph.graph["source_url"] == "http://release.geneontology.org/2021-02-01/ontology/go-basic.json.gz" ) + bp_info = nxo.node_info("GO:0008150") + assert bp_info.label == "biological_process" + assert bp_info.data["namespace"] == "biological_process" assert "regulates" in nxo.graph["GO:0006310"]["GO:0000018"]["rel_types"] # Transitive reduction should remove this edge # from "defense response to insect" to "negative regulation of defense response to insect"