使用Graph Indexer部署Social Graph的查询服务

这里将介绍如何快速构建一个 graph-indexer。

环境依赖

  1. 安装 jdk(要求 JDK11 及以上)

brew install openjdk@11

安装完成后检查

java -version
  1. 安装 nodejs

开始本教程之前,您的计算机上必须安装Node.js

  • 使用NVM安装 Node.js。

安装 jena-fuseki

安装 jena-fuseki 并运行:

wget  https://dlcdn.apache.org/jena/binaries/apache-jena-fuseki-4.7.0.tar.gz
tar xvf apache-jena-fuseki-4.7.0.tar.gz
cd apache-jena-fuseki-4.7.0
sh fuseki-server

创建数据集

浏览器访问 http://localhost:3030,并创建 demo 数据集(图 1-1、图 1-2)

一个简单的 Graph Indexer

这里我们使用 nodejs 来完成。

本示例将会监听Mumbai网络上32362681至32362699区块的RDF数据。

  1. 新建一个项目,安装 ethers(v5)axiosqs

mkdir graph-indexer
cd graph-indexer
npm init -y
npm install ethers@5 axios qs
  1. 监听链上数据,创建一个 app.js,内容如下:

const axios = require('axios')
const qs = require('qs')
const ethers = require('ethers')
const rpc = 'https://polygon-mumbai.blockpi.network/v1/rpc/public'
let abi = ['event CreateRDF(uint256 indexed tokenId, string rdfStatements)']
const provider = new ethers.providers.JsonRpcProvider(rpc)
const iface = new ethers.utils.Interface(abi)
const filter = {}

// 监听链上所有新的事件
provider.on(filter, async (e) => {
  try {
    let event = iface.parseLog(e)
    if (event) {
      const rdf = event.args[1]
        // todo: 做自己的业务逻辑
      const res = await insertRdf(rdf)
    }
  } catch (error) {}
})

// 也可以获取指定filter的数据
const logFilter = {
  fromBlock: 32362681,
  toBlock: 32362699
}
provider
  .getLogs(logFilter)
  .then(function (logs) {
    for (let index = 0; index < logs.length; index++) {
      try {
        const log = logs[index]
        const event = iface.parseLog(log)
        if (event) {
          const rdf = event.args[1]
          insertRdf(rdf)
        }
      } catch (error) {}
    }
  })
  .catch(function (err) {
    console.log(err)
  })

// 将rdf插入数据库
function insertRdf(rdfString) {
  const data = qs.stringify({
    update: `PREFIX : <http://relationlabs.ai/entity/>
    PREFIX p: <http://relationlabs.ai/property/>
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    INSERT DATA  {
      ${rdfString}
    }`
  })
  const config = {
    method: 'post',
    maxBodyLength: Infinity,
    url: 'http://localhost:3030/demo/update',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    data: data
  }

  return axios(config)
    .then(function (response) {
      console.log(JSON.stringify(response.data))
    })
    .catch(function (error) {
      console.log(error)
    })
}
  1. 运行 Graph Indexer 程序

node app.js

等待数据插入后,即可在http://localhost:3030/#/dataset/demo/query中查询到

Last updated