メインコンテンツへスキップ

動的スキーマ生成

ChainStream GraphQLスキーマは、activecube-rs(Rustライブラリ)によって起動時に動的に生成されます。このライブラリはCube定義を完全に型付けされたasync-graphqlスキーマにコンパイルします。各CubeはOLAPテーブルに裏付けられた分析データモデルにマッピングされ、activecube-rsは以下を自動生成します:
  • CubeのトップレベルQueryフィールド(チェーングループの下にネスト)
  • 選択可能なディメンションを表すRecordタイプ{Cube}Record
  • ディメンション階層に一致するFilterインプット{Cube}Filter
  • すべてのディメンションパスに対するASC/DESCバリアントを持つOrderBy enum{Cube}OrderBy
これにより、スキーマは常に基盤となるデータモデルと同期しています — 手書きのSDLファイルを維持する必要はありません。
スキーマはCube定義から生成されるため、Rustで追加された新しいデータモデルはデプロイ後に自動的にGraphQLエンドポイントに反映されます。

ルートクエリ構造

ルートクエリタイプはChainStreamです。Cubeは3つのチェーングループに整理され、それぞれがトップレベルフィールドとして公開されます:
type ChainStream {
  EVM(network: Network!, dataset: Dataset, aggregates: Aggregates) {
    DEXTrades(...): [DEXTradesRecord!]!
    Transfers(...): [TransfersRecord!]!
    BalanceUpdates(...): [BalanceUpdatesRecord!]!
    Blocks(...): [BlocksRecord!]!
    Transactions(...): [TransactionsRecord!]!
    Events(...): [EventsRecord!]!
    Calls(...): [CallsRecord!]!
    # ... more EVM Cubes
  }

  Solana(dataset: Dataset, aggregates: Aggregates) {
    DEXTrades(...): [DEXTradesRecord!]!
    Instructions(...): [InstructionsRecord!]!
    DEXOrders(...): [DEXOrdersRecord!]!
    # ... more Solana Cubes
  }

  Trading(dataset: Dataset, aggregates: Aggregates) {
    Pairs(...): [PairsRecord!]!
    Tokens(...): [TokensRecord!]!
  }
}
MutationSubscriptionタイプはありません — GraphQL APIは読み取り専用の分析クエリです。

チェーングループ

Cubeは対象とするブロックチェーンエコシステムに基づいて3つのグループに整理されています:
チェーングループnetwork引数利用可能なネットワーク説明
EVM必須ethbscpolygonすべてのEVM互換チェーンの共有Cube
Solana不要sol(暗黙的)チェーン固有のCube(Instructions、DEXOrders)を含むSolana用Cube
Trading不要クロスチェーン(solethbscchainディメンション付きの事前集計トレーディング分析(OHLCローソク足、トークン統計)
EVMグループはクエリするチェーンを選択するためにnetwork引数が必要です。SolanaTradingnetwork引数不要です — Solanaは暗黙的で、Tradingはデータ内にchainディメンションを含みます。
各グループに属するCubeの完全な内訳はチェーングループをご覧ください。

チェーングループパラメータ

すべてのチェーングループは、データソースの動作を制御する2つのオプションパラメータを受け付けます:

Dataset

datasetパラメータはクエリされるデータの時間スコープを制御します:
説明
combined全範囲 — 最新データと履歴データの両方をクエリ (デフォルト)
realtime最新データのみ(約24時間以内)
archive保持TTLまでの履歴データ
query {
  Solana(dataset: realtime) {
    DEXTrades(limit: {count: 10}, orderBy: Block_Time_DESC) {
      Block { Time }
      Trade { Buy { Amount } }
    }
  }
}

Aggregates

aggregatesパラメータは事前集計(DWM/DWS)テーブルを使用するかどうかを制御します:
説明
yes利用可能な場合、事前集計テーブルを優先 (対象Cubeのデフォルト)
no生の詳細テーブルのみを使用
only事前集計テーブルのみを使用(高速だがフィールドが限定)
query {
  Trading(aggregates: only) {
    Pairs(
      where: { Token: { Address: { is: "0x..." } } }
      limit: {count: 100}
    ) {
      Interval { Time }
      Price { Ohlc { Open High Low Close } }
      Volume { Usd }
    }
  }
}
詳細な使用方法、対応テーブル、パフォーマンスガイダンスについてはデータセットとアグリゲートをご覧ください。

共通引数パターン

チェーングループ内で、すべてのCubeフィールドは同じ標準引数セットに加え、オプションのCube固有セレクターを受け付けます:
引数必須説明
where{Cube}Filterいいえディメンション階層に一致するネストされたフィルタオブジェクト
limitLimitInputいいえページネーション:{count: Int, offset: Int}
orderBy{Cube}OrderByいいえソート順enum({Path}_ASC / {Path}_DESC
セレクターフィルタインプットいいえショートカットフィルタ(例:tokenAddress: {is: "..."}
query {
  Solana {
    DEXTrades(
      tokenAddress: {is: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"}
      where: { Block: { Time: { after: "2026-01-01T00:00:00Z" } } }
      limit: { count: 50, offset: 0 }
      orderBy: Block_Time_DESC
    ) {
      Block { Time }
      Trade { Buy { Amount PriceInUSD } }
    }
  }
}

LimitInput

input LimitInput {
  count: Int   # 返す行数
  offset: Int  # スキップする行数(ページネーション用)
}
デフォルトのcountはCubeにより異なります(通常25)。最大値はほとんどのCubeで10,000です。

Cubeごとに生成される型

各Cubeに対して、activecube-rsは3つのコンパニオン型を生成します:

Recordタイプ

{Cube}Record — すべての選択可能なディメンションとメトリクスを含む戻り値の型。フィールド構造はCubeのディメンション階層を反映します。

Filterインプット

{Cube}Filter — 各ディメンションがフィルタプリミティブ(StringFilterIntFilterDateTimeFilterなど)にマッピングされたネストされたインプットオブジェクト。

OrderBy Enum

{Cube}OrderBy — すべてのディメンションパスに対するASCとDESCの両方向のEnumバリアント(例:Block_Time_ASCTrade_Buy_Amount_DESC)。
DEXTradesの例:
# Record type (return shape)
type DEXTradesRecord {
  Block: DEXTradesBlockRecord
  Transaction: DEXTradesTransactionRecord
  Trade: DEXTradesTradeRecord
  Pool: DEXTradesPoolRecord
  IsSuspect: Boolean
  count: Int
  sum(of: DEXTradesSumOf!): Float
}

# Filter input
input DEXTradesFilter {
  Block: DEXTradesBlockFilter
  Transaction: DEXTradesTransactionFilter
  Trade: DEXTradesTradeFilter
  Pool: DEXTradesPoolFilter
  IsSuspect: BoolFilter
  any: [DEXTradesFilter!]  # OR logic
}

# OrderBy enum (partial)
enum DEXTradesOrderBy {
  Block_Time_ASC
  Block_Time_DESC
  Trade_Buy_Amount_ASC
  Trade_Buy_Amount_DESC
  # ...
}

イントロスペクション

スキーマは標準的なGraphQLイントロスペクションをサポートしています。__schema__typeクエリを使用して型、フィールド、引数を探索できます:
query {
  __schema {
    queryType {
      fields {
        name
        description
        args { name type { name } }
      }
    }
  }
}
GraphQL IDEはイントロスペクションスキーマを自動取得して自動補完とインラインドキュメントを提供します。手動でイントロスペクションクエリを書かなくてもスキーマ全体をインタラクティブに探索できます。

次のステップ

データキューブ

25のCubeすべてのフィールド、セレクター、データウェアハウスレイヤーを探索。

チェーングループ

EVM、Solana、Tradingチェーングループとその利用可能なCubeを理解。

データセットとアグリゲート

datasetaggregatesでデータソーススコープと事前集計動作を制御。

フィルタリング

whereフィルタとセレクターショートカットでクエリを絞り込む方法を学習。

ソートとページネーション

orderBylimitで結果をソートし、大きなデータセットをページネーション。

メトリクスと集計

countsumavgminmaxuniqでクエリ内のデータを集計。