ARQ includes support for an explicit assignment of variables.
This involves is syntactic extension and is available is the query
is parsed with language Syntax.syntaxARQ.
See also SELECT expressions which is also a form of assignment.
The general form is:
LET ( variable := expression )
For example:
LET ( ?x := 2 ) { ?x :name ?name . LET ( ?age2 := ?age - 21 )
Note: Assignment is ":="
ARQ assignment is single assignment, that is, once a variable is assigned a binding, then it can not be changed in the same query solution.
Only one LET expression per variable is allowed in a single
scope.
The execution rules are:
Note that "same value" means the same as applies to graph pattern matching, not to FILTER expressions. Some graph implementation only provide same-term graph pattern matching. FILTERs always do value-based comparisons for "=" for all graphs.
One use is to perform some calculation prior to forming the result graph in a CONSTRUCT query.
CONSTRUCT { ?x :lengthInCM ?cm } WHERE { ?x :lengthInInches ?inch . LET ( ?cm := ?inches/2.54 ) }
The OPTIONAL/!BOUND/FILTER idiom for performing limited negation of a pattern in SPARQL can be inconvenient because it requires a variable in the OPTIONAL to be assigned by pattern matching. Using a LET can make that easier; here, we assign to ?z (any value will do) to mark when the matching pattern included the OPTIONAL pattern.
Example: ?x with no ":p 1" triple:
{ ?x a :FOO . OPTIONAL { ?x :p 1 . LET (?z := true) } FILTER ( !BOUND(?z) ) }
Note that negation is supported properly through
the NOT EXISTS form.