31
31
32
32
from collections .abc import Mapping
33
33
34
+ from ..meta import deprecated
35
+
34
36
35
37
class Graph :
36
38
""" Local, self-contained graph object that acts as a container for
@@ -71,35 +73,61 @@ class Hydrator:
71
73
def __init__ (self , graph ):
72
74
self .graph = graph
73
75
74
- def hydrate_node (self , n_id , n_labels = None , properties = None ):
76
+ def hydrate_node (self , id_ , labels = None ,
77
+ properties = None , element_id = None ):
75
78
assert isinstance (self .graph , Graph )
79
+ # backwards compatibility with Neo4j < 5.0
80
+ if element_id is None :
81
+ element_id = str (id_ )
82
+
76
83
try :
77
- inst = self .graph ._nodes [n_id ]
84
+ inst = self .graph ._nodes [element_id ]
78
85
except KeyError :
79
- inst = self .graph ._nodes [n_id ] = Node (self .graph , n_id , n_labels , properties )
86
+ inst = self .graph ._nodes [element_id ] = Node (
87
+ self .graph , element_id , id_ , labels , properties
88
+ )
80
89
else :
81
90
# If we have already hydrated this node as the endpoint of
82
91
# a relationship, it won't have any labels or properties.
83
92
# Therefore, we need to add the ones we have here.
84
- if n_labels :
85
- inst ._labels = inst ._labels .union (n_labels ) # frozen_set
93
+ if labels :
94
+ inst ._labels = inst ._labels .union (labels ) # frozen_set
86
95
if properties :
87
96
inst ._properties .update (properties )
88
97
return inst
89
98
90
- def hydrate_relationship (self , r_id , n0_id , n1_id , r_type , properties = None ):
91
- inst = self .hydrate_unbound_relationship (r_id , r_type , properties )
92
- inst ._start_node = self .hydrate_node (n0_id )
93
- inst ._end_node = self .hydrate_node (n1_id )
99
+ def hydrate_relationship (self , id_ , n0_id , n1_id , type_ ,
100
+ properties = None , element_id = None ,
101
+ n0_element_id = None , n1_element_id = None ):
102
+ # backwards compatibility with Neo4j < 5.0
103
+ if element_id is None :
104
+ element_id = str (id_ )
105
+ if n0_element_id is None :
106
+ n0_element_id = str (n0_id )
107
+ if n1_element_id is None :
108
+ n1_element_id = str (n1_id )
109
+
110
+ inst = self .hydrate_unbound_relationship (id_ , type_ , properties ,
111
+ element_id )
112
+ inst ._start_node = self .hydrate_node (n0_id ,
113
+ element_id = n0_element_id )
114
+ inst ._end_node = self .hydrate_node (n1_id , element_id = n1_element_id )
94
115
return inst
95
116
96
- def hydrate_unbound_relationship (self , r_id , r_type , properties = None ):
117
+ def hydrate_unbound_relationship (self , id_ , type_ , properties = None ,
118
+ element_id = None ):
97
119
assert isinstance (self .graph , Graph )
120
+ # backwards compatibility with Neo4j < 5.0
121
+ if element_id is None :
122
+ element_id = str (id_ )
123
+
98
124
try :
99
- inst = self .graph ._relationships [r_id ]
125
+ inst = self .graph ._relationships [element_id ]
100
126
except KeyError :
101
- r = self .graph .relationship_type (r_type )
102
- inst = self .graph ._relationships [r_id ] = r (self .graph , r_id , properties )
127
+ r = self .graph .relationship_type (type_ )
128
+ inst = self .graph ._relationships [element_id ] = r (
129
+ self .graph , element_id , id_ , properties
130
+ )
103
131
return inst
104
132
105
133
def hydrate_path (self , nodes , relationships , sequence ):
@@ -131,10 +159,13 @@ class Entity(Mapping):
131
159
functionality.
132
160
"""
133
161
134
- def __init__ (self , graph , id , properties ):
162
+ def __init__ (self , graph , element_id , id_ , properties ):
135
163
self ._graph = graph
136
- self ._id = id
137
- self ._properties = dict ((k , v ) for k , v in (properties or {}).items () if v is not None )
164
+ self ._element_id = element_id
165
+ self ._id = id_
166
+ self ._properties = {
167
+ k : v for k , v in (properties or {}).items () if v is not None
168
+ }
138
169
139
170
def __eq__ (self , other ):
140
171
try :
@@ -167,11 +198,30 @@ def graph(self):
167
198
return self ._graph
168
199
169
200
@property
201
+ @deprecated ("`id` is deprecated, use `element_id` instead" )
170
202
def id (self ):
171
- """ The identity of this entity in its container :class:`.Graph`.
203
+ """The legacy identity of this entity in its container :class:`.Graph`.
204
+
205
+ Depending on the version of the server this entity was retrieved from,
206
+ this may be empty (None).
207
+
208
+ .. deprecated:: 5.0
209
+ Use :attr:`.element_id` instead.
210
+
211
+ :rtype: int
172
212
"""
173
213
return self ._id
174
214
215
+ @property
216
+ def element_id (self ):
217
+ """The identity of this entity in its container :class:`.Graph`.
218
+
219
+ .. added:: 5.0
220
+
221
+ :rtype: str
222
+ """
223
+ return self ._element_id
224
+
175
225
def get (self , name , default = None ):
176
226
""" Get a property value by name, optionally with a default.
177
227
"""
@@ -214,12 +264,14 @@ class Node(Entity):
214
264
""" Self-contained graph node.
215
265
"""
216
266
217
- def __init__ (self , graph , n_id , n_labels = None , properties = None ):
218
- Entity .__init__ (self , graph , n_id , properties )
267
+ def __init__ (self , graph , element_id , id_ , n_labels = None ,
268
+ properties = None ):
269
+ Entity .__init__ (self , graph , element_id , id_ , properties )
219
270
self ._labels = frozenset (n_labels or ())
220
271
221
272
def __repr__ (self ):
222
- return "<Node id=%r labels=%r properties=%r>" % (self ._id , self ._labels , self ._properties )
273
+ return (f"<Node element_id={ self ._element_id !r} "
274
+ f"labels={ self ._labels !r} properties={ self ._properties !r} >" )
223
275
224
276
@property
225
277
def labels (self ):
@@ -232,14 +284,15 @@ class Relationship(Entity):
232
284
""" Self-contained graph relationship.
233
285
"""
234
286
235
- def __init__ (self , graph , r_id , properties ):
236
- Entity .__init__ (self , graph , r_id , properties )
287
+ def __init__ (self , graph , element_id , id_ , properties ):
288
+ Entity .__init__ (self , graph , element_id , id_ , properties )
237
289
self ._start_node = None
238
290
self ._end_node = None
239
291
240
292
def __repr__ (self ):
241
- return "<Relationship id=%r nodes=(%r, %r) type=%r properties=%r>" % (
242
- self ._id , self ._start_node , self ._end_node , self .type , self ._properties )
293
+ return (f"<Relationship element_id={ self ._element_id !r} "
294
+ f"nodes={ self .nodes !r} type={ self .type !r} "
295
+ f"properties={ self ._properties !r} >" )
243
296
244
297
@property
245
298
def nodes (self ):
0 commit comments