Note
現在、この機能はパブリック プレビュー段階にあります。 このプレビュー版はサービス レベル アグリーメントなしで提供されています。運用環境のワークロードに使用することはお勧めできません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳細については、「 Microsoft Azure プレビューの追加使用条件」を参照してください。
フィルター処理を行うと、重要な行に結果が絞り込まれます。 集計では、これらの行がカウント、合計、および平均にまとめられます。 この記事では、Microsoft Fabricのグラフに対して GQL クエリで両方の手法を適用する方法について説明します。
例では、 ソーシャル ネットワークのサンプル データセットを使用します。 GQL ステートメントと式の完全なリファレンスについては、 GQL 言語ガイドを参照してください。
前提条件
- データが読み込まれたグラフ項目。 グラフを初めて使用する場合は、最初に チュートリアル を完了します。
- 基本的な
MATCHとRETURNクエリに関する知識。 GQL 言語ガイドを参照してください。
FILTER を使用して行をフィルター処理する
FILTERを使用して、条件を満たす行のみを保持します。
FILTERの後にMATCHを配置して、一致した結果を絞り込みます。
次のクエリは、名前と誕生日を持つすべての女性を返します。
MATCH (p:Person)
FILTER p.gender = 'female'
RETURN p.firstName, p.lastName, p.birthday
複数の条件を AND と ORと組み合わせます。 たとえば、次のクエリは、1990 年より前に生まれたすべての女性の名前を返します。
MATCH (p:Person)
FILTER p.gender = 'female' AND p.birthday < 19900101
RETURN p.firstName, p.lastName
ヒント
パフォーマンスを向上させるには、別のWHERE ステートメントではなく、インライン FILTER 句を使用してパターン マッチング中にフィルター処理します。
「パターン マッチング中のフィルター」を参照してください。
パターンマッチング中のフィルター処理
WHERE パターン内のインライン MATCH句は、結果が生成される前に一致するノードとエッジを制限します。 クエリ エンジンがより早く行を削除するため、このアプローチは一致後の FILTER 句よりも効率的です。
たとえば、1994 年より前に生まれた人を会社と共に見つけるには、名前が "A" で始まる企業に結果を制限します。
MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name
エッジ プロパティも同様にフィルタリングします。 たとえば、2000 年以降に会社で働き始めた人のみを返すには、次のようにします。
MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)
RETURN p.firstName, p.lastName, c.name, w.workFrom
インラインフィルターとマッチ後のフィルター処理のパフォーマンスの違いの詳細については、「 GQL クエリのパフォーマンスを最適化する」を参照してください。
フィルターで null 値を処理する
GQL では、3 つの値を持つロジックが使用されます。述語は、 TRUE、 FALSE、または UNKNOWNに評価されます。 プロパティ値が null の場合、比較は UNKNOWNを返します。
FILTER では、 UNKNOWN が一致しないものとして扱われるので、行は除外されます。
IS NULLとIS NOT NULLを使用して、null 値を明示的にテストします。
-- Only include people who have a nickname
MATCH (p:Person)
FILTER p.nickname IS NOT NULL
RETURN p.firstName, p.nickname
プロパティが null の場合は、 coalesce() を使用して既定値に置き換える:
MATCH (p:Person)
RETURN p.firstName, coalesce(p.nickname, p.firstName) AS displayName
Caution
NULL = NULLは、UNKNOWNではなく、TRUEに評価されます。 常にIS NULLを使用して、等価性ではなく null 値をテストします。
RETURN を使用して結果を集計する
RETURNの集計関数を使用して、結果を集計します。 GQL では、 count()、 sum()、 avg()、 min()、および max()がサポートされます。
たとえば、グラフ内のすべてのユーザーをカウントするには、次のようにします。
MATCH (p:Person)
RETURN count(*) AS totalPeople
従業員を雇用する個別の企業の数など、個別の値をカウントするには:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT c) AS companyCount
GROUP BY を使用して結果をグループ化する
GROUP BYのRETURNを使用して、共有値で行をグループ化し、各グループ内の集計を計算します。 このグループ化は、SQL GROUP BYと同等の GQL です。
たとえば、会社ごとの従業員数をカウントするには、次のようにします。
MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, count(*) AS employeeCount
GROUP BY companyName
ORDER BY employeeCount DESC
複数の列でグループ化し、一度に複数の集計を計算します。 たとえば、性別とブラウザーで人物数と誕生日の範囲を分割し、最も一般的な 10 個の組み合わせを返します。
MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
browser,
count(*) AS personCount,
min(p.birthday) AS earliestBirthday,
max(p.birthday) AS latestBirthday
GROUP BY gender, browser
ORDER BY personCount DESC
LIMIT 10
Note
RETURN内のすべての非集計式は、GROUP BYに含める必要があります。
GROUP BYに含まれていない式では、集計関数を使用する必要があります。
集計結果の並べ替えと制限
ORDER BYとLIMITをGROUP BYと共に使用して、top-N の結果を見つけます。
たとえば、上位 5 都市を住民数別に検索するには、次のようにします。
MATCH (p:Person)-[:isLocatedIn]->(city:City)
LET cityName = city.name
RETURN cityName, count(*) AS residentCount
GROUP BY cityName
ORDER BY residentCount DESC
LIMIT 5
Important
ORDER BYの前にLIMITを配置します。
LIMIT は常に、既に並べ替えられた結果セットに適用されます。
結果の条件付き値に CASE を使用する
CASE
/
WHEN
/
THEN
/
ELSEを使用して、RETURNまたはLETの条件付き値を計算します。
たとえば、生年月日に基づいて人を時代 (年号) に分類するには、次のようにします。
MATCH (p:Person)
RETURN p.firstName,
CASE WHEN p.birthday < 19800101 THEN 'Before 1980'
WHEN p.birthday < 20000101 THEN '1980–1999'
ELSE '2000 or later'
END AS era