hasChangedElements(changedTiddlers) {

    const maybeMatches = [];
    const inGraph = this.graphData.nodesById;
    const isShowNeighbourhood = this.view.isEnabled('neighbourhood_scope');

    for (let tRef in changedTiddlers) {

      if (utils.isSystemOrDraft(tRef)) {

        continue;
      }

      if (inGraph[$tm.adapter.getId(tRef)] || isShowNeighbourhood) {

        return true;
      }

      if (changedTiddlers[tRef].modified) {
        // may be a match so we store this and process it later
        maybeMatches.push(tRef);
      }
    }

    if (maybeMatches.length) {

      const nodeFilter = this.view.getNodeFilter('compiled');
      const matches = utils.getMatches(nodeFilter, maybeMatches);

      return !!matches.length;
    }

  }
Rebuild or update the graph if one of the following is true:

1. A tiddler currently contained as node in the graph has been
   deleted or modified. This also includes tiddlers that are
   represented as neighbours in the graph.
2. The neighbourhood is shown and a non-system tiddler has changed.
3. A tiddler that matches the node filter has been modified
   (not deleted).

Since edges are stored in tiddlers themselves, any edge modification
is always accounted for as in this case the tiddler holding the
edge would be included as changed tiddler.

@param {Hashmap<TiddlerReference, *>} changedTiddlers - A list of
    tiddler changes.

@return {boolean} true if the graph needs a refresh.