# GraphQL API のレート制限とクエリ制限

GitHub GraphQL API には、GitHubのサーバーに対する過剰または不正な呼び出しから保護するための制限があります。

## プライマリ レート制限

GitHub Enterprise Serverでは、レート制限は既定で無効になっています。 インスタンスのレート制限を確認するには、サイト管理者にお問い合わせください。

サイト管理者の場合は、インスタンスのレート制限を設定できます。 詳しくは、「[Configuring rate limits (レート制限を構成する)](/ja/enterprise-server@3.22/admin/configuring-settings/configuring-user-applications-for-your-enterprise/configuring-rate-limits)」をご覧ください。

インスタンスの外部でユーザーまたは組織用のアプリを開発する場合は、標準の GitHub レート制限が適用されます。 詳細については、[](/ja/graphql/overview/rate-limits-and-query-limits-for-the-graphql-api)ドキュメントの GitHub Free を参照してください。

## ノードの制限

[schema](/ja/enterprise-server@3.22/graphql/guides/introduction-to-graphql#schema) 検証に合格するには、すべての GraphQL API [calls](/ja/enterprise-server@3.22/graphql/guides/forming-calls-with-graphql) が次の標準を満たしている必要があります。

* クライアントは、任意の`first`に対して、`last` または [](/ja/enterprise-server@3.22/graphql/guides/introduction-to-graphql#connection) 引数を指定する必要があります。
* `first` と `last` の値は 1 から 100 である必要があります。
* 個々の呼び出しでは、合計 500,000 を超える [nodes](/ja/enterprise-server@3.22/graphql/guides/introduction-to-graphql#node) を要求することはできません。

### 呼び出し中のノードの計算

以下の2つの例は、呼び出し中の合計ノード数を計算する方法を示しています。

1. 単純なクエリ：

   <pre>query {
     viewer {
       repositories(first: <span class="redbox">50</span>) {

edges {
repository:node {
name

issues(first: <span class="greenbox">10</span>) {
totalCount
edges {
node {
title
bodyHTML
}
}
}
}
}
}
}
}</pre>

計算:

   <pre><span class="redbox">50</span>         = 50 repositories
    +
   <span class="redbox">50</span> x <span class="greenbox">10</span>  = 500 repository issues

= 550 total nodes</pre>

1. 複雑なクエリ：

   <pre>query {
     viewer {
       repositories(first: <span class="redbox">50</span>) {

edges {
repository:node {
name

pullRequests(first: <span class="greenbox">20</span>) {
edges {
pullRequest:node {
title

comments(first: <span class="bluebox">10</span>) {
edges {
comment:node {
bodyHTML
}
}
}
}
}
}

issues(first: <span class="greenbox">20</span>) {
totalCount
edges {
issue:node {
title
bodyHTML

comments(first: <span class="bluebox">10</span>) {
edges {
comment:node {
bodyHTML
}
}
}
}
}
}
}
}
}

```
   followers(first: <span class="bluebox">10</span>) {
```

edges {
follower:node {
login
}
}
}
}
}</code></pre>

計算:

   <pre><span class="redbox">50</span>              = 50 repositories
    +
   <span class="redbox">50</span> x <span class="greenbox">20</span>       = 1,000 pullRequests
    +
   <span class="redbox">50</span> x <span class="greenbox">20</span> x <span class="bluebox">10</span> = 10,000 pullRequest comments
    +
   <span class="redbox">50</span> x <span class="greenbox">20</span>       = 1,000 issues
    +
   <span class="redbox">50</span> x <span class="greenbox">20</span> x <span class="bluebox">10</span> = 10,000 issue comments
    +
   <span class="bluebox">10</span>              = 10 followers

= 22,060 total nodes</pre>

## クエリの最適化戦略

* **オブジェクト数を制限する**: `first` または `last` 引数に小さい値を使い、結果を複数ページに分割します。
* **クエリの深さを減らす**: 必要でない場合は、入れ子構造が深いオブジェクトを要求しないようにします。
* **結果をフィルター処理する**: 引数を使ってデータをフィルター処理し、必要なもののみを返します。
* **大きなクエリを分割する**: 複雑なクエリを複数の単純なクエリに分割します。
* **必須フィールドのみを要求する**: 使用できるすべてのフィールドを要求するのではなく、必要なフィールドのみを選びます。

このような戦略に従うことで、リソース制限に達する可能性を減らし、API 要求のパフォーマンスと信頼性を向上させることができます。