8 dakika
GraphQL API'ı
The Graph’te kullanılan GraphQL Sorgu API’ı hakkında bilgi edinin.
GraphQL Nedir?
[GraphQL] (https://graphql.org/learn/), API’lar için bir sorgu dili ve bu sorguları mevcut verileriniz üzerinde çalıştıran bir sorgu dilidir. The Graph, Subgraph’leri sorgulamak için GraphQL kullanır.
GraphQL’in daha kapsamlı rolünü anlamak için geliştirme ve bir Subgraph oluşturma bölümlerini inceleyin.
GraphQL Sorguları
Subgraph şemanızda, Entities
(Varlıklar) olarak adlandırılan türleri tanımlarsınız. Her bir Entity
(Varlık) türü için, üst düzey Query
türü üzerinde entity
ve entities
alanları otomatik olarak oluşturulur.
Not: The Graph’te, graphql
sorgularının başına query
(sorgu) ifadesinin eklenmesi gerekmez.
Örnekler
Şemanızda tanımlı tek bir Token
varlığı için sorgu:
1{2 token(id: "1") {3 id4 owner5 }6}
Not: Tek bir varlık sorgulanırken id
alanı zorunludur ve bir dize olarak yazılmalıdır.
Tüm Token
varlıklarını sorgulama:
1{2 tokens {3 id4 owner5 }6}
Sıralama
Bir koleksiyon sorgularken şunları yapabilirsiniz:
- Belirli bir özniteliğe göre sıralama yapmak için
orderBy
parametresini kullanın. - Sıralama yönünü belirtmek için
orderDirection
kullanın; artan sıralama içinasc
, azalan sıralama içindesc
.
Örnek
1{2 tokens(orderBy: price, orderDirection: asc) {3 id4 owner5 }6}
İç içe varlık sıralaması için örnek
Graph Düğümü v0.30.0
sürümünden itibaren, varlıklar iç içe ve varlıklara göre sıralanabilir.
Aşağıdaki örnek, token’ların sahip adına göre nasıl sıralandığını gösteriyor:
1{2 tokens(orderBy: owner__name, orderDirection: asc) {3 id4 owner {5 name6 }7 }8}
Şu anda, @entity
ve @derivedFrom
alanlarında bir seviye derinliğindeki String
veya ID
türlerine göre sıralama yapabilirsiniz. Ne yazık ki, bir seviye derinliğindeki varlıklarda arayüzlere göre sıralama, alanı bir dizi ya da iç içe bir varlık olan ögelere göre sıralama henüz desteklenmemektedir.
Sayfalandırma
Bir koleksiyon sorgularken aşağıdakileri uygulamanız önerilir:
- Koleksiyonun başından itibaren sayfalama yapmak için
first
parametresini kullanın.- Varsayılan sıralama düzeni, oluşturulma zamanına göre değil, artan alfasayısal sıraya göre
ID
alanına göre yapılır.
- Varsayılan sıralama düzeni, oluşturulma zamanına göre değil, artan alfasayısal sıraya göre
- Varlıkları atlamak ve sayfalama yapmak için
skip
parametresini kullanın. Örneğin,first:100
ilk 100 varlığı gösterir.first:100, skip:100
ise sonraki 100 varlığı gösterir. - Sorgularda
skip
değerlerini kullanmaktan kaçının, çünkü genellikle düşük performans gösterirler. Çok sayıda ögeyi getirmek için, yukarıdaki örnekte gösterildiği gibi bir özniteliğe göre varlıklar arasında sayfalama yapmak en iyi yaklaşımdır.
first
kullanımına örnek
İlk 10 tokeni sorgulayın:
1{2 tokens(first: 10) {3 id4 owner5 }6}
Bir koleksiyonun ortasındaki varlık gruplarını sorgulamak için, skip
parametresi first
parametresiyle birlikte kullanılabilir. Bu, koleksiyonun başından itibaren belirli sayıda varlığı atlayarak sorgulama yapmanızı sağlar.
first
ve skip
kullanımına örnek
Koleksiyonun başından itibaren 10 öge atlayarak 10 Token
varlığı sorgulama:
1{2 tokens(first: 10, skip: 10) {3 id4 owner5 }6}
first
ve id_ge
kullanımına örnek
Bir istemcinin çok sayıda varlık alması gerektiğinde, sorguları bir öznitelik temelinde oluşturmak ve bu özniteliğe göre filtrelemek daha yüksek performans sağlar. Örneğin, bir istemci aşağıdaki sorguyu kullanarak çok sayıda token alabilir:
1query manyTokens($lastID: String) {2 tokens(first: 1000, where: { id_gt: $lastID }) {3 id4 owner5 }6}
İlk seferde lastID = ""
ile sorgu gönderilecek ve sonraki istekler için lastID
değeri önceki istekteki son varlığın id
özelliğine göre ayarlanacaktır. Bu yaklaşım, artan skip
değerlerini kullanmaktan önemli ölçüde daha iyi performans gösterir.
Filtreleme
where
parametresini sorgularınızda farklı özellikleri filtrelemek için kullanabilirsiniz.- Birden çok değeri
where
parametresi içinde filtreleyebilirsiniz.
where
kullanımına örnek
outcome
değeri failed
olan challenge’ları sorgulama:
1{2 challenges(where: { outcome: "failed" }) {3 challenger4 outcome5 application {6 id7 }8 }9}
_gt
, _lte
gibi son ekleri değer karşılaştırması için kullanabilirsiniz:
Aralık filtreleme için örnek
1{2 applications(where: { deposit_gt: "10000000000" }) {3 id4 whitelisted5 deposit6 }7}
Blok filtreleme için örnek
Belirtilen bir blokta veya sonrasında güncellenen varlıkları, _change_block(number_gte: Int)
ile de filtreleyebilirsiniz.
Bu, yalnızca değişen varlıkları getirmek istiyorsanız kullanışlı olabilir. Örneğin, son yoklamanızdan bu yana değişen varlıklar için. Ya da, subgraph’inizde varlıkların nasıl değiştiğini araştırmak veya hata ayıklamak için faydalı olabilir (bir blok filtresiyle beraber kullanıldığında, yalnızca belirli bir blokta değişen varlıkları izole edebilirsiniz).
1{2 applications(where: { _change_block: { number_gte: 100 } }) {3 id4 whitelisted5 deposit6 }7}
İç içe varlık filtreleme örneği
İç içe varlıklara göre filtreleme, _
son ekine sahip alanlarda mümkündür.
Bu, yalnızca alt düzey varlıkları sağlanan koşulları karşılayan varlıkları getirmek istiyorsanız yararlı olabilir.
1{2 challenges(where: { application_: { id: 1 } }) {3 challenger4 outcome5 application {6 id7 }8 }9}
Mantıksal operatörler
Graph Düğümü v0.30.0
sürümünden itibaren, birden fazla kritere dayalı sonuçları filtrelemek için aynı where
argümanı içinde birden çok parametreyi and
veya or
operatörleriyle gruplayabilirsiniz.
AND
Operatörü
Aşağıdaki örnek, outcome
değeri succeeded
olan ve number
alanı 100
veya daha büyük olan challenge’ları filtreler.
1{2 challenges(where: { and: [{ number_gte: 100 }, { outcome: "succeeded" }] }) {3 challenger4 outcome5 application {6 id7 }8 }9}
Sözdizimsel şeker: Yukarıdaki sorguyu, virgülle ayrılmış bir alt ifade kullanıp and
operatörünü kaldırarak sadeleştirebilirsiniz.
1{2 challenges(where: { number_gte: 100, outcome: "succeeded" }) {3 challenger4 outcome5 application {6 id7 }8 }9}
OR
Operatörü
Aşağıdaki örnek, outcome
değeri succeeded
olan veya number
alanı 100
veya daha büyük olan challenge’ları filtreler.
1{2 challenges(where: { or: [{ number_gte: 100 }, { outcome: "succeeded" }] }) {3 challenger4 outcome5 application {6 id7 }8 }9}
Not: Sorguları oluştururken or
operatörünün performans üzerindeki etkisini dikkate almak önemlidir. or
, arama sonuçlarını genişletmek için faydalı bir araç olsa da, ciddi performans maliyetlerine yol açabilir. or
operatörünün başlıca sorunlarından biri, sorguların yavaşlamasına neden olmasıdır. Bunun nedeni, or
kullanıldığında veritabanının birden fazla endeksi taramak zorunda kalmasıdır; bu da zaman alıcı bir işlemdir. Bu tür sorunlardan kaçınmak için geliştiricilere mümkün olduğunca or
yerine and
operatörlerini kullanmaları önerilir. Bu sayede daha hassas filtreleme yapılabilir ve sorgular daha hızlı ve doğru şekilde çalışabilir.
Tüm Filtreler
Parametre eklerinin tam listesi:
1_2_not3_gt4_lt5_gte6_lte7_in8_not_in9_contains10_contains_nocase11_not_contains12_not_contains_nocase13_starts_with14_starts_with_nocase15_ends_with16_ends_with_nocase17_not_starts_with18_not_starts_with_nocase19_not_ends_with20_not_ends_with_nocase
Lütfen bazı son eklerin yalnızca belirli türler için desteklendiğini unutmayın. Örneğin, Boolean
türü yalnızca _not
, _in
ve _not_in
son eklerini destekler; ancak _
soneki yalnızca nesne ve arayüz türleri için kullanılabilir.
Ayrıca, where
argümanının bir parçası olarak aşağıdaki genel filtreler kullanılabilir:
1_change_block(number_gte: Int)
Zaman yolculuğu sorguları
Varlıklarınızın durumunu en son blok için (varsayılan), ya da geçmişteki herhangi bir blok için sorgulayabilirsiniz. Sorgunun hangi blokta yapılacağını belirtmek için, üst seviye sorgu alanlarında block
argümanı eklenerek ilgili blok numarası veya blok hash’i kullanılabilir.
Böyle bir sorgunun sonucu zamanla değişmez; yani, geçmişteki belirli bir blokta yapılan bir sorgu, ne zaman çalıştırılırsa çalıştırılsın aynı sonucu döndürür. Ancak, zincirin en ucuna (head) çok yakın bir blokta sorgulama yapılırsa, bu blok ana zincirde yer almıyorsa ve zincir yeniden düzenlenirse sonuç değişebilir. Bir blok artık kesin (final) olarak kabul edilebildiğinde, o blok için yapılan sorgunun sonucu değişmeyecektir.
Not: Mevcut uygulama, bu güvenceleri ihlal edebilecek bazı sınırlamalara hâlâ tabidir. Uygulama, verilen bir blok hash’inin ana zincirde yer almadığını her zaman tespit edemez veya henüz kesin (final) olarak kabul edilmeyen bir blok için yapılan bir blok hash sorgusunun, sorgu ile eşzamanlı olarak gerçekleşen bir zincir yeniden düzenlemesinden etkilenip etkilenmeyeceğini öngöremez. Ancak bu sınırlamalar, blok kesinleşmiş ve ana zincirde yer aldığı biliniyorsa, blok hash ile yapılan sorguların sonuçlarını etkilemez. Bu sınırlamalar hakkında ayrıntılı bilgi için bu GitHub issue’su incelenebilir.
Örnek
1{2 challenges(block: { number: 8000000 }) {3 challenger4 outcome5 application {6 id7 }8 }9}
Bu sorgu, blok numarası 8.000.000 işlendiği andan hemen sonraki halleriyle Challenge
varlıklarını ve bunlara bağlı Application
varlıklarını döndürecektir.
Örnek
1{2 challenges(block: { hash: "0x5a0b54d5dc17e0aadc383d2db43b0a0d3e029c4c" }) {3 challenger4 outcome5 application {6 id7 }8 }9}
Bu sorgu, verilen hash’e sahip blok işlendiği andan hemen sonraki halleriyle Challenge
varlıklarını ve bunlara bağlı Application
varlıklarını döndürecektir.
Tam Metin Arama Sorguları
Tam metin arama sorgu alanları, Subgraph şemasına eklenebilen ve özelleştirilebilen gelişmiş bir metin arama API’si sağlar. Subgraph’inize tam metin arama eklemek için Tam Metin Arama Alanlarını Tanımlama bölümüne bakın.
Tam metin arama sorgularında, arama terimlerinin girildiği zorunlu bir text
alanı bulunur. Bu text
arama alanında kullanılabilecek çeşitli özel tam metin operatörleri mevcuttur.
Tam metin arama operatörleri:
Sembol | Operatör | Tanım |
---|---|---|
& | And | Sağlanan tüm arama terimlerini içeren varlıkları filtrelemek için birden fazla arama terimini birleştirir |
| | Or | Or (veya) operatörüyle ayrılmış birden fazla arama terimi içeren sorgular, sağlanan terimlerden herhangi biriyle eşleşen tüm varlıkları döndürür |
<-> | Follow by | İki kelime arasındaki mesafeyi belirtmeyi sağlar. |
:* | Prefix | Ön eki (Prefix’i) eşleşen kelimeleri bulmak için ön ek arama terimini kullanın (en az 2 karakter gereklidir). |
Örnekler
or
operatörü kullanılarak yapılan bu sorgu, tam metin alanlarında “anarchism” veya “crumpet” kelimelerinin varyasyonlarını içeren blog varlıklarını döndürecektir.
1{2 blogSearch(text: "anarchism | crumpets") {3 id4 title5 body6 author7 }8}
follow by
operatörü, tam metin belgelerinde belirli bir mesafe ile birbirini izleyen kelimeleri belirtir. Aşağıdaki sorgu, “decentralize” kelimesinin varyasyonları ardından belirli bir mesafede “philosophy” kelimesini içeren tüm blogları döndürecektir.
1{2 blogSearch(text: "decentralized <-> philosophy") {3 id4 title5 body6 author7 }8}
Daha karmaşık filtreler oluşturmak için tam metin operatörlerini birleştirin. Bu örnek sorgu, bir pretext arama işleci ile bir follow by işlecini birleştirerek “lou” ile başlayan ve ardından “music” ile devam eden sözcükleri içeren tüm blog varlıklarıyla eşleşecektir.
1{2 blogSearch(text: "lou:* <-> music") {3 id4 title5 body6 author7 }8}
Validasyon
Graph Düğümü, graphql-js referans uygulamasını temel alan graphql-tools-rs’yi kullanarak aldığı GraphQL sorgularının spesifikasyon tabanlı doğrulamasını gerçekleştirir. Bir doğrulama kuralını geçemeyen sorgular standart bir hata ile sonuçlanır. Daha fazla bilgi için GraphQL spec’i ziyaret edin.
Şema
Veri kaynaklarınızın şeması, yani sorgulanabilir olan entity türleri, değerler ve ilişkiler, GraphQL Arayüz Tanım Dili (IDL) kullanılarak tanımlanır.
GraphQL şemaları genellikle queries
, subscriptions
ve mutations
için kök türleri tanımlar. The Graph yalnızca queries
desteği sunar. Subgraph’iniz için kök Query
türü, Subgraph manifesto dosyanıza dahil edilen GraphQL şemasından otomatik olarak oluşturulur.
Not: API’miz mutation (mutasyon) işlemlerini desteklemez, çünkü geliştiricilerin kendi uygulamaları üzerinden doğrudan temel blokzincirine işlem göndermeleri beklenir.
Varlıklar
Şemanızda @entity
yönergesiyle tanımlanan tüm GraphQL türleri varlık olarak kabul edilir ve bir ID
alanına sahip olmaları gerekir.
Not: Şu anda, şemanızdaki tüm türlerin @entity
yönergesine sahip olması gerekir. Gelecekte, @entity
yönergesi olmayan türler değer nesnesi olarak değerlendirilecek, ancak bu henüz desteklenmemektedir.
Subgraph Üst Verisi
Tüm Subgraph’lerde, Subgraph metadatasına erişim sağlayan otomatik olarak oluşturulmuş bir _Meta_
nesnesi bulunur. Buna aşağıdaki şekilde sorgu yapabilirsiniz:
1{2 _meta(block: { number: 123987 }) {3 block {4 number5 hash6 timestamp7 }8 deployment9 hasIndexingErrors10 }11}
Bir blok belirtilirse, metadata o bloğa ait durumu yansıtır; belirtilmezse en son endekslenmiş blok kullanılır. Belirtilen blok, Subgraph’in başlangıç bloğundan sonra ve en son endekslenmiş bloğa eşit ya da ondan küçük olmalıdır.
deployment
, subgraph.yaml
dosyasının IPFS CID’sine karşılık gelen özgün bir kimliktir.
block
, _meta
’ya iletilen herhangi bir blok kısıtlamasını dikkate alarak, en son blok hakkında bilgi sağlar:
- hash: bloğun hash değeri
- number: blok numarası
- timestamp: eğer mevcuts, blokun zaman damgası (bu şu anda yalnızca EVM ağlarını endeksleyen Subgraph’ler için kullanılabilir)
hasIndexingErrors
, spesifik bir Subgraph’in geçmişteki bir blokta endeksleme hatalarıyla karşılaşıp karşılaşmadığını belirten bir boolean ifadedir