12. One or more non-transitory storage media storing instructions which, when executed by one or more processors, cause: receiving a query graph that includes a plurality of query nodes; selecting a first query node from among the plurality of query nodes; storing a first data structure that is accessible to a first plurality of threads; for each thread in the first plurality of threads: assigning, to said each thread, a different set of nodes in a particular graph; identifying, in the set of nodes assigned to said each thread, one or more nodes that match the first query node; storing, in the first data structure, one or more node identities of the one or more nodes identified by said each thread; selecting, from among the plurality of query nodes, a second query node that is different than the first query node; storing a second data structure that is accessible to a second plurality of threads; for each thread in the second plurality of threads: assigning, to said each thread, a different set of nodes identified in the first data structure; identifying, in the particular graph, one or more neighbor nodes, of each node that is identified in the first data structure and is assigned to said each thread, that match the second query node; storing, in the second data structure, one or more identities of the one or more neighbor nodes identified by said each thread.
12. One or more non-transitory storage media storing instructions which, when executed by one or more processors, cause: receiving a query graph that includes a plurality of query nodes; selecting a first query node from among the plurality of query nodes; storing a first data structure that is accessible to a first plurality of threads; for each thread in the first plurality of threads: assigning, to said each thread, a different set of nodes in a particular graph; identifying, in the set of nodes assigned to said each thread, one or more nodes that match the first query node; storing, in the first data structure, one or more node identities of the one or more nodes identified by said each thread; selecting, from among the plurality of query nodes, a second query node that is different than the first query node; storing a second data structure that is accessible to a second plurality of threads; for each thread in the second plurality of threads: assigning, to said each thread, a different set of nodes identified in the first data structure; identifying, in the particular graph, one or more neighbor nodes, of each node that is identified in the first data structure and is assigned to said each thread, that match the second query node; storing, in the second data structure, one or more identities of the one or more neighbor nodes identified by said each thread. 20. The one or more storage media of claim 12 , wherein: for each thread of the first plurality of threads, identifying, in the set of nodes assigned to said each thread, the one or more nodes that match the first query node comprises: identifying one or more attributes of the first query node, for each node in the set of nodes assigned to said each thread: identifying one or more attributes of said each node, comparing one or more attributes of the first query node with the one or more attributes of said each node, and wherein storing in the first data structure comprises storing an identity of said each node in the first data structure only if the one or more attributes of the first query node match the one or more attributes of said each node.