The SET aggregation function takes a single-assign attribute and constructs a set of all of the (non-NULL) values from that attribute.
Single-assign attributes have non-set data types (such as mdex:long). So the SET function takes a non-set data type attribute and produces a set data type result (for example, mdex:long-set).
The resulting set will have a set data type (such as mdex:double-set). All subsequent operations on it must follow the rules for sets.
The SET function is available in one-argument and two-argument versions, as described below. This function can be used only in SELECT clauses.
SET(<single-assign_attribute>)where the data type of the attribute must be a non-set data type (such as mdex:double for a single-assign double attribute).
RETURN results AS SELECT SET(Price) AS prices GROUP BY WineType ORDER BY WineType
WineType prices --------------------------------------------------------------- | Blanc de Noirs | { 16.99 } | | Bordeaux: | { 21.99 } | | Brut | { 22.99, 23.99 } | | Chardonnay: | { 17.95, 34.95 } | | Merlot: | { 25.99 } | | Pinot Noir: | { 14.99 } | | Red: | { 12.99, 13.95, 17.5, 18.99, 21.99, 9.99 } | | White: | { 20.99, 32.99, 43.99 } | | Zinfandel: | { } | ---------------------------------------------------------------
In the results, note that Zinfandel has an empty set because Zinfandel does not have a Price attribute assignment.
For situations where the result of the SET aggregator can be extremely large (causing the Dgraph to consume excessive memory), a two-argument form of the aggregator is provided to limit the set size.
SET(<single-assign_attribute>, <max-size>)where:
SET(Price, 3) is valid. SET(Price, x) is not valid, even if x is an integer.
RETURN results AS SELECT SET(Price, 2) AS prices GROUP BY WineType ORDER BY WineType
WineType prices ------------------------------------- | Blanc de Noirs | { 16.99 } | | Bordeaux: | { 21.99 } | | Brut | { 22.99, 23.99 } | | Chardonnay: | { 17.95, 34.95 } | | Merlot: | { 25.99 } | | Pinot Noir: | { 14.99 } | | Red: | { 12.99, 9.99 } | | White: | { 20.99, 32.99 } | | Zinfandel: | { } | -------------------------------------
In the results, note that Red set now has two elements, while it had six elements with the one-argument SET version. Likewise with the White set, which previously had three elements.
When working with the SET function, keep in mind that its resulting sets are of the set data types, such as a mdex:double-set data type.
RETURN results AS SELECT SET(Price) AS prices GROUP BY WineType HAVING prices > 10
In statement "results": In HAVING clause: Cannot compare mdex:double-set and mdex:long
The reason for the error is that the "prices" set is of type mdex:double-set and it is being compared to the number 10 (which is an mdex:double type).
RETURN results AS SELECT SET(Price) AS prices GROUP BY WineType HAVING SOME x IN prices SATISFIES (x > 10)
In this example, the SATISFIES expression allows you to make a numerical comparison.