SET関数

SET集計関数は1つの単一割当て属性を取得し、その属性から(NULL以外の)すべての値のセットを構成します。

単一割当て属性は、非セット・データ型を持っています(mdex:longなど)。このため、SET関数は、1つの非セット・データ型属性を取得して、セット・データ型の結果を生成します(たとえば、mdex:long-set)。

SET関数の動作は次のとおりです。
  • すべてのNULL値は破棄されます。つまり、1つの属性と1つのNULL値に対して2つのNULL以外の値が存在する場合、2つのNULL以外の値のみが返されます。
  • 属性がNULL以外の値を持たない場合は、空のセットが返されます。
  • 属性内の重複値は破棄されます。たとえば、3つのレコードすべてにWineType=Redが割り当てられており、そのうちの2つにPrice=14.95が割り当てられている場合(3つ目はPrice=21.95)、Redセットに対して2つのPrice値(14.95と21.95)のみが返されます。
  • 文字列値は大/小文字の区別があります。このため、文字列値"Merlot"は文字列値"merlot"と区別され、これらは重複値とはなりません。
  • セット内での値の順序は指定されず、識別されません。

結果のセットは、セット・データ型を持ちます(mdex:double-setなど)。そのセットで引き続き実行される演算はすべて、セットのルールに従う必要があります。

次に説明するように、SET関数は、1引数バージョンと2引数バージョンで使用できます。この関数は、SELECT句でのみ使用できます。

SETの1引数バージョン

SET関数の1引数バージョンの構文は次のとおりです。
SET(<single-assign_attribute>)
ここで、属性のデータ型は、非セット・データ型にする必要があります(単一割当てdouble属性の場合はmdex:doubleなど)。
この例では、Priceは単一割当てのdouble属性です。
RETURN results AS
SELECT
  SET(Price) AS prices
FROM WineState
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      | { }                                        |
---------------------------------------------------------------

結果を見ると、Zinfandelか空のセットを持っています。これは、ZinfandelにPrice属性が割り当てられていないためです。

SETの2引数バージョン

SET集計関数の結果が極端に大きい場合は(Dgraphが過度のメモリーを消費してしまいます)、集計関数の2引数形式を指定して、セットのサイズを制限します。

SET関数の2引数バージョンの構文は次のとおりです。
SET(<single-assign_attribute>, <max-size>)
ここで、
  • single-assign_attributeは、データ型が非セット・データ型である属性です(単一割当て文字列属性の場合はmdex:stringなど)。
  • max-sizeは、セットの最大サイズを指定する整数です。max-sizeがセット内の要素の数より小さい場合、Dgraphは破棄する要素を任意に選択します。この選択は、問合せの複数実行間で一定です。max-sizeが0 (ゼロ)または負数である場合、SETは常に空のセットを返します。
max-sizeは、整数リテラルにする必要があります。
SET(Price, 3) is valid.

SET(Price, x) is not valid, even if x is an integer.
このサンプルの問合せは1引数の例と同じですが、問合せにおいてセットが2つの要素の最大に制限される点が異なります。
RETURN results AS
SELECT
  SET(Price, 2) AS prices
FROM WineState
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      | { }              |
-------------------------------------

結果を見ると、Redセットは2つの要素を持っていますが、もともとはSETの1引数バージョンにより6つの要素を持っていました。Whiteセットに関しても同様で、もともとは3つの要素を持っていました。

データ型のエラー

SET関数を取り扱う場合は、結果のセットがセット・データ型(mdex:double-setデータ型など)になることに注意してください。

たとえば、Priceが複数割当てのdouble属性であるとします。この場合の誤った例は次のとおりです。
RETURN results AS
SELECT SET(Price) AS prices
FROM WineState
GROUP BY WineType
HAVING prices > 10
次のエラーがスローされます。
In statement "results": In HAVING clause: Cannot compare mdex:double-set and mdex:long

このエラーの原因は、"prices"セットの型がmdex:double-setであるにもかかわらず、数値10(mdex:double型)と比較されたことです。

この場合、問合せを次のように修正する必要があります。
RETURN results AS
SELECT SET(Price) AS prices
FROM WineState
GROUP BY WineType
HAVING SOME x IN prices SATISFIES (x > 10)

この例では、SATISFIES式により数値比較が実行されます。