Dereferencing GraphItems

GraphItems use properties with implicit registry access::

edge.predecessor     # returns Node via self.graph.get()
edge.successor       # property, no args

Records don’t have self.graph, so they use methods with explicit registry parameter::

record.origin(registry)  # returns Entity via passed registry

Collections & Queries return fresh iterators::

subgraph.members              # Iterator[GraphItem], not cached
node.edges_in()               # Iterator[Edge], fresh lookup
registry.find_all(Selector(label='x'))  # Iterator[Entity], filtered

All iterators are single-use. Materialize explicitly if multiple passes needed::

# Single iteration: direct use
for member in subgraph.members:
    process(member)

# Multiple iterations: materialize first
members = list(subgraph.members)
first_pass(members)
second_pass(members)

This pattern ensures queries always reflect current state and avoids hidden cache invalidation complexity.