The pipeline to reach for when you have no reason to build your own.
The order is not a preference, it is what each step needs to see. Paths are expanded before the
unfolding, which only knows triple patterns. FILTER(FALSE) is collapsed after every step that can
produce one, so the next step has less to walk. The pushdown drives terms into the leaves and the
pull-up floats the binds it leaves behind back out, in that order, because the pushdown is what creates
them. nullifyJoinOverIncompatibleBounds comes last, after removeProjections and pullUpExtends: it
reads each join operand's top-level EXTEND chain and halts at a PROJECT, so anywhere earlier it sees
nothing at all.
transformations/nullifyUnbindableVars!nullifyUnbindableVars is deliberately absent - nothing the
unfolding generates gives it anything to decide - and so are the blank node materialisations, which are
a choice about the data source rather than an optimisation.
The pipeline to reach for when you have no reason to build your own.
The order is not a preference, it is what each step needs to see. Paths are expanded before the unfolding, which only knows triple patterns.
FILTER(FALSE)is collapsed after every step that can produce one, so the next step has less to walk. The pushdown drives terms into the leaves and the pull-up floats the binds it leaves behind back out, in that order, because the pushdown is what creates them.nullifyJoinOverIncompatibleBoundscomes last, afterremoveProjectionsandpullUpExtends: it reads each join operand's top-levelEXTENDchain and halts at aPROJECT, so anywhere earlier it sees nothing at all.transformations/nullifyUnbindableVars!nullifyUnbindableVars is deliberately absent - nothing the unfolding generates gives it anything to decide - and so are the blank node materialisations, which are a choice about the data source rather than an optimisation.