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,22 +159,27 @@ 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 :
141
- return type (self ) == type (other ) and self .graph == other .graph and self .id == other .id
172
+ return (type (self ) == type (other )
173
+ and self .graph == other .graph
174
+ and self .element_id == other .element_id )
142
175
except AttributeError :
143
176
return False
144
177
145
178
def __ne__ (self , other ):
146
179
return not self .__eq__ (other )
147
180
148
181
def __hash__ (self ):
149
- return hash (self .id )
182
+ return hash (self ._element_id )
150
183
151
184
def __len__ (self ):
152
185
return len (self ._properties )
@@ -167,11 +200,30 @@ def graph(self):
167
200
return self ._graph
168
201
169
202
@property
203
+ @deprecated ("`id` is deprecated, use `element_id` instead" )
170
204
def id (self ):
171
- """ The identity of this entity in its container :class:`.Graph`.
205
+ """The legacy identity of this entity in its container :class:`.Graph`.
206
+
207
+ Depending on the version of the server this entity was retrieved from,
208
+ this may be empty (None).
209
+
210
+ .. deprecated:: 5.0
211
+ Use :attr:`.element_id` instead.
212
+
213
+ :rtype: int
172
214
"""
173
215
return self ._id
174
216
217
+ @property
218
+ def element_id (self ):
219
+ """The identity of this entity in its container :class:`.Graph`.
220
+
221
+ .. added:: 5.0
222
+
223
+ :rtype: str
224
+ """
225
+ return self ._element_id
226
+
175
227
def get (self , name , default = None ):
176
228
""" Get a property value by name, optionally with a default.
177
229
"""
@@ -214,12 +266,14 @@ class Node(Entity):
214
266
""" Self-contained graph node.
215
267
"""
216
268
217
- def __init__ (self , graph , n_id , n_labels = None , properties = None ):
218
- Entity .__init__ (self , graph , n_id , properties )
269
+ def __init__ (self , graph , element_id , id_ , n_labels = None ,
270
+ properties = None ):
271
+ Entity .__init__ (self , graph , element_id , id_ , properties )
219
272
self ._labels = frozenset (n_labels or ())
220
273
221
274
def __repr__ (self ):
222
- return "<Node id=%r labels=%r properties=%r>" % (self ._id , self ._labels , self ._properties )
275
+ return (f"<Node element_id={ self ._element_id !r} "
276
+ f"labels={ self ._labels !r} properties={ self ._properties !r} >" )
223
277
224
278
@property
225
279
def labels (self ):
@@ -232,14 +286,15 @@ class Relationship(Entity):
232
286
""" Self-contained graph relationship.
233
287
"""
234
288
235
- def __init__ (self , graph , r_id , properties ):
236
- Entity .__init__ (self , graph , r_id , properties )
289
+ def __init__ (self , graph , element_id , id_ , properties ):
290
+ Entity .__init__ (self , graph , element_id , id_ , properties )
237
291
self ._start_node = None
238
292
self ._end_node = None
239
293
240
294
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 )
295
+ return (f"<Relationship element_id={ self ._element_id !r} "
296
+ f"nodes={ self .nodes !r} type={ self .type !r} "
297
+ f"properties={ self ._properties !r} >" )
243
298
244
299
@property
245
300
def nodes (self ):
0 commit comments