4 dakika
Subgraph Örnek Uygulama 5 - Zaman serileri ve Toplulaştırma ile Basitleştirip Optimize Edin
Özet
Leveraging the new time-series and aggregations feature in Subgraphs can significantly enhance both indexing speed and query performance.
Genel Bakış
Zaman serisi ve toplulaştırmalar, toplulaştırma hesaplamalarını veritabanına aktararak ve eşleme kodunu basitleştirerek, veri işleme yükünü azaltır ve sorguları hızlandırır. Bu yaklaşım, özellikle büyük hacimli zamana dayalı verilerle başa çıkarken etkilidir.
Zaman Serisi ve Toplulaştırmaların Faydaları
- İyileştirilmiş Endeksleme Süresi
- Yüklenmesi Gereken Daha Az Veri: Ham veri noktaları değiştirilemez zaman serisi varlıkları olarak depolandığı için, eşlemeler daha az veri işler.
- Veritabanı Tarafından Yönetilen Toplulaştırmalar: Toplulaştırmalar otomatik olarak veritabanı tarafından hesaplanır, bu da eşlemeler üzerindeki yükü azaltır.
- Basitleştirilmiş Eşleme Kodu
- Manuel Hesaplama Olmaması: Geliştiriciler artık eşlemelerde karmaşık toplulaştırma mantığı yazmak zorunda değildir.
- Azaltılmış Karmaşıklık: Kod bakımını basitleştirir ve hata olasılığını en aza indirir.
- Çok Daha Hızlı Sorgular
- Değişmez Veri: Tüm zaman serisi verileri değişmezdir. Bu da verimli depolama ve geri çağırmayı mümkün kılar.
- Verimli Veri Ayrımı: Toplulaştırmalar, ham zaman serisi verilerinden ayrı olarak depolanır, bu da sorguların önemli ölçüde —genellikle birkaç büyüklük derecesi— daha az veri işlemesine olanak tanır.
Önemli Hususlar
- Değişmez Veri: Zaman serisi verileri yazıldıktan sonra değiştirilemez, bu da veri bütünlüğünü sağlar ve endekslemeyi basitleştirir.
- Otomatik Kimlık Numarası ve Zaman Damgası Yönetimi: id (kimlik numarası) ve timestamp (zaman damgası) alanları graph-node tarafından otomatik olarak yönetilir, potansiyel hataları azaltır.
- Verimli Veri Depolama: Ham verileri toplulaştırmalardan ayırarak, depolama optimize edilir ve sorgular daha hızlı çalışır.
Zaman Serisi ve Toplulaştırmaları Nasıl Uygulanır
Prerequisites
You need spec version 1.1.0
for this feature.
Zaman Serisi Varlıklarının Tanımlanması
Bir zaman serisi varlığı, zaman içinde toplanan ham veri noktalarını temsil eder. @entity(timeseries: true)
notasyonu ile tanımlanır. Ana gereksinimler:
- Değişmezlik: Zaman serisi varlıkları her zaman değişmezdir.
- Zorunlu Alanlar:
id
:Int8!
türünde olmalı ve otomatik olarak artmalıdır.timestamp
:Timestamp!
türünde olmalı ve blok zaman damgasına otomatik olarak ayarlanmalıdır.
Örnek:
1type Data @entity(timeseries: true) {2 id: Int8!3 timestamp: Timestamp!4 amount: BigDecimal!5}
Toplulaştırma Varlıklarını Tanımlama
Bir toplulaştırma varlığı, bir zaman serisi kaynağından toplulaştırılmış değerleri hesaplar. @aggregation
ile tanımlanır. Ana bileşenler:
- Açıklama Argümanları:
intervals
: Zaman aralıklarını belirtir (örneğin,["hour", "day"]
).
Örnek:
1type Stats @aggregation(intervals: ["hour", "day"], source: "Data") {2 id: Int8!3 timestamp: Timestamp!4 sum: BigDecimal! @aggregate(fn: "sum", arg: "amount")5}
In this example, Stats aggregates the amount field from Data over hourly and daily intervals, computing the sum.
Toplulaştırılmış Verileri Sorgulama
Toplulaştırmalar, boyut ve zaman aralıklarına göre filtreleme ve geri alma imkanı sağlayan sorgu alanları aracılığıyla dışarı sunulur.
Örnek:
1{2 tokenStats(3 interval: "hour"4 where: { token: "0x1234567890abcdef", timestamp_gte: "1704164640000000", timestamp_lt: "1704251040000000" }5 ) {6 id7 timestamp8 token {9 id10 }11 totalVolume12 priceUSD13 count14 }15}
Toplulaştırmalarda Boyutların Kullanımı
Boyutlar, veri noktalarını gruplamak için kullanılan toplulaştırılmamış alanlardır. Belirli kriterlere dayalı toplulaştırmalar sağlarlar. Mesela, bir finansal uygulamadaki belirli bir token’a ait toplulaştırmaları elde etmek için kullanılırlar.
Örnek:
Zaman Serisi Varlığı
1type TokenData @entity(timeseries: true) {2 id: Int8!3 timestamp: Timestamp!4 token: Token!5 amount: BigDecimal!6 priceUSD: BigDecimal!7}
Boyut Kullanan Toplulaştırma Varlığı
1type TokenStats @aggregation(intervals: ["hour", "day"], source: "TokenData") {2 id: Int8!3 timestamp: Timestamp!4 token: Token!5 totalVolume: BigDecimal! @aggregate(fn: "sum", arg: "amount")6 priceUSD: BigDecimal! @aggregate(fn: "last", arg: "priceUSD")7 count: Int8! @aggregate(fn: "count", cumulative: true)8}
- Boyut Alanı: Token, verileri gruplar. Bu nedenle toplulaştırmalar her token için hesaplanır.
- Toplulaştırmalar:
- totalVolume: Miktarın (amount alanının) toplamı.
- priceUSD: Kayıtlı son priceUSD.
- count: Kayıtların kümülatif sayısı.
Toplulaştırma Fonksiyonları ve İfadeleri
Desteklenen toplulaştırma fonksiyonları:
- sum (toplama)
- count (sayma)
- min (asgari)
- max (azami)
- first (ilk)
- last (son)
@aggregate içindeki arg (argüman) şunlar olabilir
- Zaman serisi varlığındaki bir alan adı.
- Alanlar ve sabit değerler kullanılarak oluşturulan bir ifade.
Toplulaştırma İfadeleri Örnekleri
- Token Değerini Topla: @aggregate(fn: “sum”, arg: “priceUSD _ amount”)
- Azami Pozitif Tutar: @aggregate(fn: “max”, arg: “greatest(amount0, amount1, 0)”)
- Koşullu Toplama: @aggregate(fn: “sum”, arg: “case when amount0 > amount1 then amount0 else 0 end”)
Desteklenen operatörler ve fonksiyonlar arasında temel aritmetik (+, -, _, /) operatörleri, karşılaştırma operatörleri, mantıksal operatörler (and, or, not) ve SQL fonksiyonları (örneğin greatest, least, coalesce) bulunur.
Sorgu Parametreleri
- interval: Zaman aralığını belirtir (ör., “hour”).
- where: Boyutlara ve zaman damgası aralıklarına göre filtreler.
- timestamp_gte / timestamp_lt: Başlangıç ve bitiş zamanları için filtreler (dönem başlangıcından itibaren geçen mikrosaniye cinsinden).
Notlar
- Sıralama: Sonuçlar otomatik olarak zaman damgası ve id’ye göre azalan sırada sıralanır.
- Mevcut Veriler: Opsiyonel mevcut argüman, mevcut, kısmen doldurulmuş aralığı içerebilir.
Sonuç
Implementing timeseries and aggregations in Subgraphs is a best practice for projects dealing with time-based data. This approach:
- Performansı Artırır: Veri işleme yükünü azaltarak endeksleme ve sorgulamayı hızlandırır.
- Geliştirmeyi Basitleştirir: Eşlemelerde manuel toplulaştırma mantığı ihtiyacını ortadan kaldırır.
- Verimli Ölçeklenir: Hız veya yanıt verme süresinden ödün vermeden büyük hacimli verileri işler.
By adopting this pattern, developers can build more efficient and scalable Subgraphs, providing faster and more reliable data access to end-users. To learn more about implementing timeseries and aggregations, refer to the Timeseries and Aggregations Readme and consider experimenting with this feature in your Subgraphs.