Whenever a node gets a new incoming pointer, update the isRoot field to reflect the fact.
If edge is removed, then all incoming edges need to searched for updating isRoot. Alternative is to maintain count of incoming/outgoing edges to optimize this.
This is required to keep track of how predicates evolve in our graph. The set of predicates that the graph deals with is fixed (and pre-decided), so we need to have a way to keep track of their values.