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構築サービスを用意して、キャッシュする形にしてもよいかもしれません。