Operator computing a join over two variables already bound variables in the
mapping set (for which the IV has been computed already). More specifically,
given two variables ?targetVar and ?tmpVar as input, the operator
iterates over the source binding set and tries to unify ?targetVar and
?tmpVar according to the following rules:
(C1) If a binding binds both ?targetVar and ?tmpVar, and ?targetVar *equals*
?tmpVar, then ?tmpVar is dropped from the binding (which essentially
means that the join/unification operation succeeded)
(C2) If a binding binds both ?targetVar and ?tmpVar, and ?targetVar does
*not* equal ?tmpVar, then the whole binding is filtered out
(which essentially means that the join/unification failed)
(C3) If a binding binds only ?targetVar, then the binding is left unmodified
(this can be considered a succeeding join over an unbound variable)
(C4) If a binding binds only ?tmpVar, then we rename ?tmpVar to ?targetVar
(this can be considered a succeeding join over an unbound variable)
Note that in all mappings that pass this unification procedure, ?tmpVar will
not be bound anymore. Also note that this operator modifies the mapping sets,
which is why we cannot cover this through a
ConditionalRoutingOp
with
a special condition (as we want to avoid conditions that have side effects
on the underlying mapping sets).
This operator is used in the context of BIND clauses, whenever they
construct complex values (such as fresh URIs) that are later reused in
comparisons (such as joins, filters, etc.): for these cases, we first
bind the BIND variable to a dummy variable (?X'), compute the IV for these
dummy variables, and then use the VariableUnificationOp to join it with
potentially earlier bound variables.