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
orderByparametresini kullanın. - Sıralama yönünü belirtmek için
orderDirectionkullanı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
firstparametresini kullanın.- Varsayılan sıralama düzeni, oluşturulma zamanına göre değil, artan alfasayısal sıraya göre
IDalanı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
skipparametresini kullanın. Örneğin,first:100ilk 100 varlığı gösterir.first:100, skip:100ise sonraki 100 varlığı gösterir. - Sorgularda
skipdeğ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
whereparametresini sorgularınızda farklı özellikleri filtrelemek için kullanabilirsiniz.- Birden çok değeri
whereparametresi 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_nocaseLü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