You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: website/src/pages/en/subgraphs/querying/graphql-api.mdx
+48-46Lines changed: 48 additions & 46 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,36 +2,22 @@
2
2
title: GraphQL API
3
3
---
4
4
5
-
Explore the GraphQL Query API for interacting with Subgraphs on The Graph Network.
5
+
Learn about the GraphQL Query API used in The Graph.
6
6
7
7
## What is GraphQL?
8
8
9
9
[GraphQL](https://graphql.org/learn/) is a query language for APIs and a runtime for executing those queries with your existing data. The Graph uses GraphQL to query Subgraphs.
10
10
11
-
## Core Concepts
12
-
13
-
### Entities
14
-
15
-
-**What they are**: Persistent data objects defined with `@entity` in your schema
16
-
-**Key requirement**: Must contain `id: ID!` as primary identifier
17
-
-**Usage**: Foundation for all query operations
18
-
19
-
### Schema
20
-
21
-
-**Purpose**: Blueprint defining the data structure and relationships using GraphQL [IDL](https://facebook.github.io/graphql/draft/#sec-Type-System)
22
-
-**Key characteristics**:
23
-
- Auto-generates query endpoints
24
-
- Read-only operations (no mutations)
25
-
- Defines entity interfaces and derived fields
11
+
To understand the larger role that GraphQL plays, review [developing](/subgraphs/developing/introduction/) and [creating a Subgraph](/developing/creating-a-subgraph/).
26
12
27
13
## Queries with GraphQL
28
14
29
-
In the Subgraph schema, types called `Entities`. For each `Entity` type, `entity` and `entities` fields will be generated on the top-level `Query` type.
30
-
31
-
### Example Queries
15
+
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.
32
16
33
17
> Note: `query` does not need to be included at the top of the `graphql` query when using The Graph.
34
18
19
+
### Examples
20
+
35
21
Query for a single `Token` entity defined in your schema:
36
22
37
23
```graphql
@@ -58,7 +44,7 @@ Query all `Token` entities:
58
44
59
45
### Sorting
60
46
61
-
When querying a collection, you can:
47
+
When querying a collection, you may:
62
48
63
49
- Use the `orderBy` parameter to sort by a specific attribute.
64
50
- Use the `orderDirection` to specify the sort direction, `asc` for ascending or `desc` for descending.
@@ -74,7 +60,7 @@ When querying a collection, you can:
74
60
}
75
61
```
76
62
77
-
#### Example for Nested Entity Sorting
63
+
#### Example for nested entity sorting
78
64
79
65
As of Graph Node [`v0.30.0`](https://github.com/graphprotocol/graph-node/releases/tag/v0.30.0) entities can be sorted on the basis of nested entities.
80
66
@@ -102,7 +88,7 @@ When querying a collection, it's best to:
102
88
- Use the `skip` parameter to skip entities and paginate. For instance, `first:100` shows the first 100 entities and `first:100, skip:100` shows the next 100 entities.
103
89
- 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.
104
90
105
-
#### Example Using`first`
91
+
#### Example using`first`
106
92
107
93
Query the first 10 tokens:
108
94
@@ -115,9 +101,9 @@ Query the first 10 tokens:
115
101
}
116
102
```
117
103
118
-
To query for groups of entities in the middle of a collection, the `skip` parameter can be used in conjunction with the `first` parameter to skip a specified number of entities starting at the beginning of the collection.
104
+
To query for groups of entities in the middle of a collection, the `skip` parameter may be used in conjunction with the `first` parameter to skip a specified number of entities starting at the beginning of the collection.
119
105
120
-
#### Example Using`first` and `skip`
106
+
#### Example using`first` and `skip`
121
107
122
108
Query 10 `Token` entities, offset by 10 places from the beginning of the collection:
123
109
@@ -130,7 +116,7 @@ Query 10 `Token` entities, offset by 10 places from the beginning of the collect
130
116
}
131
117
```
132
118
133
-
#### Example Using`first` and `id_ge`
119
+
#### Example using`first` and `id_ge`
134
120
135
121
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:
136
122
@@ -150,9 +136,9 @@ The first time, it would send the query with `lastID = ""`, and for subsequent r
150
136
- You can use the `where` parameter in your queries to filter for different properties.
151
137
- You can filter on multiple values within the `where` parameter.
152
138
153
-
#### Using `where` Filtering
139
+
#### Example using `where`
154
140
155
-
Query challenges with `failed` outcome using 'where' filter:
141
+
Query challenges with `failed` outcome:
156
142
157
143
```graphql
158
144
{
@@ -168,7 +154,7 @@ Query challenges with `failed` outcome using 'where' filter:
168
154
169
155
You can use suffixes like `_gt`, `_lte` for value comparison:
170
156
171
-
#### Range Filtering
157
+
#### Example for range filtering
172
158
173
159
```graphql
174
160
{
@@ -180,7 +166,7 @@ You can use suffixes like `_gt`, `_lte` for value comparison:
180
166
}
181
167
```
182
168
183
-
#### Block Filtering
169
+
#### Example for block filtering
184
170
185
171
You can also filter entities that were updated in or after a specified block with `_change_block(number_gte: Int)`.
186
172
@@ -196,7 +182,7 @@ This can be useful if you are looking to fetch only entities which have changed,
196
182
}
197
183
```
198
184
199
-
#### Nested Entity Filtering
185
+
#### Example for nested entity filtering
200
186
201
187
Filtering on the basis of nested entities is possible in the fields with the `_` suffix.
202
188
@@ -214,11 +200,11 @@ This can be useful if you are looking to fetch only entities whose child-level e
214
200
}
215
201
```
216
202
217
-
### Logical Operators
203
+
####Logical operators
218
204
219
205
As of Graph Node [`v0.30.0`](https://github.com/graphprotocol/graph-node/releases/tag/v0.30.0) you can group multiple parameters in the same `where` argument using the `and` or the `or` operators to filter results based on more than one criteria.
220
206
221
-
####Using `and` Operator
207
+
##### `AND` Operator
222
208
223
209
The following example filters for challenges with `outcome``succeeded` and `number` greater than or equal to `100`.
224
210
@@ -248,7 +234,7 @@ The following example filters for challenges with `outcome` `succeeded` and `num
248
234
> }
249
235
> ```
250
236
251
-
#### Using `or` Operator
237
+
##### `OR` Operator
252
238
253
239
Thefollowingexamplefiltersforchallengeswith `outcome` `succeeded` or `number` greaterthanorequalto `100`.
254
240
@@ -264,7 +250,7 @@ The following example filters for challenges with `outcome` `succeeded` or `numb
264
250
}
265
251
```
266
252
267
-
> **Note**: When writing queries, it is important to consider the performance impact of using the `or` operator. While `or` can be a useful tool for broadening search results, it can also have significant costs. One of the main issues with `or` is that it can cause queries to slow down. This is because `or` requires the database to scan through multiple indexes, which can be a time-consuming process. To avoid these issues, it is recommended that developers use and operators instead of or whenever possible. This allows for more precise filtering and can lead to faster, more accurate queries.
253
+
> **Note**: When constructing queries, it is important to consider the performance impact of using the `or` operator. While `or` can be a useful tool for broadening search results, it can also have significant costs. One of the main issues with `or` is that it can cause queries to slow down. This is because `or` requires the database to scan through multiple indexes, which can be a time-consuming process. To avoid these issues, it is recommended that developers use and operators instead of or whenever possible. This allows for more precise filtering and can lead to faster, more accurate queries.
268
254
269
255
#### All Filters
270
256
@@ -301,15 +287,15 @@ In addition, the following global filters are available as part of `where` argum
301
287
_change_block(number_gte: Int)
302
288
```
303
289
304
-
### Time-travel Queries
290
+
### Time-travel queries
305
291
306
292
You can query the state of your entities not just for the latest block, which is the default, but also for an arbitrary block in the past. The block at which a query should happen can be specified either by its block number or its block hash by including a `block` argument in the toplevel fields of queries.
307
293
308
294
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.
309
295
310
296
> 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. [This issue](https://github.com/graphprotocol/graph-node/issues/1405) explains what these limitations are in detail.
311
297
312
-
#### Example Time-travel Queries
298
+
#### Example
313
299
314
300
```graphql
315
301
{
@@ -325,6 +311,8 @@ The result of such a query will not change over time, i.e., querying at a certai
325
311
326
312
This query will return `Challenge` entities, and their associated `Application` entities, as they existed directly after processing block number 8,000,000.
@@ -339,24 +327,24 @@ This query will return `Challenge` entities, and their associated `Application`
339
327
340
328
This query will return `Challenge` entities, and their associated `Application` entities, as they existed directly after processing the block with the given hash.
341
329
342
-
### Full-text Search Queries
330
+
### Fulltext Search Queries
343
331
344
-
Full-text search query fields provide an expressive text search API that can be added to the Subgraph schema and customized. Refer to [Defining Full-text Search Fields](/developing/creating-a-subgraph/#defining-fulltext-search-fields) to add full-text search to your Subgraph.
332
+
Fulltext search query fields provide an expressive text search API that can be added to the Subgraph schema and customized. Refer to [Defining Fulltext Search Fields](/developing/creating-a-subgraph/#defining-fulltext-search-fields) to add fulltext search to your Subgraph.
345
333
346
-
Full-text search queries have one required field, `text`, for supplying search terms. Several special full-text operators are available to be used in this `text` search field.
334
+
Fulltext search queries have one required field, `text`, for supplying search terms. Several special fulltext operators are available to be used in this `text` search field.
347
335
348
-
Full-text search operators:
336
+
Fulltext search operators:
349
337
350
338
| Symbol | Operator | Description |
351
-
| --- | --- | --- | --- |
339
+
| --- | --- | --- |
352
340
|`&`|`And`| For combining multiple search terms into a filter for entities that include all of the provided terms |
353
-
|||`Or`| Queries with multiple search terms separated by the or operator will return all entities with a match from any of the provided terms |
341
+
|||`Or`| Queries with multiple search terms separated by the or operator will return all entities with a match from any of the provided terms |
354
342
|`<->`|`Follow by`| Specify the distance between two words. |
355
343
|`:*`|`Prefix`| Use the prefix search term to find words whose prefix match (2 characters required.) |
356
344
357
-
#### Full-text Query Examples
345
+
#### Examples
358
346
359
-
Using the `or` operator, this query will filter to blog entities with variations of either "anarchism" or "crumpet" in their full-text fields.
347
+
Using the `or` operator, this query will filter to blog entities with variations of either "anarchism" or "crumpet" in their fulltext fields.
360
348
361
349
```graphql
362
350
{
@@ -369,7 +357,7 @@ Using the `or` operator, this query will filter to blog entities with variations
369
357
}
370
358
```
371
359
372
-
The `follow by` operator specifies that two words must appear a specific distance apart in full-text documents.. The following query will return all blogs with variations of "decentralize" followed by "philosophy"
360
+
The `follow by` operator specifies a words a specific distance apart in the fulltext documents. The following query will return all blogs with variations of "decentralize" followed by "philosophy"
373
361
374
362
```graphql
375
363
{
@@ -382,7 +370,7 @@ The `follow by` operator specifies that two words must appear a specific distanc
382
370
}
383
371
```
384
372
385
-
Combine full-text operators to make more complex filters. With a pretext search operator combined with a follow by this example query will match all blog entities with words that start with "lou" followed by "music".
373
+
Combine fulltext operators to make more complex filters. With a pretext search operator combined with a follow by this example query will match all blog entities with words that start with "lou" followed by "music".
386
374
387
375
```graphql
388
376
{
@@ -399,6 +387,20 @@ Combine full-text operators to make more complex filters. With a pretext search
399
387
400
388
Graph Node implements [specification-based](https://spec.graphql.org/October2021/#sec-Validation) validation of the GraphQL queries it receives using [graphql-tools-rs](https://github.com/dotansimha/graphql-tools-rs#validation-rules), which is based on the [graphql-js reference implementation](https://github.com/graphql/graphql-js/tree/main/src/validation). Queries which fail a validation rule do so with a standard error - visit the [GraphQL spec](https://spec.graphql.org/October2021/#sec-Validation) to learn more.
401
389
390
+
## Schema
391
+
392
+
The schema of your dataSources, i.e. the entity types, values, and relationships that are available to query, are defined through the [GraphQL Interface Definition Language (IDL)](https://facebook.github.io/graphql/draft/#sec-Type-System).
393
+
394
+
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 [Subgraph manifest](/developing/creating-a-subgraph/#components-of-a-subgraph).
395
+
396
+
> Note: Our API does not expose mutations because developers are expected to issue transactions directly against the underlying blockchain from their applications.
397
+
398
+
### Entities
399
+
400
+
All GraphQL types with `@entity` directives in your schema will be treated as entities and must have an `ID` field.
401
+
402
+
> **Note:** Currently, all types in your schema must have an `@entity` directive. In the future, we will treat types without an `@entity` directive as value objects, but this is not yet supported.
403
+
402
404
### Subgraph Metadata
403
405
404
406
All Subgraphs have an auto-generated `_Meta_` object, which provides access to Subgraph metadata. This can be queried as follows:
0 commit comments