Microsoft Fabricで一般的な GQL クエリを記述する

Note

現在、この機能はパブリック プレビュー段階にあります。 このプレビュー版はサービス レベル アグリーメントなしで提供されています。運用環境のワークロードに使用することはお勧めできません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳細については、「 Microsoft Azure プレビューの追加使用条件」を参照してください。

この記事では、近隣ノードの検索、マルチホップ接続の走査、共有接続の識別、リレーションシップのカウント、接続のないエンティティの検索など、Microsoft Fabricの一般的なグラフ タスクに対する実用的な GQL クエリ パターンについて説明します。

例では、 ソーシャル ネットワークのサンプル データセットを使用します。 完全な言語リファレンスについては、 GQL 言語ガイドを参照してください。

前提条件

  • データが読み込まれたグラフ項目。 グラフを初めて使用する場合は、最初に チュートリアル を完了します。
  • 基本的な MATCHRETURN クエリに関する知識。 GQL 言語ガイドを参照してください。

直接の近隣ノードを検索する

開始ノードに接続されているすべてのノードを 1 ホップずつ返します。

特定のユーザーが知っているすべてのユーザーを検索します。

MATCH (p:Person WHERE p.firstName = 'Alice')-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName

ユーザーが働いていたすべての会社を検索します。

MATCH (p:Person WHERE p.firstName = 'Alice')-[:workAt]->(c:Company)
RETURN c.name, c.url

友達を探す (マルチホップ)

複数のホップを走査するには、 {min,max} で可変長パターンを使用します。

Aliceが直接知らない、Aliceの友人の友人である2段階離れた関係の人を見つけます。

MATCH (alice:Person WHERE alice.firstName = 'Alice')-[:knows]->{2,2}(fof:Person)
RETURN DISTINCT fof.firstName, fof.lastName
LIMIT 100

3 度以内に到達可能な全員を検索します。

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,3}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100

ヒント

可変長トラバーサルでは常に上限を設定します。 大規模または高密度のグラフに対する無制限のパターンは、クエリのタイムアウト制限に達する可能性があります。 現在の制限事項を参照してください。

エンティティごとのリレーションシップのカウント

GROUP BYcount(*)を使用して、各エンティティに含まれるリレーションシップの数をカウントします。

各ユーザーが持っているフレンドの数をカウントし、最も少ないユーザーから順に並べ替えました。

MATCH (p:Person)-[:knows]->(friend:Person)
LET name = p.firstName || ' ' || p.lastName
RETURN name, count(*) AS friendCount
GROUP BY name
ORDER BY friendCount DESC
LIMIT 20

各会社で働いている従業員の数をカウントします。

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, count(*) AS employeeCount
GROUP BY companyName
ORDER BY employeeCount DESC

共有接続の検索

パターンの 2 つの部分で変数を再利用すると、暗黙的な "同じノード" 制約が作成されます。 この制約を使用して、共有された 3 番目のエンティティを介して接続されているエンティティを検索します。

両方とも同じ人を知っている人のペアを見つけます。

MATCH (a:Person)-[:knows]->(mutual:Person)<-[:knows]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, mutual.firstName AS sharedContact
LIMIT 100

同じ会社で働く人のペアを見つけます。

MATCH (c:Company)<-[:workAt]-(a:Person), (c)<-[:workAt]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, c.name AS company
LIMIT 100

ヒント

WHERE a.id < b.id条件により、重複するペア (Alice-Bob と Bob-Alice) が結果に表示されなくなります。

リレーションシップのないエンティティを検索する

リレーションシップが一致しないノードを検索するには、 OPTIONAL MATCH の後に null チェックを使用します。

どの会社でも働いていない人を見つけます。

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100

コメントのない投稿を検索する:

MATCH (post:Post)
OPTIONAL MATCH (comment:Comment)-[:replyOf]->(post)
FILTER comment IS NULL
RETURN post.id, post.content
LIMIT 100

多数の接続を持つエンティティを検索する

GROUP BYFILTERを組み合わせて、高度に接続されたノードを識別します。 この方法は、ハブまたは外れ値を見つけるのに役立ちます。

10 人以上の友人を持つユーザーを見つける:

MATCH (p:Person)-[:knows]->(friend:Person)
LET name = p.firstName || ' ' || p.lastName
RETURN name, count(*) AS friendCount
GROUP BY name
FILTER friendCount > 10
ORDER BY friendCount DESC

Note

FILTER GROUP BY後は、SQL でのHAVINGと同様に機能します。 個々の行ではなく、集計された結果をフィルター処理します。