查看原文
其他

区块链数据索引 SubQuery | 快速入门第四课:SubQuery 关系详解

Editor's Note

SubQuery入门开发第四期。

The following article is from OneBlock Community Author Kyrin


SubQuery 由 OnFinality 团队构建,允许用户在整个链中运行索引器来构建可通过 GraphQL 查询的数据集。该工具套件包括一个命令行界面,该命令行界面使项目可以生成自己的 SubQuery 项目,从而定义索引器应如何遍历和聚合自己的网络。SubQuery 节点程序包将为网络建立索引并支持 GraphQL 查询。借助这些工具,任何人都可以轻松创建和运行查询。其目标是成为 Substrate / Polkadot 生态系统的核心基础架构。OneBlock+ 与 SubQuery 在 2021 的最后一个月共同推出了「SubQuery 入门——轻松学会区块链数据索引开发」课程,已于 2022 年 1 月 10 日开课。通过课程 6 大模块的讲解,让你熟悉掌握如何将你的区块链项目建立 SubQuery 数据源从而进行链上数据索引,包括开发复杂的 SubQuery 项目和将其部署到 SubQuery 项目托管中。以下是第四课的知识总结与拓展:




   第四课课程大纲


  • 第四课 — SubQuery 关系
    • 一对一关系 
    • 一对多关系 
      • schema中定义一对多关系

      • 在mapping中处理一对多关系

      • 查询一堆多关系的数据
    • 练习:检索账户转账 
    • 多对多关系 
    • 反向查询
      • 练习:账户转账并使用反向查询





  实体关系



一个实体往往与其他实体有嵌套的关系。默认情况下,将字段值设置为另一个实体名称将定义这两个实体之间的一对一关系。当只有一个实体被映射到另一个实体时,实体关系被默认为一对一。




 一对一关


例如:护照只能属于一人,一个人只能持有一本护照(参考下面的例子):
type Person @entity { id: ID! passport: Passport!}
type Passport @entity { id: ID! owner: Person!}




一对多关系


例如:一个人可以拥有多个帐户。通过建立一个映射实体,将另外两个实体连接起来,可以实现多对多的关系。
type Account @entity { id: ID!}
type Transfer @entity { id: ID! amount: BigInt from: Account! to: Account!}




多对多关系


示例: 每个人是多个组(PersonGroup) 的一部分,而组中有多个不同的人(PersonGroup)。此外,还可以在中间实体的多个字段中创建同一实体的连接。
type Person @entity { id: ID! name: String!}
type PersonGroup @entity { id: ID! person: Person! Group: Group!}
type Group @entity { id: ID! name: String!}




 Lesson4实战


schema.graphql
type transfer @entity { id: ID! from: Account! to: Account! amount: BigInt!}
type Account @entity { id: ID!}

mappingHandlers.ts

import {SubstrateExtrinsic,SubstrateEvent,SubstrateBlock} from "@subql/types";import {Transfer, Account} from "../types";import {Balance, AccountId} from "@polkadot/types/interfaces";

export async function handleTransfer(event: SubstrateEvent): Promise<void> { const {event: {data: [fromAccount, toAccount, amount]}} = event; const record = new Transfer(`${event.block.block.header.number.toString()}-${event.idx}`) await makeSureAccount((fromAccount as AccountId).toString()); await makeSureAccount((toAccount as AccountId).toString()); record.fromId = (fromAccount as AccountId).toString(); record.toId = (toAccount as AccountId).toString(); record.amount = (amount as Balance).toBigInt(); await record.save();}
async function makeSureAccount(accountId:string): Promise<void> { const checkAccount = await Account.get(accountId); if(!checkAccount){ await new Account(accountId).save(); }mappingHandlers.ts




反向链接


要在一个实体上反向查找它的关系,请将 @derivedFrom 添加到字段并指向另一个实体的反向查找字段。这将在实体上创建一个可以查询的虚拟字段。通过将 Account 实体的 sentTransfer 或 receivedTransfer 字段设置为从各自的 from 或 to 字段派生的值,我们从一个 Account 实体中访问 Transfer 中“from” 的 Account。通过将 Account 实体的 sentTransfer 或 receivedTransfer 字段设置为从各自的 from 或 to 字段派生的值,我们从一个 Account 实体中访问 Transfer 中“from” 的 Account。
反向链接对于数据库的结构不会造成改变。在 schema.graphql 文件中加入两行 sendTransfer 和 receivedTransfer:
type transfer @entity { id: ID! from: Account! to: Account! amount: BigInt!}
type Account @entity { id: ID! sentTransfer: [transfer] @derivedFrom(field:"from") receivedTransfer: [transfer] @derivedFrom(field:"to")}




参考资料


    ● GraphQL 开发原则:https://principles.graphql.cn/

    ● SubQuery 开发文档:https://doc.subquery.network/

    课程示例代码:https://github.com/subquery/tutorials-validator-threshold


🎉 新课预告:「SubQuery 入门——轻松学会区块链数据索引开发」第二期将根据技术更迭以及学员反馈课程将全面升级,由 OneBlock+ 与 SubQuery 共同推出!通过课程 6 大模块的讲解,你将熟悉掌握如何将你的区块链项目建立 SubQuery 数据源从而进行链上数据索引,包括开发复杂的 SubQuery 项目和将其部署到 SubQuery 项目托管中。即使你是零基础开发者也可以学习本次课程,实现轻松为一个新区块链项目构建数据源,学会区块链数据索引开发。

报名链接:https://jhp.h5.xeknow.com/s/41DLRh





关于我们

One Block+ 是中国最大的 Substrate 技术开发者社区,也是 Parity 在亚洲唯一的运营合作伙伴,波卡生态早期项目的创始人、CTO、核心开发者大部分都来自 One Block+ 社区。

Twitter: https://twitter.com/OneBlock_

Medium: https://medium.com/@OneBlockplus

Telegram: https://t.me/oneblock_dev

Discord: https://discord.gg/z2XZZWEcaa

Bilibili: https://space.bilibili.com/1650224419

YouTube: https://www.youtube.com/channel/UCWo2r3wA6brw3ztr-JmzyXA

关于SubQuery


SubQuery是Polkadot的领先数据提供商,支持在Layer_1区块链(Polkadot)和去中心化应用程序之间建立索引和查询层。SubQuery的数据服务目前在大多数Polkadot,Kusama crowdloan和平行链拍卖网站使用。SubQuery 的协定是通过 SubQuery SDK 提取出区块链数据的特性,允许开发人员专注于部署其核心产品,而无需在定制后端技术上浪费精力。

     Website:

     https://www.subquery.network/


     Discord中文群:

     https://discord.gg/ysdwnUSTQC


     Telegram中文群:

     t.me/subquerychina


     Mixin中文群:

    https://subquery.mixinbots.com/join


往期精彩


SubQuery 入门开发 | 第六课:如何在SubQuery项目中进行性能调优


SubQuery 入门开发 | 第五课:SubQuery 索引 Moonbeam EVM 实战

SubQuery 入门开发 | 第三课:SubQuery 映射之事件和外部信息处理


SubQuery入门开发 | 第二期:SubQuery项目结构及区块处理


SubQuery入门开发 | 第一期:SubQuery简介与如何使用docker启动项目


SubQuery与OneBlock+共同打造首个区块链数据索引开发课!》


《SubQuery开发者指南丨如何更改区块链批处理大小?


SubQuery开发者指南丨如何从不同的区块高度开始》


SubQuery开发者指南丨教程 & 案例


SubQuery开发者指南丨了解有关GraphQL的更多信息


《SubQuery开发者指南丨如何连接SubQuery的新项目》


《SubQuery开发者指南丨如何部署SubQuery项目新版本》


SubQuery开发者指南丨发布SubQuery项目


《SubQuery开发者指南丨在本地运行 SubQuery》


《SubQuery开发者指南丨映射(Mapping)》


《SubQuery开发者指南丨GraphQL 架构(GraphQL Schema)》


《SubQuery丨开发者快速入门指南》


《SubQuery丨Hello world 入门简介》


《SubQuery开发者指南丨Hello World Explained》


《SubQuery开发者指南丨Hello World (由SubQuery 托管)》


《SubQuery 开发者指南丨安装 SubQuery》


《SubQuery开发者指南丨创建一个SubQuery项目》


《SubQuery开发者指南丨清单文件(Manifest File)》


《SubQuery开发者指南丨Sandbox》




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存