77from multinet .api .models import Network , Table , Upload
88
99from .common import ProcessUploadTask
10+ from .exceptions import DataFormatError
1011
1112logger = get_task_logger (__name__ )
1213
1314
1415def d3_node_to_arango_doc (node : Dict ) -> Dict :
1516 new_node = dict (node )
1617
17- # Return None if necessary
18- node_id = new_node .pop ('id' , None )
18+ # Check if we have a field we can use for key. _key is preferred, then id
19+ if '_key' in new_node .keys ():
20+ node_id = new_node .get ('_key' , None )
21+ elif 'id' in new_node .keys ():
22+ node_id = new_node .pop ('id' , None )
23+ else :
24+ node_id = None
25+
1926 if node_id is None :
2027 return None
2128
22- # Assign and return
2329 new_node ['_key' ] = str (node_id )
2430 return new_node
2531
2632
2733def d3_link_to_arango_doc (link : Dict , node_table_name : str ) -> Dict :
2834 new_link = dict (link )
2935
30- # Return None if necessary
31- source = new_link .pop ('source' , None )
32- target = new_link .pop ('target' , None )
36+ # Check if we have a field we can use for from and to. _from and _to are preferred
37+ # then source and target
38+ if '_to' in new_link .keys () and '_from' in new_link .keys ():
39+ source = new_link .get ('_to' , None ).split ('/' )[- 1 ]
40+ target = new_link .get ('_from' , None ).split ('/' )[- 1 ]
41+ elif 'source' in new_link .keys () and 'target' in new_link .keys ():
42+ source = new_link .pop ('source' , None )
43+ target = new_link .pop ('target' , None )
44+ else :
45+ source = None
46+ target = None
47+
3348 if source is None or target is None :
3449 return None
3550
@@ -60,9 +75,19 @@ def process_d3_json(
6075 for node in (d3_node_to_arango_doc (node ) for node in d3_dict ['nodes' ])
6176 if node is not None
6277 ]
63- d3_dict ['links' ] = [
78+
79+ if 'links' in d3_dict .keys ():
80+ link_property_name = 'links'
81+ elif 'edges' in d3_dict .keys ():
82+ link_property_name = 'edges'
83+ else :
84+ raise DataFormatError ("JSON network file missing 'links' or 'edges' property" )
85+
86+ d3_dict [link_property_name ] = [
6487 link
65- for link in (d3_link_to_arango_doc (link , node_table_name ) for link in d3_dict ['links' ])
88+ for link in (
89+ d3_link_to_arango_doc (link , node_table_name ) for link in d3_dict [link_property_name ]
90+ )
6691 if link is not None
6792 ]
6893
@@ -80,7 +105,7 @@ def process_d3_json(
80105
81106 # Insert rows
82107 node_table .put_rows (d3_dict ['nodes' ])
83- edge_table .put_rows (d3_dict ['links' ])
108+ edge_table .put_rows (d3_dict [link_property_name ])
84109
85110 # Create network
86111 Network .create_with_edge_definition (
0 commit comments