Node.jsでSPARQLをつかってDB Pediaの情報を取得する

これまでDB Pediaの情報を取得する時、自力でGETのURLクエリを組み立てていました。しかしよくよく考えると、誰かがnpmでいい感じのもの出してるよなぁと思ったので、よさそうなものを試してみます。 ライブラリインス […]

広告ここから
広告ここまで

目次

    これまでDB Pediaの情報を取得する時、自力でGETのURLクエリを組み立てていました。しかしよくよく考えると、誰かがnpmでいい感じのもの出してるよなぁと思ったので、よさそうなものを試してみます。

    ライブラリインストール

    今回使うのはsparwl-http-clientです。「そうそう、こういうの欲しかった」という名前ですね。

    $ npm i -S sparql-http-client isomorphic-fetch

    ソースコード

    早速実装します。クエリの書き方がかなり楽になったのではないでしょうか。

    const fetch = require('isomorphic-fetch')
    const SparqlHttp = require('sparql-http-client')
    
    SparqlHttp.fetch = fetch
    
    // SPARQLエンドポイントを指定(DB Pedia)
    const endpoint = new SparqlHttp({endpointUrl: 'https://ja.dbpedia.org/sparql'})
    
    // SPARQLクエリを記述
    const query = `SELECT DISTINCT *
    WHERE {
      <https://ja.dbpedia.org/resource/東京都> ?p ?o .
    }`
    
    // Promise形式でデータを取得
    endpoint.selectQuery(query)
      .then(res => res.text())
      .then(body => {
        const result = JSON.parse(body)
        console.log(JSON.stringify(result, null, ' '))
      }).catch(err => console.error(err))

    これを実行すると、以下のように東京都に関する情報が取得できます。

    $ node test.js | head -n 20 
    {
     "head": {
      "link": [],
      "vars": [
       "p",
       "o"
      ]
     },
     "results": {
      "distinct": false,
      "ordered": true,
      "bindings": [
       {
        "p": {
         "type": "uri",
         "value": "https://www.w3.org/1999/02/22-rdf-syntax-ns#type"
        },
        "o": {
         "type": "uri",
         "value": "https://www.w3.org/2002/07/owl#Thing"
    

    実際に使えそうな処理にする

    上のサンプルのままだと、ちょっと使いにくいので手を入れます。

    const  {Converter}= require('sparqljson-to-tree')
    const converter = new Converter()
    
    const fetch = require('isomorphic-fetch')
    const SparqlHttp = require('sparql-http-client')
    
    SparqlHttp.fetch = fetch
    
    // which endpoint to query
    const endpoint = new SparqlHttp({endpointUrl: 'https://ja.dbpedia.org/sparql'})
    
    // the SPARQL query itself
    const query = `
    SELECT DISTINCT ?mascot ?name ?depiction ?comment
    WHERE {
      ?areamascots skos:broader <https://ja.dbpedia.org/resource/Category:地域限定のマスコット> ;
        rdfs:label ?areaname .
      ?mascot dbpedia-owl:wikiPageWikiLink ?areamascots ;
        rdfs:label ?name;
        rdfs:comment ?comment.
      OPTIONAL { ?mascot foaf:depiction ?depiction .  }
    }
    `
    
    // run query with promises
    endpoint.selectQuery(query)
      .then(res => res.text())
      .then(body => {
      const { results } = JSON.parse(body)
      results.bindings.forEach(item => {
        console.log(item.name.value)
        console.log(item.comment.value)
        if (item.depiction) console.log(item.depiction.value)
        console.log('\n')
      })
      }).catch(err => console.error(err))

    今度は地域限定のマスコットキャラクターについて、「名前」「説明文」「画像(あれば)」を取得します。

    $ node test.js | head -n 10
    うにまる
    うにまるは、北海道・奥尻島の着ぐるみのマスコットキャラクター。ウニが奥尻島の名産である事から、キタムラサキウニをモチーフにしている。北海道が進める地域雇用を活性化させる対策として、奥尻島観光のイメージの向上を呼びかける形で、観光協会と結び2001年に「タイムカプセルうにまる」という施設が開館になるのにあわせ、登場した。2001年4月28日、大型連休の第一日目にあたるこの日に公の場に姿をあらわす。なお、島内の小高い丘に「うにまるモニュメントパーク」が建造された。キタムラサキウニをイメージしたモニュメントは夜には美しくライトアップされ、「なべつる岩」とともに観光スポットとなっている。
    https://commons.wikimedia.org/wiki/Special:FilePath/Unimaru-kun_2011.JPG
    
    
    シーパラシー太
    シーパラシー太(シーパラ シーた)は、横浜・八景島シーパラダイスのマスコットキャラクターである架空の動物である。「シー太君」「シーパラ君」などと呼ばれている。実在する特定の動物をモデルにした訳ではないが、アシカとセイウチを併せた感覚でモチーフにしている。過去の公式サイト内にシー太のページが有り、それには『トドでもアザラシでもない!』と書かれていた。
    https://ja.wikipedia.org/wiki/Special:FilePath/Statue_of_Seapara_Sita.jpg
    

    いい感じに取れました。

    サービスに組み込むには

    このままアプリやサービスに組み込んでもいいのですが、GETの値が頻繁に変わることもあまりないかと思います。なので前にAWS API GatewayなどのサーバーレスなREST API構築サービスを用意して、キャッシュする形にしてもよいかもしれません。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark