Skip to content

Commit 6e7ee73

Browse files
committed
MetaGraph: metanode and metaedge getter methods
Merges #18 Add metanode and metaedge getters for convenience: - metagraph.get_metanode - metagraph.get_metaedge
1 parent 4786dae commit 6e7ee73

File tree

4 files changed

+52
-10
lines changed

4 files changed

+52
-10
lines changed

hetio/abbreviation.py

+3
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ def metaedges_from_metapath(abbreviation, standardize_by=None):
136136

137137

138138
def metaedge_id_from_abbreviation(metagraph, abbreviation):
139+
"""
140+
Return the metaedge_id corresponding to a metaedge abbreviation.
141+
"""
139142
source_abbrev, target_abbrev = regex.split('[a-z<>]+', abbreviation)
140143
edge_abbrev = regex.search('[a-z<>]+', abbreviation).group()
141144
abbrev_to_kind = {v: k for k, v in metagraph.kind_to_abbrev.items()}

hetio/hetnet.py

+32-5
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,36 @@ def __eq__(self, other):
204204
class MetaGraph(BaseGraph):
205205

206206
def __init__(self):
207-
""" """
208207
BaseGraph.__init__(self)
209208

209+
def get_metanode(self, metanode):
210+
"""
211+
Return the metanode specified by the input, which can be either a:
212+
- MetaNode (passthrough)
213+
- metanode kind (str)
214+
- metanode abbreviation (str)
215+
"""
216+
if isinstance(metanode, MetaNode):
217+
return metanode
218+
if metanode in self.node_dict:
219+
return self.get_node(metanode)
220+
# Assume metanode must be an abbreviation
221+
return self.get_node(self.abbrev_to_kind[metanode])
222+
223+
def get_metaedge(self, metaedge):
224+
"""
225+
Return the metaedge specified by the input, which can be either a:
226+
- MetaEdge (passthrough)
227+
- metaedge_id (tuple)
228+
- metaedge abbreviation
229+
"""
230+
if isinstance(metaedge, MetaEdge):
231+
return metaedge
232+
if isinstance(metaedge, tuple):
233+
return self.get_edge(metaedge)
234+
metaedge_id = hetio.abbreviation.metaedge_id_from_abbreviation(self, metaedge)
235+
return self.get_edge(metaedge_id)
236+
210237
@staticmethod
211238
def from_edge_tuples(metaedge_tuples, kind_to_abbrev=None):
212239
"""Create a new metagraph defined by its edges."""
@@ -231,6 +258,7 @@ def from_edge_tuples(metaedge_tuples, kind_to_abbrev=None):
231258
def set_abbreviations(self, kind_to_abbrev):
232259
"""Add abbreviations as an attribute for metanodes and metaedges"""
233260
self.kind_to_abbrev = kind_to_abbrev
261+
self.abbrev_to_kind = {v: k for k, v in kind_to_abbrev.items()}
234262
for kind, metanode in self.node_dict.items():
235263
metanode.abbrev = kind_to_abbrev[kind]
236264
for metaedge in self.edge_dict.values():
@@ -281,10 +309,9 @@ def extract_metapaths(self, source, target=None, max_length=4):
281309
the metagraph from source to target. If target is None (default), then
282310
metapaths to any target node are returned.
283311
"""
284-
if not isinstance(source, MetaNode):
285-
source = self.node_dict[source]
286-
if target and not isinstance(target, MetaNode):
287-
target = self.node_dict[target]
312+
source = self.get_metanode(source)
313+
if target:
314+
target = self.get_metanode(target)
288315

289316
assert max_length >= 0
290317
if max_length == 0:

hetio/matrix.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def metaedge_to_adjacency_matrix(
2929
Parameters
3030
==========
3131
graph : hetio.hetnet.graph
32-
metaedge : hetio.hetnet.MetaEdge
32+
metaedge : hetio.hetnet.MetaEdge or an alternative metaedge specification
3333
dtype : type
3434
dense_threshold : float (0 ≤ dense_threshold ≤ 1)
3535
minimum proportion of nonzero values at which to output a dense matrix.
@@ -41,9 +41,7 @@ def metaedge_to_adjacency_matrix(
4141
column_names : list
4242
matrix : numpy.ndarray or scipy.sparse
4343
"""
44-
if not isinstance(metaedge, hetio.hetnet.MetaEdge):
45-
# metaedge is an abbreviation
46-
metaedge = graph.metagraph.metapath_from_abbrev(metaedge)[0]
44+
metaedge = graph.metagraph.get_metaedge(metaedge)
4745
source_nodes = list(get_node_to_position(graph, metaedge.source))
4846
target_node_to_position = get_node_to_position(graph, metaedge.target)
4947
shape = len(source_nodes), len(target_node_to_position)

test/graph_test.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,27 @@ def test_disase_gene_example():
104104
"""
105105
Recreate hetnet from https://doi.org/10.1371/journal.pcbi.1004259.g002.
106106
"""
107+
metaedge_id_GaD = 'Gene', 'Disease', 'association', 'both'
107108
metaedge_tuples = [
108-
('Gene', 'Disease', 'association', 'both'),
109+
metaedge_id_GaD,
109110
('Gene', 'Tissue', 'expression', 'both'),
110111
('Disease', 'Tissue', 'localization', 'both'),
111112
('Gene', 'Gene', 'interaction', 'both'),
112113
]
113114
metagraph = hetio.hetnet.MetaGraph.from_edge_tuples(metaedge_tuples)
115+
116+
# Test metagraph getter methods
117+
gene_metanode = metagraph.node_dict['Gene']
118+
assert metagraph.get_metanode(gene_metanode) == gene_metanode
119+
assert metagraph.get_metanode('Gene') == gene_metanode
120+
assert metagraph.get_metanode('G') == gene_metanode
121+
metaedge_GaD = metagraph.get_edge(metaedge_id_GaD)
122+
assert metagraph.get_metaedge(metaedge_GaD) == metaedge_GaD
123+
assert metaedge_id_GaD == metaedge_GaD.get_id()
124+
assert metagraph.get_metaedge(metaedge_id_GaD) == metaedge_GaD
125+
assert metagraph.get_metaedge('GaD') == metaedge_GaD
126+
127+
# Create graph
114128
graph = hetio.hetnet.Graph(metagraph)
115129
nodes = dict()
116130

0 commit comments

Comments
 (0)