Mnemonic implements a subgraph matching system as outlined in Algorithm . First, using data and query based heuristics, it sets up hyper-parameters. This step is normally referred to as preprocessing in existing works [1]}, which involves tasks such as finding the root query node, generating the query tree, and determining the matching order. The default heuristics for these tasks are chosen in Mnemonic based on common practices. For example, the most selective node is chosen as the root node, the BFS tree rooted at that node is the spanning tree, and BFS traversal order is the matching order. These tasks can be accomplished by invoking InitializeIndex. InitializeStream sets up the snapshot generator, where a few customizing parameters such as window size, stride or batch size are specified by the user. In each iteration, the last snapshot of the graph and changes made since then are provided with two lists- insertion and deletion list. For example, at time \(t2\)  in Figure REF (d), the insertion list {\((1, 2, 0)\) }, and deletion list {\((3,7,1), (1,5,0)\) } are generated on top of snapshot \(G1\) . Once the hyper-parameters are determined, it fetches the new snapshot, makes changes to the DEBI with the help of edgeMatcher(), and outputs newly formed (or removed) embeddings from insertions (or deletions) made in the current snapshot by traversing the DEBI, repeatedly with the help of enumerator() as outlined in Algorithm .
<FIGURE>