GraphQL API
Reading time: 14 min
Learn about the GraphQL Query API used in The Graph.
is a query language for APIs and a runtime for executing those queries with your existing data. The Graph uses GraphQL to query subgraphs.
To understand the larger role that GraphQL plays, review and .
In your subgraph schema you define types called Entities
. For each Entity
type, entity
and entities
fields will be generated on the top-level Query
type.
Note: query
does not need to be included at the top of the graphql
query when using The Graph.
スキーマで定義された 1 つのToken
エンティティに対するクエリ:
{token(id: "1") {idowner}}
Note: When querying for a single entity, the id
field is required, and it must be writen as a string.
すべての Token
エンティティをクエリします。
{tokens {idowner}}
When querying a collection, you may:
- Use the
orderBy
parameter to sort by a specific attribute. - Use the
orderDirection
to specify the sort direction,asc
for ascending ordesc
for descending.
{tokens(orderBy: price, orderDirection: asc) {idowner}}
グラフ ノード の時点で、エンティティを並べ替えることができますネストされたエンティティに基づいています。
The following example shows tokens sorted by the name of their owner:
{tokens(orderBy: owner__name, orderDirection: asc) {idowner {name}}}
現在、@entity
および @derivedFrom
フィールドで、1 レベルの深い String
または ID
型で並べ替えることができます。残念ながら、、配列およびネストされたエンティティであるフィールドによる並べ替えは、まだサポートされていません。
When querying a collection, it's best to:
- Use the
first
parameter to paginate from the beginning of the collection.- The default sort order is by
ID
in ascending alphanumeric order, not by creation time.
- The default sort order is by
- Use the
skip
parameter to skip entities and paginate. For instance,first:100
shows the first 100 entities andfirst:100, skip:100
shows the next 100 entities. - Avoid using
skip
values in queries because they generally perform poorly. To retrieve a large number of items, it's best to page through entities based on an attribute as shown in the previous example above.
最初の 10 個のトークンを照会します。
{tokens(first: 10) {idowner}}
コレクションの途中にあるエンティティのグループをクエリするには、skip
パラメータを first
パラメータと組み合わせて使用して、最初から指定された数のエンティティをスキップできます。コレクションの。
コレクションの先頭から 10 桁ずれた 10 個の Token
エンティティをクエリします。
{tokens(first: 10, skip: 10) {idowner}}
If a client needs to retrieve a large number of entities, it's more performant to base queries on an attribute and filter by that attribute. For example, a client could retrieve a large number of tokens using this query:
query manyTokens($lastID: String) {tokens(first: 1000, where: { id_gt: $lastID }) {idowner}}
The first time, it would send the query with lastID = ""
, and for subsequent requests it would set lastID
to the id
attribute of the last entity in the previous request. This approach will perform significantly better than using increasing skip
values.
- You can use the
where
parameter in your queries to filter for different properties. - You can filter on multiple values within the
where
parameter.
failed
結果のクエリ チャレンジ:
{challenges(where: { outcome: "failed" }) {challengeroutcomeapplication {id}}}
値の比較には、_gt
、_lte
などのサフィックスを使用できます。
{applications(where: { deposit_gt: "10000000000" }) {idwhitelisteddeposit}}
You can also filter entities that were updated in or after a specified block with _change_block(number_gte: Int)
.
これは、前回のポーリング以降など、変更されたエンティティのみをフェッチする場合に役立ちます。または、サブグラフでエンティティがどのように変化しているかを調査またはデバッグするのに役立ちます (ブロック フィルターと組み合わせると、特定のブロックで変更されたエンティティのみを分離できます)。
{applications(where: { _change_block: { number_gte: 100 } }) {idwhitelisteddeposit}}
_
サフィックスが付いたフィールドでは、ネストされたエンティティに基づくフィルタリングが可能です。
これは、子レベルのエンティティが指定された条件を満たすエンティティのみをフェッチする場合に役立ちます。
{challenges(where: { application_: { id: 1 } }) {challengeroutcomeapplication {id}}}
Graph Node の時点で、複数のグループをグループ化できます同じ where
引数で and
または or
演算子を使用して複数の基準に基づいて結果をフィルタリングします。
The following example filters for challenges with outcome
succeeded
and number
greater than or equal to 100
.
{challenges(where: { and: [{ number_gte: 100 }, { outcome: "succeeded" }] }) {challengeroutcomeapplication {id}}}
シンタックス シュガー: コンマで区切られた部分式を渡すことで and
演算子を削除することで、上記のクエリを簡素化できます。
{challenges(where: { number_gte: 100, outcome: "succeeded" }) {challengeroutcomeapplication {id}}}
The following example filters for challenges with outcome
succeeded
or number
greater than or equal to 100
.
{challenges(where: { or: [{ number_gte: 100 }, { outcome: "succeeded" }] }) {challengeroutcomeapplication {id}}}
注意:クエリを構築する際には、または
演算子の使用によるパフォーマンスへの影響を考慮することが重要です。または
は検索結果を広げるための便利なツールとなり得ますが、重要なコストも伴います。または
の主な問題の1つは、クエリの遅延を引き起こす可能性があることです。これは、または
がデータベースに複数のインデックスをスキャンする必要があるため、時間のかかるプロセスとなるからです。これらの問題を避けるために、開発者は可能な限りまたはの代わりにかつ演算子を使用することが推奨されます。これにより、より正確なフィルタリングが可能となり、より高速で正確なクエリが実行できるでしょう。
パラメータのサフィックスの全リスト:
__not_gt_lt_gte_lte_in_not_in_contains_contains_nocase_not_contains_not_contains_nocase_starts_with_starts_with_nocase_ends_with_ends_with_nocase_not_starts_with_not_starts_with_nocase_not_ends_with_not_ends_with_nocase
一部の接尾辞は、特定のタイプでのみサポートされていることに注意してください。たとえば、Boolean
は _not
、_in
、および _not_in
のみをサポートしますが、_
はサポートしません。オブジェクト型とインターフェイス型でのみ使用できます。
さらに、次のグローバル フィルターを where
引数の一部として使用できます。
_change_block(number_gte: Int)
デフォルトである最新のブロックだけでなく、過去の任意のブロックについてもエンティティの状態を照会できます。クエリが発生するブロックは、クエリのトップレベル フィールドに block
引数を含めることで、ブロック番号またはブロック ハッシュのいずれかで指定できます。
The result of such a query will not change over time, i.e., querying at a certain past block will return the same result no matter when it is executed, with the exception that if you query at a block very close to the head of the chain, the result might change if that block turns out to not be on the main chain and the chain gets reorganized. Once a block can be considered final, the result of the query will not change.
Note: The current implementation is still subject to certain limitations that might violate these guarantees. The implementation can not always tell that a given block hash is not on the main chain at all, or if a query result by a block hash for a block that is not yet considered final could be influenced by a block reorganization running concurrently with the query. They do not affect the results of queries by block hash when the block is final and known to be on the main chain. explains what these limitations are in detail.
{challenges(block: { number: 8000000 }) {challengeroutcomeapplication {id}}}
このクエリは、ブロック番号 8,000,000 を処理した直後に存在していた Challenge エンティティとそれに関連する Application エンティティを返します。
{challenges(block: { hash: "0x5a0b54d5dc17e0aadc383d2db43b0a0d3e029c4c" }) {challengeroutcomeapplication {id}}}
このクエリは Challenge
エンティティとそれに関連付けられた Application
エンティティを返します。これは、指定されたハッシュでブロックを処理した直後に存在していたためです。
フルテキスト検索クエリフィールドは、サブグラフスキーマに追加してカスタマイズできる、表現力豊かなテキスト検索 API を提供します。サブグラフにフルテキスト検索を追加するには、「」を参照してください。
全文検索クエリには、検索語を提供するための必須フィールド text
が 1 つあります。この text
検索フィールドでは、いくつかの特別な全文演算子を使用できます。
全文検索演算子:
シンボル | オペレーター | 説明書き |
---|---|---|
& | と | 複数の検索語を組み合わせて、指定したすべての検索語を含むエンティティをフィルタリングします。 |
| | Or | 複数の検索語をオペレーターで区切って検索すると、指定した語のいずれかにマッチするすべてのエンティティが返されます。 |
<-> | Follow by | 2 つの単語の間の距離を指定します。 |
:* | プレフィックス | プレフィックス検索語を使って、プレフィックスが一致する単語を検索します(2 文字必要) |
or
演算子を使用すると、このクエリはフルテキスト フィールドに「anarchism」または「crumpet」のいずれかのバリエーションを持つブログ エンティティにフィルター処理されます。
{blogSearch(text: "anarchism | crumpets") {idtitlebodyauthor}}
follow by
演算子は、フルテキスト ドキュメント内で特定の距離だけ離れた単語を指定します。次のクエリは、"decentralize" の後に "philosophy" が続くすべてのブログを返します。
{blogSearch(text: "decentralized <-> philosophy") {idtitlebodyauthor}}
全文演算子を組み合わせて、より複雑なフィルターを作成します。口実検索演算子を follow by このサンプル クエリと組み合わせて使用すると、"lou" で始まり、その後に "music" が続く単語を持つすべてのブログ エンティティが一致します。
{blogSearch(text: "lou:* <-> music") {idtitlebodyauthor}}
グラフ ノードは、受信した GraphQL クエリの の検証を実装します,これはに基づいています.検証ルールに失敗したクエリは、標準エラーで失敗します - にアクセスしてください詳細については、をご覧ください。
The schema of your dataSources, i.e. the entity types, values, and relationships that are available to query, are defined through the .
GraphQL schemas generally define root types for queries
, subscriptions
and mutations
. The Graph only supports queries
. The root Query
type for your subgraph is automatically generated from the GraphQL schema that's included in your .
Note: Our API does not expose mutations because developers are expected to issue transactions directly against the underlying blockchain from their applications.
スキーマ内の @entity
ディレクティブを持つすべての GraphQL タイプはエンティティとして扱われ、 ID
フィールドが必要です。
注: 現在、スキーマ内のすべてのタイプに @entity
ディレクティブが必要です。将来的には、@entity
ディレクティブのない型を値オブジェクトとして扱いますが、これはまだサポートされていません。
すべてのサブグラフには、サブグラフ メタデータへのアクセスを提供する、自動生成された _Meta_
オブジェクトがあります。これは、次のように照会できます。
{_meta(block: { number: 123987 }) {block {numberhashtimestamp}deploymenthasIndexingErrors}}
ブロックが提供されている場合、メタデータはそのブロックのものであり、そうでない場合は、最新のインデックス付きブロックが使用されます。提供される場合、ブロックはサブグラフの開始ブロックの後にあり、最後にインデックス付けされたブロック以下でなければなりません。
deployment
は、subgraph.yaml
ファイルの IPFS CID に対応する一意の ID です。
block
は、最新のブロックに関する情報を提供します (_meta
に渡されたブロック制約を考慮します):
- hash: ブロックのハッシュ
- number: ブロック番号
- timestamp: 可能であれば、ブロックのタイムスタンプ (これは現在、EVMネットワークのインデックスを作成するサブグラフでのみ利用可能)
hasIndexingErrors
は、サブグラフが過去のブロックでインデックス作成エラーに遭遇したかどうかを識別するブール値です