  Triangle counting is a fundamental technique in network analysis, that has
received much attention in various input models. The vast majority of triangle
counting algorithms are targeted to static graphs. Yet, many real-world graphs
are directed and temporal, where edges come with timestamps. Temporal triangles
yield much more information, since they account for both the graph topology and
the timestamps.
  Temporal triangle counting has seen a few recent results, but there are
varying definitions of temporal triangles. In all cases, temporal triangle
patterns enforce constraints on the time interval between edges (in the
triangle). We define a general notion $(\delta_{1,3}, \delta_{1,2},
\delta_{2,3})$-temporal triangles that allows for separate time constraints for
all pairs of edges.
  Our main result is a new algorithm, DOTTT (Degeneracy Oriented Temporal
Triangle Totaler), that exactly counts all directed variants of $(\delta_{1,3},
\delta_{1,2}, \delta_{2,3})$-temporal triangles. Using the classic idea of
degeneracy ordering with careful combinatorial arguments, we can prove that
DOTTT runs in $O(m\kappa\log m)$ time, where $m$ is the number of (temporal)
edges and $\kappa$ is the graph degeneracy (max core number). Up to log
factors, this matches the running time of the best static triangle counters.
Moreover, this running time is better than existing.
  DOTTT has excellent practical behavior and runs twice as fast as existing
state-of-the-art temporal triangle counters (and is also more general). For
example, DOTTT computes all types of temporal queries in Bitcoin temporal
network with half a billion edges in less than an hour on a commodity machine.
