It's not all that evident until you start looking at #DBToaster's AGCA, but the #ProvenanceSemiring join operator behaves a lot like unix pipes (i.e., function composition), but with explicit associativity/commutativity. g | f == f | g for all f, g.

This is simultaneously super powerful (e.g. you can express selection by intersecting with the infinite relation of satisfying tuples), and super frustrating when trying to model a transformation that can't be modeled in the semiring.