メインコンテンツへスキップ
ChainStream GraphQLでデータをフィルタリングする方法は2つあります:
  1. セレクターショートカットtokenAddressのようなトップレベル引数で、一般的なフィルタの便利な省略形を提供
  2. where引数 — 全範囲のオペレータと任意のディメンションフィルタリングをサポートするネストされたフィルタオブジェクト
同じクエリ内で両方を組み合わせることができます。

セレクターショートカット

セレクターはCubeフィールドの便利な引数で、一般的なwhereフィルタパターンにマッピングされます。whereフィールドと同じフィルタインプットタイプ(例:isinlikeなどのStringFilter)を受け付けます。単純な文字列ではありません。
セレクターマッピング先利用可能なCube
tokenAddress各Cubeの主要トークンアドレスカラムDEXTrades、Transfers、BalanceUpdates、DEXPools、TokenSupplyUpdates、Pairs、Tokens、DEXPoolEvents、TokenHolders
walletAddressウォレット/アカウントオーナーアドレスDEXTrades、WalletTokenPnL
poolAddressプールコントラクトアドレスDEXTrades、DEXPools
senderAddressトランスファー送信者アドレスTransfers
receiverAddressトランスファー受信者アドレスTransfers
ownerAddressトークンアカウントオーナーアドレスBalanceUpdates
dexProgramDEXプログラム/コントラクトアドレスDEXTrades
dateブロックタイムスタンプ(DateTimeフィルタ)DEXTrades、Transfers、BalanceUpdates、DEXPools
以下の2つのクエリは同等です:
query {
  DEXTrades(
    network: sol
    tokenAddress: {is: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"}
    limit: { count: 10 }
  ) {
    Block { Time }
    Trade { Buy { Amount PriceInUSD } }
  }
}
セレクターは完全一致だけでなくすべてのフィルタオペレータをサポートします。例えば、tokenAddress: {in: ["ADDR_1", "ADDR_2"]}は複数のトークンにマッチし、date: {after: "2025-01-01T00:00:00Z"}は時間でフィルタリングします。

where引数

where引数は、Cubeのディメンション階層を反映するネストされたインプットオブジェクトを受け付けます。各リーフフィールドは型付きオペレータを持つフィルタプリミティブにマッピングされます。

構造

where: {
  DimensionGroup: {
    DimensionField: {
      operator: value
    }
  }
}
— ブロック時間が特定の日付以降、かつ購入金額が1000以上のDEXTradesをフィルタ:
query {
  DEXTrades(
    network: sol
    where: {
      Block: { Time: { after: "2025-01-01T00:00:00Z" } }
      Trade: { Buy: { Amount: { gt: 1000 } } }
    }
    limit: { count: 20 }
  ) {
    Block { Time }
    Trade { Buy { Amount PriceInUSD } }
  }
}
whereの同じレベルで複数のフィールドが指定された場合、ANDロジックで結合されます。

フィルタプリミティブの型

すべてのリーフディメンションは以下のフィルタインプットタイプのいずれかにマッピングされます:

StringFilter

アドレス、ハッシュ、プロトコル名などのテキストフィールド用。
オペレータ説明
isString完全一致
notString不一致
in[String!]リスト内のいずれかの値にマッチ
notIn[String!]リスト内のすべての値を除外
likeStringSQL LIKEパターンマッチング(%ワイルドカード)
where: {
  Trade: {
    Dex: {
      ProtocolName: { in: ["Raydium", "Orca"] }
    }
  }
}

IntFilter / FloatFilter

金額、価格、カウントなどの数値フィールド用。
オペレータ説明
eqNumber等しい
neNumber等しくない
gtNumberより大きい
gteNumber以上
ltNumberより小さい
lteNumber以下
in[Number!]リスト内のいずれかの値にマッチ
notIn[Number!]リスト内のすべての値を除外
where: {
  Trade: {
    Buy: {
      PriceInUSD: { gte: 0.001, lte: 1.0 }
    }
  }
}

DateTimeFilter

タイムスタンプフィールド用。値はISO 8601文字列です。
オペレータ説明
afterDateTimeこのタイムスタンプ以降(排他的)
beforeDateTimeこのタイムスタンプ以前(排他的)
sinceDateTimeこのタイムスタンプ以降(包括的)
tillDateTimeこのタイムスタンプまで(包括的)
between[DateTime!, DateTime!]2つのタイムスタンプ間(両端包括的)
where: {
  Block: {
    Time: { since: "2025-03-01T00:00:00Z", till: "2025-03-31T23:59:59Z" }
  }
}
after/before排他的(厳密な不等式)です。since/till包括的です。betweenは2要素の配列を取り、両端が包括的です。

BoolFilter

ブーリアンフィールド用。
オペレータ説明
eqBooleantrueまたはfalseに等しい
where: {
  IsSuspect: { eq: true }
}

anyによるORロジック

デフォルトでは、where内のすべての条件はANDで結合されます。ORロジックを表現するには、any配列フィールドを使用します — 各要素は完全なフィルタオブジェクトであり、いずれかにマッチするレコードが返されます。
query {
  DEXTrades(
    network: sol
    where: {
      any: [
        { Trade: { Buy: { Currency: { MintAddress: { is: "TOKEN_A" } } } } }
        { Trade: { Buy: { Currency: { MintAddress: { is: "TOKEN_B" } } } } }
      ]
    }
    limit: { count: 20 }
  ) {
    Trade {
      Buy { Currency { MintAddress } Amount }
    }
  }
}
anyは他のトップレベルのwhereフィールドと組み合わせることができます。any条件はOR結合された後、兄弟条件とAND結合されます。

デフォルトフィルタ

一部のCubeはデフォルトフィルタを自動的に適用します。where句でフィルタを明示的に設定することでオーバーライドできます。
Cubeデフォルトフィルタ効果
DEXTradesIsSuspect = falseデフォルトでボット/MEVトレードを除外
疑わしいトレードを含めるには、フィルタを明示的に設定します:
query {
  DEXTrades(
    network: sol
    where: { IsSuspect: { eq: true } }
    limit: { count: 10 }
  ) {
    Block { Time }
    Trade { Buy { Amount } }
    IsSuspect
  }
}
またはwhereIsSuspectを指定しないことでフィルタを完全に削除します — デフォルトのfalseが引き続き適用されます。疑わしいステータスに関係なくすべてのトレードをクエリするには、ORを使用します:
where: {
  any: [
    { IsSuspect: { eq: true } }
    { IsSuspect: { eq: false } }
  ]
}

セレクターとwhereの組み合わせ

セレクターとwhereフィルタはANDで結合されます。セレクターで主要エンティティをフィルタし、whereで追加の絞り込みを行えます:
query {
  DEXTrades(
    network: sol
    tokenAddress: {is: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"}
    where: {
      Block: { Time: { after: "2025-03-01T00:00:00Z" } }
      Trade: { Buy: { Amount: { gt: 100 } } }
    }
    orderBy: Block_Time_DESC
    limit: { count: 50 }
  ) {
    Block { Time }
    Transaction { Hash }
    Trade {
      Buy { Amount PriceInUSD }
      Sell { Currency { MintAddress } Amount }
      Dex { ProtocolName }
    }
  }
}
このクエリは、購入金額が100を超えるSolana上のUSDCトレードの最新50件を時間降順で取得します。

次のステップ

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

orderBylimitで結果をソートし、データをページネーション。

メトリクスと集計

フィルタリングされたデータをcount、sum、avg、min、max、uniqで集計。