34
34
check_list_for_errors ,
35
35
doc_insert ,
36
36
doc_update ,
37
+ edge_get ,
38
+ edge_link ,
37
39
get_arangodb_graph ,
38
40
get_node_id ,
39
41
get_node_type_and_id ,
@@ -144,7 +146,6 @@ def process_edge_attr_dict_value(parent: EdgeAttrDict, key: str, value: Any) ->
144
146
return value
145
147
146
148
edge_attr_dict = parent .edge_attr_dict_factory ()
147
- edge_attr_dict .root = parent .root or parent
148
149
edge_attr_dict .edge_id = parent .edge_id
149
150
edge_attr_dict .parent_keys = parent .parent_keys + [key ]
150
151
edge_attr_dict .data = build_edge_attr_dict_data (edge_attr_dict , value )
@@ -183,8 +184,6 @@ def __init__(
183
184
# EdgeAttrDict may be a child of another EdgeAttrDict
184
185
# e.g G._adj['node/1']['node/2']['object']['foo'] = 'bar'
185
186
# In this case, **parent_keys** would be ['object']
186
- # and **root** would be G._adj['node/1']['node/2']
187
- self .root : EdgeAttrDict | None = None
188
187
self .parent_keys : list [str ] = []
189
188
self .edge_attr_dict_factory = edge_attr_dict_factory (self .db , self .graph )
190
189
@@ -236,8 +235,7 @@ def __setitem__(self, key: str, value: Any) -> None:
236
235
edge_attr_dict_value = process_edge_attr_dict_value (self , key , value )
237
236
update_dict = get_update_dict (self .parent_keys , {key : value })
238
237
self .data [key ] = edge_attr_dict_value
239
- root_data = self .root .data if self .root else self .data
240
- root_data ["_rev" ] = doc_update (self .db , self .edge_id , update_dict )
238
+ doc_update (self .db , self .edge_id , update_dict )
241
239
242
240
@key_is_string
243
241
@key_is_not_reserved
@@ -247,8 +245,7 @@ def __delitem__(self, key: str) -> None:
247
245
assert self .edge_id
248
246
self .data .pop (key , None )
249
247
update_dict = get_update_dict (self .parent_keys , {key : None })
250
- root_data = self .root .data if self .root else self .data
251
- root_data ["_rev" ] = doc_update (self .db , self .edge_id , update_dict )
248
+ doc_update (self .db , self .edge_id , update_dict )
252
249
253
250
@keys_are_strings
254
251
@keys_are_not_reserved
@@ -265,8 +262,7 @@ def update(self, attrs: Any) -> None:
265
262
return
266
263
267
264
update_dict = get_update_dict (self .parent_keys , attrs )
268
- root_data = self .root .data if self .root else self .data
269
- root_data ["_rev" ] = doc_update (self .db , self .edge_id , update_dict )
265
+ doc_update (self .db , self .edge_id , update_dict )
270
266
271
267
272
268
class EdgeKeyDict (UserDict [str , EdgeAttrDict ]):
@@ -457,7 +453,7 @@ def __contains__(self, key: str | int) -> bool:
457
453
if self .FETCHED_ALL_IDS :
458
454
return False
459
455
460
- edge = self .graph . edge ( key )
456
+ edge = edge_get ( self .graph , key )
461
457
462
458
if edge is None :
463
459
logger .warning (f"Edge '{ key } ' does not exist in Graph." )
@@ -500,7 +496,7 @@ def __getitem__(self, key: str | int) -> EdgeAttrDict:
500
496
if key not in self .data and self .FETCHED_ALL_IDS :
501
497
raise KeyError (key )
502
498
503
- edge = self .graph . edge ( key )
499
+ edge = edge_get ( self .graph , key )
504
500
505
501
if edge is None :
506
502
raise KeyError (key )
@@ -546,8 +542,12 @@ def __setitem__(self, key: int, edge_attr_dict: EdgeAttrDict) -> None:
546
542
if not edge_type :
547
543
edge_type = self .default_edge_type
548
544
549
- edge = self .graph .link (
550
- edge_type , self .src_node_id , self .dst_node_id , edge_attr_dict .data
545
+ edge = edge_link (
546
+ self .graph ,
547
+ edge_type ,
548
+ self .src_node_id ,
549
+ self .dst_node_id ,
550
+ edge_attr_dict .data ,
551
551
)
552
552
553
553
edge_data : dict [str , Any ] = {
@@ -1032,12 +1032,17 @@ def __setitem__graph(
1032
1032
can_return_multiple = False ,
1033
1033
)
1034
1034
1035
- if edge_id :
1036
- edge = doc_insert (self .db , edge_type , edge_id , edge_attr_dict .data )
1037
- else :
1038
- edge = self .graph .link (
1039
- edge_type , self .src_node_id , dst_node_id , edge_attr_dict .data
1035
+ edge = (
1036
+ doc_insert (self .db , edge_type , edge_id , edge_attr_dict .data )
1037
+ if edge_id
1038
+ else edge_link (
1039
+ self .graph ,
1040
+ edge_type ,
1041
+ self .src_node_id ,
1042
+ dst_node_id ,
1043
+ edge_attr_dict .data ,
1040
1044
)
1045
+ )
1041
1046
1042
1047
edge_data : dict [str , Any ] = {
1043
1048
** edge_attr_dict .data ,
@@ -1064,15 +1069,16 @@ def __setitem__multigraph(
1064
1069
assert list (edge_key_dict .data .keys ())[0 ] == "-1"
1065
1070
assert edge_key_dict .src_node_id is None
1066
1071
assert edge_key_dict .dst_node_id is None
1072
+ assert self .src_node_id is not None
1067
1073
1068
1074
edge_attr_dict = edge_key_dict .data ["-1" ]
1069
1075
1070
1076
edge_type = edge_attr_dict .data .pop (self .edge_type_key , None )
1071
1077
if edge_type is None :
1072
1078
edge_type = self .edge_type_func (self .src_node_type , dst_node_type )
1073
1079
1074
- edge = self . graph . link (
1075
- edge_type , self .src_node_id , dst_node_id , edge_attr_dict .data
1080
+ edge = edge_link (
1081
+ self . graph , edge_type , self .src_node_id , dst_node_id , edge_attr_dict .data
1076
1082
)
1077
1083
1078
1084
edge_data : dict [str , Any ] = {
@@ -1217,7 +1223,7 @@ def _fetch_all(self) -> None:
1217
1223
query = f"""
1218
1224
FOR v, e IN 1..1 { self .traversal_direction .name } @src_node_id
1219
1225
GRAPH @graph_name
1220
- RETURN e
1226
+ RETURN UNSET(e, '_rev')
1221
1227
"""
1222
1228
1223
1229
bind_vars = {"src_node_id" : self .src_node_id , "graph_name" : self .graph .name }
@@ -1550,14 +1556,20 @@ def __set_adj_elements(
1550
1556
def set_edge_graph (
1551
1557
src_node_id : str , dst_node_id : str , edge : dict [str , Any ]
1552
1558
) -> EdgeAttrDict :
1559
+ edge .pop ("_rev" , None )
1560
+
1553
1561
adjlist_inner_dict = self .data [src_node_id ]
1554
1562
1555
1563
edge_attr_dict : EdgeAttrDict
1556
1564
edge_attr_dict = adjlist_inner_dict ._create_edge_attr_dict (edge )
1557
1565
1558
- adjlist_inner_dict .data [dst_node_id ] = edge_attr_dict
1566
+ if dst_node_id not in adjlist_inner_dict .data :
1567
+ adjlist_inner_dict .data [dst_node_id ] = edge_attr_dict
1568
+ else :
1569
+ existing_edge_attr_dict = adjlist_inner_dict .data [dst_node_id ]
1570
+ existing_edge_attr_dict .data .update (edge_attr_dict .data )
1559
1571
1560
- return edge_attr_dict
1572
+ return adjlist_inner_dict . data [ dst_node_id ] # type: ignore # false positive
1561
1573
1562
1574
def set_edge_multigraph (
1563
1575
src_node_id : str , dst_node_id : str , edges : dict [int , dict [str , Any ]]
@@ -1571,8 +1583,16 @@ def set_edge_multigraph(
1571
1583
edge_key_dict .FETCHED_ALL_IDS = True
1572
1584
1573
1585
for edge in edges .values ():
1586
+ edge .pop ("_rev" , None )
1587
+
1588
+ edge_attr_dict : EdgeAttrDict
1574
1589
edge_attr_dict = adjlist_inner_dict ._create_edge_attr_dict (edge )
1575
- edge_key_dict .data [edge ["_id" ]] = edge_attr_dict
1590
+
1591
+ if edge ["_id" ] not in edge_key_dict .data :
1592
+ edge_key_dict .data [edge ["_id" ]] = edge_attr_dict
1593
+ else :
1594
+ existing_edge_attr_dict = edge_key_dict .data [edge ["_id" ]]
1595
+ existing_edge_attr_dict .data .update (edge_attr_dict .data )
1576
1596
1577
1597
adjlist_inner_dict .data [dst_node_id ] = edge_key_dict
1578
1598
@@ -1618,11 +1638,6 @@ def propagate_edge_directed_symmetric(
1618
1638
for src_node_id , inner_dict in edges_dict .items ():
1619
1639
for dst_node_id , edge_or_edges in inner_dict .items ():
1620
1640
1621
- if not self .is_directed :
1622
- if src_node_id in self .data :
1623
- if dst_node_id in self .data [src_node_id ].data :
1624
- continue # can skip due not directed
1625
-
1626
1641
self .__set_adj_inner_dict (self , src_node_id )
1627
1642
self .__set_adj_inner_dict (self , dst_node_id )
1628
1643
edge_attr_or_key_dict = set_edge_func ( # type: ignore[operator]
0 commit comments