tag:blogger.com,1999:blog-68191588361916806402024-02-07T11:54:58.595+09:00公共オープンデータ利活用研究室 mirko のブログ公共オープンデータ利活用研究室 mirko の<b>ホームページ本体は <a href="https://www.mirko.jp/">こちら</a></b> です。<br>
ブログでは、政府統計や Linked Data の活用法を中心に、思ったことを適当につぶやきます。mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.comBlogger21125tag:blogger.com,1999:blog-6819158836191680640.post-4504876968722073672021-12-07T19:34:00.010+09:002022-03-07T20:05:30.135+09:00メディア芸術DBクイズ のSPARQLクエリ解説<div style="text-align: left;">メディア芸術DBクイズ のSPARQLクエリについて解説します。 </div><div style="text-align: left;"><br />まず「マンガクイズ」のためのクエリについて。<br />マンガクイズが最も単純な仕組みで動作しています。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">1 まず以下のクエリを最初に1回だけリクエストして、対象となるデータの主語(?s)のレコード数を取得します。この結果をメモリに格納しておいて、それを最大値とした乱数をクイズ問題を作成するつど生成します。(この仕組みはアニメもゲームも同じ)</div><div style="text-align: left;"><span style="color: #2b00fe; font-family: courier;">PREFIX xsd: <http://www.w3.org/2001/XMLSchema#></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX schema: <https://schema.org/></span><br /><span style="color: #2b00fe; font-family: courier;">SELECT (count(?s) as ?count)</span><br /><span style="color: #2b00fe; font-family: courier;">WHERE {</span><br /><span style="color: #2b00fe; font-family: courier;">?s schema:genre "マンガ単行本シリーズ" ;</span><br /><span style="color: #2b00fe; font-family: courier;"> rdfs:label ?name ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:creator ?creator ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:datePublished ?time ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:publisher ?publisher ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:brand ?brand ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:numberOfItems ?numberOfItems ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:inLanguage "日本語" .</span><br /><span style="color: #2b00fe; font-family: courier;"> FILTER regex(?creator, "")</span><br /><span style="color: #2b00fe; font-family: courier;"> FILTER regex(?brand, "")</span><br /><span style="color: #2b00fe; font-family: courier;"> FILTER (xsd:integer(?numberOfItems) >= 5)</span><br /><span style="color: #2b00fe; font-family: courier;">}</span><br /><br /></div><div style="text-align: left;">2 次に以下のクエリで、実際にクイズに使うデータを取得します。<br /><span style="color: #2b00fe; font-family: courier;">PREFIX xsd: <http://www.w3.org/2001/XMLSchema#></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX schema: <https://schema.org/></span><br /><span style="color: #2b00fe; font-family: courier;">SELECT *</span><br /><span style="color: #2b00fe; font-family: courier;">WHERE {</span><br /><span style="color: #2b00fe; font-family: courier;">?s schema:genre "マンガ単行本シリーズ" ;</span><br /><span style="color: #2b00fe; font-family: courier;"> rdfs:label ?name ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:creator ?creator ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:datePublished ?time ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:publisher ?publisher ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:brand ?brand ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:numberOfItems ?numberOfItems ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:inLanguage "日本語" .</span><br /><span style="color: #2b00fe; font-family: courier;"> FILTER regex(?creator, "")</span><br /><span style="color: #2b00fe; font-family: courier;"> FILTER regex(?brand, "")</span><br /><span style="color: #2b00fe; font-family: courier;"> FILTER (xsd:integer(?numberOfItems) >= 5)</span><br /><span style="color: #2b00fe; font-family: courier;">} OFFSET 250</span><br /><span style="color: #2b00fe; font-family: courier;">LIMIT 20</span></div><div style="text-align: left;"><span style="color: #2b00fe; font-family: courier;"><br /></span>OFFSETの数字には、上記で生成した乱数をセットしてランダムにデータを取得するようにします。LIMITを20件にしている理由は、例えばマンガの作者を答える問題を出題した際、3択問題ですのでLIMIT 3、ということにすると、同じ作者がときどきかぶってしまうことがあります。LIMIT20にしておけば、万が一作者がかぶったとしても、そのときは20件のうちの別の作者に変えたらいいので、そういった保険的な意味合いで20件にしています。</div><div style="text-align: left;"><br />■ データを取得する必須項目<br /><span style="font-family: courier;"><span style="color: #2b00fe;">?name (作品名)</span><br /><span style="color: #2b00fe;">?creator (著者)</span><br /><span style="color: #2b00fe;">?time (出版年月)</span><br /><span style="color: #2b00fe;">?publisher (出版者(社))</span><br /><span style="color: #2b00fe;">?brand (出版ブランド名)</span><br /><span style="color: #2b00fe;">?numberOfItems (発刊した巻数)</span></span></div><div style="text-align: left;"><span style="color: #2b00fe;"><br /></span>■ 絞り込み項目<br /><span style="color: #2b00fe; font-family: courier;">?s schema:genre "マンガ単行本シリーズ" </span><br /> ⇒「マンガ単行本シリーズ」データセットをターゲットとする<br /><span style="color: #2b00fe; font-family: courier;">schema:inLanguage "日本語"</span><br /> ⇒ 日本語のマンガだけをターゲットとする<br /><span style="color: #2b00fe; font-family: courier;">FILTER regex(?creator, "") </span><br /> ⇒ 言語指定されている「著者」を除外する<br />(※enを除外し単純リテラルのみ抽出)<br /><span style="color: #2b00fe; font-family: courier;">FILTER regex(?brand, "") </span><br /> ⇒ 言語指定されている「出版ブランド名」を除外する<br />(※enを除外し単純リテラルのみ抽出)<br /><span style="color: #2b00fe; font-family: courier;">FILTER (xsd:integer(?numberOfItems) >= 5)</span><br /> ⇒ 単行本が5巻以上発刊されているマンガのみをターゲットにする<br />(※5巻以上の有名な作品のみにして問題を易しくするのが狙い)</div><div style="text-align: left;"><br />あとは上記で取得した必須項目データを、乱数を組み込んだプログラムにより組み合わせを変化させてクイズを生成します。問題種別の出題割合は以下のとおりにしています。<br />・作品名を回答する問題 50%<br />・著者名を回答する問題 30%<br />・出版社を回答する問題 20%</div><div style="text-align: left;"><br />アニメクイズもマンガと同じように最初に1回だけ最大値を取得し、あとはクイズのつど、クイズデータを取得します。以下はアニメデータを取得するクエリです。<br /><span style="color: #2b00fe; font-family: courier;">PREFIX xsd: <http://www.w3.org/2001/XMLSchema#></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX schema: <https://schema.org/></span><br /><span style="color: #2b00fe; font-family: courier;">PREFIX ma: <https://mediaarts-db.bunka.go.jp/data/property/></span><br /><span style="color: #2b00fe; font-family: courier;">SELECT *</span><br /><span style="color: #2b00fe; font-family: courier;">WHERE {</span><br /><span style="color: #2b00fe; font-family: courier;">?s schema:genre "アニメテレビレギュラーシリーズ" ;</span><br /><span style="color: #2b00fe; font-family: courier;"> rdfs:label ?name ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:productionCompany ?productionCompany ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:actor ?actor ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:contributor ?contributor ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:startDate ?startDate ;</span><br /><span style="color: #2b00fe; font-family: courier;"> schema:endDate ?endDate .</span><br /><span style="color: #2b00fe; font-family: courier;"> OPTIONAL{?s schema:publisher ?publisher.}</span><br /><span style="color: #2b00fe; font-family: courier;"> OPTIONAL{?s ma:programDuration ?programDuration .}</span><br /><span style="color: #2b00fe; font-family: courier;"> OPTIONAL{?s ma:originalWorkCreator ?originalWorkCreator .}</span><br /><span style="color: #2b00fe; font-family: courier;"> OPTIONAL{?s ma:numberOfPrograms ?numberOfPrograms .}</span><br /><span style="color: #2b00fe; font-family: courier;"> OPTIONAL{?s ma:periodDisplayed ?periodDisplayed .}</span><br /><span style="color: #2b00fe; font-family: courier;"> OPTIONAL{?s schema:track ?track .} </span><br /><span style="color: #2b00fe; font-family: courier;">}</span><br /><span style="color: #2b00fe; font-family: courier;">ORDER BY ?startDate</span><br /><span style="color: #2b00fe; font-family: courier;">OFFSET 400</span><br /><span style="color: #2b00fe; font-family: courier;">LIMIT 20</span></div><div style="text-align: left;"><span style="color: #2b00fe; font-family: courier;"><br /></span>クイズを作成する理屈は上述のマンガとほぼ同じですが、マンガと異なる点は、必須でない項目をOPTIONAL句で取得しているところ。例えば<br /><span style="color: #2b00fe; font-family: courier;"> OPTIONAL{?s schema:track ?track .} </span><br />でアニメの主題歌を取得しています。</div><div style="text-align: left;">OPTIONAL句にしないと「データ不存在」の分の結果セットが減ってしまうので、データ不存在が多い項目についてはOPTIONALにしているということです。<br />OPTIONAL句の項目は、それが無くても問題として成立するけどヒント的な感じで出題文に入れ込む、というパターンが多いです。</div><div style="text-align: left;"><br />ゲームクイズもだいたいマンガやアニメと同じ理屈で出題していますが、やや複雑な構造になっていますので詳しい説明は割愛します。以下のクエリでほぼ近いデータを得られます。</div><div style="text-align: left;"><span style="color: #2b00fe; font-family: courier;">PREFIX schema: <https://schema.org/> </span></div><div style="text-align: left;"><div><span style="color: #2b00fe; font-family: courier;">PREFIX dcterms: <http://purl.org/dc/terms/> </span></div><div><span style="color: #2b00fe; font-family: courier;">SELECT ?s ?gameName ?time ?gameGenre ?creator ?creatorName ?location ?character ?productionCompany ?productionCompanyName</span></div><div><span style="color: #2b00fe; font-family: courier;">WHERE { </span></div><div><span style="color: #2b00fe; font-family: courier;"> ?s schema:name ?gameName ;</span></div><div><span style="color: #2b00fe; font-family: courier;"> schema:datePublished ?time ;</span></div><div><span style="color: #2b00fe; font-family: courier;"> schema:keywords ?gameGenre . </span></div><div><span style="color: #2b00fe; font-family: courier;"> FILTER regex(?gameName, "") </span></div><div><span style="color: #2b00fe; font-family: courier;"> OPTIONAL {</span></div><div><span style="color: #2b00fe; font-family: courier;"> ?s dcterms:creator ?creator . </span></div><div><span style="color: #2b00fe; font-family: courier;"> ?creator schema:name ?creatorName.</span></div><div><span style="color: #2b00fe; font-family: courier;"> } </span></div><div><span style="color: #2b00fe; font-family: courier;"> OPTIONAL { ?s schema:contentLocation ?location .} </span></div><div><span style="color: #2b00fe; font-family: courier;"> OPTIONAL { ?s schema:character ?character . } </span></div><div><span style="color: #2b00fe; font-family: courier;"> OPTIONAL { </span></div><div><span style="color: #2b00fe; font-family: courier;"> ?s schema:productionCompany ?productionCompany . </span></div><div><span style="color: #2b00fe; font-family: courier;"> ?productionCompany schema:name ?productionCompanyName.</span></div><div><span style="color: #2b00fe; font-family: courier;"> }</span></div><div><span style="color: #2b00fe; font-family: courier;">}</span></div></div><div style="text-align: left;"><br /></div>mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-9165823830534738982019-10-30T21:06:00.000+09:002019-10-31T21:04:58.589+09:00引っ越しましたわたくし、引っ越しました。<br />
肉体の住まいの引っ越しではありません。<br />
<b>精神の住まい</b>であるWEBサーバの引っ越しです。<br />
非エンジニアの私が自力で引っ越しするのは大変でした。<br />
住所はこちらです。 <b><a href="https://www.mirko.jp/">https://www.mirko.jp</a></b><br />
<br />
なぜ引っ越そうと思ったか。<br />
これまでは一般的な共用レンタルサーバに住んでいました。<br />
年間3000円ちょっとの料金でサクサク動くし、PHPやPythonなどサーバサイドプログラムも動かせるし、インフラはプロに任せといたら安心だし、特段不自由を感じていませんでした。<br />
<br />
でも次第にやりたいことが増えてきちゃうんですね。人の欲望は際限がない。<br />
賃貸アパートでは壁に釘も打てないし、グランドピアノも置けない。<br />
<br />
でも、自分の家に物理サーバを建てるのはさすがに無理(奥様を説得できない)<br />
<br />
検討の結果、流行りのVPS仮想マシンを借りることにしました。<br />
コンクリート打ちっぱなしで中身は全くの空っぽ、でも電気ガス水道は引いてある賃貸マンション、というイメージでしょうか。<br />
仮想サーバでは Amazon AWS が有名ですが従量制なのでバズったときが怖い。<br />
自治体消滅アプリを公開したときは毎日10万を超えるアクセスがあり、おしっこ漏れそうなくらいビビりました。(アプリはすぐ消滅してしまいましたが…)<br />
よって、固定費用で、かつ京都の地元企業の <b><a href="https://www.kagoya.jp/cloud/vps/" target="_blank">KAGOYA </a></b>にしました。<br />
<br />
ちなみに、今まで使っていたレンタルサーバも京都の地元企業 <b><a href="https://www.netowl.jp/" target="_blank">ネットオウル</a></b> です。<br />
格安なのに安定したすばらしい速度でした。今までありがとう。<br />
mirko.jp のドメイン管理はこれまでどおりネットオウルでやってもらおう。<br />
<br />
で、VPSのサーバ構築ですが、まずOSを選ぶところからやるんですね。<br />
僕はここ20年くらいWindowsしか触ってないのでUNIXの最近のトレンドを全く知りません。頭の中は FreeBSD か RedHat か、というところで止まっていました。<br />
今は Ubuntu か CentOS のどっちにしよか、なんですね。<br />
ググったところ、日本国内では CentOS のシェアが高いけど世界的には Ubuntu が人気らしい。意識高い系のグローバルな僕は Ubuntu を選びました。英語できないけど。<br />
<br />
次にWEBサーバを作る。<br />
WEBサーバといえばアパッチ。<br />
<b>アパッチのおたけび「ウラララーーー!!」</b><br />
と叫びたくなったが、近年のトレンドはApacheではなくNginx(エンジンエックス)なんだって。<br />
Nginxのほうが静的サイトの公開には抜群に強いらしい。<br />
ということで、タッグパートナーのジェロニモを裏切りNginxと手を組む。<br />
<br />
次に mirko.jpドメインの適用。<br />
DNSサーバの設定はやったことなかったけど、なんとか完了。<br />
<br />
次にWEBサーバにファイルを送り込む方法。<br />
最近のトレンドはやっぱGitなんすかね。でもやっぱり馴染みのあるFTPがいいなぁ。<br />
ということで、Gitは一旦横に置いておいて、vsftpdを導入。<br />
<br />
次にPHP、MySql、phpMyAdminの導入。<br />
ワードプレスは使っていないけど、PHPで動くアプリは沢山作っているので、僕にとってはこいつらは必須。<br />
<br />
次にSSL証明書の導入。<br />
今やSSLは現代人のマストアイテムになってしまいました。そして僕のような下級国民には無料の Let's Encrypt 一択。貧者の味方。<br />
有効期限が3ヶ月しかないけど、CRONに書き込んでおけば自動更新もできちゃう。<br />
<br />
ここまでが、僕にとっての必須項目。<br />
でもせっかくなので他にもいろいろやってみる。<br />
<br />
まずメールサーバをたてる。<br />
僕がいつも使っているメールは、20年前から使っているプロバイダのやつ。<br />
POP3しか対応していないので、いいかげんIMAPにしたいという思いがある。<br />
かなり手こずったが、なんとか mirko.jpドメインのIMAPセキュアメールを作ることに成功。<br />
<br />
で、いざメールを乗り換えようと思ったが、ここで問題点がわかる。<br />
一つは、サーバがトラブったときにメールが使えなくなること。<br />
素人が趣味でたてたサーバなのでときどき落ちる。WEBサイトがしばらく落ちても別にどうってことないけど、メールサーバが落ちて大事なメールがブラックホールに吸い込まれたらヤバい。<br />
もう一つは、スパムのフィルターをかけるのが難しいこと。<br />
人気者である僕のアドレスには、夫の莫大な遺産を持て余している未亡人やら、某アイドルの謎マネージャーやらから山ほどメールが届くので対策が必要なのだ。<br />
頑張れば何とかなりそうな気もするが、僕の技術力ではちょっと難しいという印象。<br />
ということで、目途がつくまではテスト扱いにする。残念。<br />
<br />
次にグラフ型データベースの導入。<br />
ミスターLODとしては、自分専用のRDFストアが欲しいところ。<br />
これもかなり苦労したが、なんとかVirtuosoを導入することに成功。<br />
<b><a href="https://sparql.mirko.jp/" target="_blank">僕んちのSPARQLエンドポイント</a></b><br />
Endpoint URIは <b>https://sparql.mirko.jp</b><br />
今のところラーメンデータしか入れてませんが、よかったら遊んでみてね。<br />
CORS対応、service句も使えます。<br />
<br />
ここまでの総括<br />
-------------------------------------------------------<br />
<b>かかった時間:</b>10日間(約80時間)<br />
<b>費用:</b>税込660円(月額。KAGOYA VPS KVMの1コア/1G版)<br />
<b>勉強になった度:</b>★★★★★<br />
<b>得た満足感:</b>プライスレス<br />
<b>代償:</b>ひどい肩こり、腰痛、目の疲れ、家族の冷ややかな視線<br />
-------------------------------------------------------<br />
<br />
ここでクイズです。<br />
普通に仕事しながらどうやって10日で80時間を捻出したのでしょうか?<br />
答えはこれ。<br />
<b>平日 5時間×7日</b>を捻出<br />
<b>休日 15時間×3日</b>を捻出<br />
睡眠時間を削りました。頑丈な体に産んでくれた親に感謝。<br />
そして白い目で冷たく見守ってくれた家族にも感謝しよう。<br />
今日は早く寝よ。おやすみ。<br />
<br />mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-55729674030484912162019-09-18T18:45:00.000+09:002019-09-21T09:58:27.717+09:00法人しりとりのSPARQLクエリ解説<a href="https://www.mirko.jp/shiritori/"><b>法人しりとり</b></a>は、経済産業省の <a href="https://hojin-info.go.jp/hojin/TopPage" target="_blank"><b>法人インフォ</b></a> のSPARQL APIを利用したアプリである。
<br />
法人インフォでは、情報処理推進機構が提唱する <a href="https://imi.go.jp/goi/" target="_blank"><b>共通語彙基盤</b></a> を活用してデータモデルを作っており、RDFで実装されLODとして活用できるようになっている。
<br />
<a href="https://hojin-info.go.jp/sparql01/dataset.html" target="_blank"><b>こちら</b></a> が公開エンドポイント。
<br />
法人しりとりでは、以下のSPARQLクエリをリクエストし、しりとりに必要な情報を取得している。
<br />
<br />
<span style="color: blue; font-size: x-small;"><b>PREFIX hj: <http://hojin-info.go.jp/ns/domain/biz/1#>
<br />PREFIX ic: <http://imi.go.jp/ns/core/rdf#>
<br />SELECT ?s ?corporateName ?corporateKana ?pref ?city
<br />FROM <http://hojin-info.go.jp/graph/hojin>
<br />WHERE{
<br /> ?s hj:法人基本情報 ?key.
<br /> ?key ic:名称 _:keyCorporateName .
<br /> _:keyCorporateName ic:種別 '商号又は名称'.
<br /> _:keyCorporateName ic:表記 ?corporateName .
<br /> _:keyCorporateName ic:カナ表記 ?corporateKana .
<br /> ?key ic:住所 _:keyAddress .
<br /> _:keyAddress ic:種別 '住所' .
<br /> _:keyAddress ic:都道府県 ?pref .
<br /> _:keyAddress ic:市区町村 ?city .
<br /> FILTER(regex(str(?corporateKana), '^ア' ))
<br />}
<br />LIMIT 1
<br />OFFSET 300</b></span> <span style="color: red;">(←0から300までの乱数をセット)
</span><br />
<br />
上記クエリで、
<br />
<b>・法人番号(主語「s」から取得)
<br />・法人名
<br />・法人名カナ
<br />・法人住所(都道府県/市区町村)
</b><br />
を取得する。
<br />
<br />
ポイントは
<br />
<b><span style="color: blue;">FILTER(regex(str(?corporateKana), '^ア' ))
</span></b><br />
のところ。
<br />
正規表現regex関数で、法人名カナの頭文字が「ア」のものを抽出する。
<br />
ここの「ア」を変更することにより、しりとりを継続していく。
<br />
<br />
悩むのがOFFSETの扱い。
<br />
しりとりゲームを成立させるにはランダムに法人を抽出する必要があり、OFFSETに整数の乱数をセットすることによりそれを実装する。
<br />
しかしながら先頭文字によって法人の数は大きく異なる(アから始まる法人の数とヌから始まる法人の数は大差がある)ので、大きな数をOFFSETにセットすると字によっては法人総数をオーバーしてしまうし、小さな数にすると抽出されない法人が多数出てくる字もある。
<br />
解決策は、以下のクエリで各文字の法人数を取得し、その値を最大値とする乱数をセットすること。
<br />
<br />
<b><span style="color: blue; font-size: x-small;">PREFIX hj: <http://hojin-info.go.jp/ns/domain/biz/1#>
<br />PREFIX ic: <http://imi.go.jp/ns/core/rdf#>
<br />SELECT (COUNT(?corporateKana) AS ?count)
<br />FROM <http://hojin-info.go.jp/graph/hojin>
<br />WHERE{
<br /> ?s hj:法人基本情報 / ic:名称 / ic:カナ表記 ?corporateKana .
<br /> FILTER(regex(str(?corporateKana), '^ア' ))
<br />}
</span></b><br />
<br />
しかしながら上記のようにすると結局2回クエリを送信することになり、時間がかかり、しりとりのゲーム性が大きく損なわれる。
<br />
ゲームバランスを考えた結果、OFFSETは全ての文字で0~300で固定とすることとした。
<br />
(OFFSETが小さいほど処理が速くなる)
<br />
<br />
法人インフォのSPARQL APIのレスポンスがもっと速くなったら何の問題もないんですけどね…。
<br />
<br />
<br />mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-13101843274256808172019-09-04T21:24:00.000+09:002019-09-04T21:24:32.160+09:00「自治体の未来」のSPARQLクエリ「自治体の未来」は、政府統計総合窓口(e-Stat)の <a href="http://data.e-stat.go.jp/lodw/" target="_blank">統計LOD</a> から、過去の統計調査結果のデータ(国勢調査・人口動態等)を取得しています。<br />
以下のクエリを、<a href="http://data.e-stat.go.jp/lod/sparql/" target="_blank">統計LODのSPARQL Endpoint</a> にリクエストすると、統計LOD「<b>社会・人口統計体系データセット</b>」から、特定の自治体のあらゆる統計データを取得することができます。当アプリもこのクエリを使っています。<br />
------------------------------------------<br />
<span style="color: blue; font-size: x-small;">PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX g00200502-dimension:<http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/> </span><br />
<span style="color: blue; font-size: x-small;">PREFIX cd-dimension:<http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/> </span><br />
<span style="color: blue; font-size: x-small;">PREFIX sdmx-measure:<http://purl.org/linked-data/sdmx/2009/measure#> </span><br />
<span style="color: blue; font-size: x-small;">PREFIX sdmx-dimension:<http://purl.org/linked-data/sdmx/2009/dimension#> </span><br />
<span style="color: blue; font-size: x-small;">PREFIX sac:<http://data.e-stat.go.jp/lod/sac/> </span><br />
<span style="color: blue; font-size: x-small;">select ?indicatorURI ?indicatorName ?year ?value </span><br />
<span style="color: blue; font-size: x-small;">where { </span><br />
<span style="color: blue; font-size: x-small;">?s sdmx-dimension:refArea sac:C26103-19700401 ; </span><br />
<span style="color: blue; font-size: x-small;"> cd-dimension:timePeriod ?year ; </span><br />
<span style="color: blue; font-size: x-small;"> g00200502-dimension:indicator ?indicatorURI ; </span><br />
<span style="color: blue; font-size: x-small;"> sdmx-measure:obsValue ?value . </span><br />
<span style="color: blue; font-size: x-small;">?indicatorURI rdfs:label ?indicatorName . </span><br />
<span style="color: blue; font-size: x-small;">filter(LANG(?indicatorName)='ja') </span><br />
<span style="color: blue; font-size: x-small;">} ORDER BY ASC(?indicatorURI) ASC(?year) </span><br />
------------------------------------------<br />
<br />
上記は「京都市左京区」の統計データを取得するクエリ。<br />
sac:C26103-19700401 の部分が、京都市左京区の「期間付き標準地域コード」です。<br />
この部分を変えることにより、他の自治体のデータを取得することができます。<br />
<br />
(例)<br />
<span style="color: blue;">C02201-20070901 青森市</span><br />
<span style="color: blue;">C10201-20090505 前橋市</span><br />
<span style="color: blue;">C13104-19830818 東京都新宿区</span><br />
<span style="color: blue;">C13421-19700401 小笠原村</span><br />
<span style="color: blue;">C23100-20030729 名古屋市</span><br />
<span style="color: blue;">C18201-20060201 福井市</span><br />
<span style="color: blue;">C26103-19700401 京都市左京区</span><br />
<br />
以下のクエリで、2015年時点の全国の「期間付き標準地域コード」一覧を取得することができます。<br />
------------------------------------------<br />
<span style="color: blue; font-size: x-small;">PREFIX sdmx-dimension: <http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX qb: <http://purl.org/linked-data/cube#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX sacs: <http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX ic: <http://imi.go.jp/ns/core/rdf#></span><br />
<span style="color: blue; font-size: x-small;">select distinct ?code ?pref ?area</span><br />
<span style="color: blue; font-size: x-small;">where {</span><br />
<span style="color: blue; font-size: x-small;">?s sdmx-dimension:refArea ?code ;</span><br />
<span style="color: blue; font-size: x-small;"> qb:dataSet <http://data.e-stat.go.jp/lod/dataset/g00200521/d0003148521>.</span><br />
<span style="color: blue; font-size: x-small;">?code sacs:prefectureLabel ?pref ;</span><br />
<span style="color: blue; font-size: x-small;"> ic:表記 ?area ;</span><br />
<span style="color: blue; font-size: x-small;">}order by ?code</span><br />
------------------------------------------<br />
<div>
<br /></div>
mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-22005961504404818442019-06-05T22:32:00.000+09:002019-06-29T22:59:18.273+09:00横浜市保育所&幼稚園MAPのSPARQLクエリについてこのたび公開させていただいた <a href="https://www.mirko.jp/yokohama/" target="_blank"><b>横浜市保育所&幼稚園MAP</b></a> は、横浜市オープンデータポータルのWEB API(SPARQLエンドポイント)から必要なデータを取得している。<br />
<br />
・横浜市WEB APIの説明は <a href="https://data.city.yokohama.lg.jp/api.html" target="_blank">こちら</a><br />
・横浜市SPARQLエンドポイントは <a href="https://data.city.yokohama.lg.jp/sparql/" target="_blank">こちら</a><br />
<br />
このAPIデータは、共通語彙基盤の語彙とデータ構造が用いられている。保育所等のオープンデータを共通語彙基盤対応のLODとしたのはおそらく全国初であり、とても先駆的な取り組みといえる。<br />
<br />
やや残念な点は、施設の座標情報(緯度経度)データがないところ。自分の通勤経路にマッチした保育施設を探すには、やはり座標情報が欲しい!<br />
<br />
さて本稿では、横浜市APIで使えるSPARQLクエリと、それに対する考察を紹介する。<br />
<br />
<h3><b><span style="font-size: large;">1 全ての施設のID、名称、区、住所を取得するクエリ</span></b></h3><span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">select *</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">where {</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ?s ic:ID [ic:識別値 ?id ] ;</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ic:住所 [ ic:区 ?ku ; ic:表記 ?jusho ].</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{?s rdfs:label ?name .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}ORDER BY xsd:decimal(?id)</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif;"><br />
</span> <b>【備考1】</b><br />
施設の「名称」データが不存在のインスタンスがいくつかある。<br />
(データ作成時の何らかのミスが原因?)<br />
不存在に対応するため、名称を取得する部分はOPTIONAL句を付けている。<br />
<span style="color: blue; font-family: "verdana" , sans-serif;">OPTIONAL{?s rdfs:label ?name .}</span><br />
<b><br />
</b> <b>【備考2】</b><br />
結果を「施設ID」順に並べるのにORDER BYを利用するが、このIDは「桁が揃っていない文字列」なので、数値型に変換してから並べ直す必要がある。<br />
<span style="color: blue; font-family: "verdana" , sans-serif;">ORDER BY xsd:decimal(?id)</span><br />
ID番号は、桁数を揃えることが重要だよね。<br />
<br />
<br />
<h3><b><span style="font-size: large;">2 保土ケ谷区の施設を抽出するクエリ</span></b></h3><span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">select *</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">where {</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ?s ic:ID [ic:識別値 ?id ] ;</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ic:住所 [ ic:区 "保土ケ谷区" ; ic:表記 ?jusho ].</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{?s rdfs:label ?name .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif;"><br />
</span> <br />
<h3><b><span style="font-size: large;">3 「認可保育所」を抽出するクエリ</span></b></h3><span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">select *</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">where {</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ?s ic:ID [ic:識別値 ?id ] ;</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ic:住所 [ ic:区 ?ku ; ic:表記 ?jusho ].</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{?s rdfs:label ?name .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> FILTER CONTAINS(STR(?s),"保育所型/10")</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif;"><br />
</span> <b>【考察】</b><br />
すべての施設は、「保育所型」か「幼稚園型」のいずれかのクラスに属している。<br />
ただし、保育所型クラスに属する施設の、さらに詳細な施設種別は、クラスではなくプロパティで分類されている。よって、詳細な施設種別で分類するのは条件分岐がやや煩雑となる。(そもそもプロパティ設定自体が怪しい施設もあるし…)<br />
そこで着目したのが対象施設のSubject URI(各施設の主語URI。?s のこと)。<br />
施設種別で分類するには、?s に対し、下記の文字列を含むかどうかでフィルタリングするのが一番手っ取り早い。<br />
<span style="color: blue; font-family: "verdana" , sans-serif;">FILTER CONTAINS(STR(?s),"<u>保育所型/10</u>")</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif;"><br />
</span> <b>幼稚園型施設</b> → 「<b><span style="color: blue;">幼稚園型</span></b>」文字列が含まれる<br />
<b>認可保育所</b> → 「<span style="color: blue;"><b>保育所型/10</b></span>」文字列が含まれる<br />
<b>幼保連携型認定こども園</b> → 「<b><span style="color: blue;">保育所型/20</span></b>」文字列が含まれる<br />
<b>小規模保育事業</b> → 「<span style="color: blue;"><b>保育所型/30</b></span>」文字列が含まれる<br />
<b>家庭的保育事業</b> → 「<span style="color: blue;"><b>保育所型/40</b></span>」文字列が含まれる<br />
<b>事業所内保育事業</b> → 「<b><span style="color: blue;">保育所型/50</span></b>」文字列が含まれる<br />
<b>横浜保育室</b> → 「<b><span style="color: blue;">保育所型/60</span></b>」文字列が含まれる<br />
<b>届出済認可外保育施設</b> → 「<b><span style="color: blue;">保育所型/70</span></b>」文字列が含まれる<br />
<br />
<br />
<h3><span style="font-size: large;"> 4 1歳児の入所が可能な施設を抽出</span></h3><span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">select *</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">where {</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ?s ic:ID [ic:識別値 ?id ] ;</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ic:住所 [ ic:区 ?ku ; ic:表記 ?jusho ];</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> dsv:入所可能人数 [ic:種別 "1歳児" ; ic:数値 ?h_kanou_ninzu ].</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{?s rdfs:label ?name .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> FILTER (xsd:decimal(?h_kanou_ninzu) > 0 )</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif;"><br />
</span> <br />
<h3><span style="font-size: large;"> 5 「認定こども園 日野幼稚園」の全情報を取得</span></h3><span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">PREFIX hoiku:<https://data.city.yokohama.lg.jp/lod/v2/保育所型/> </span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">PREFIX yochi:<https://data.city.yokohama.lg.jp/lod/v2/幼稚園型/> </span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">select *</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">where {</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:メタデータ / ic:日付 [ic:標準型日付 ?a_joho_koshinbi] .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:ID [ic:識別値 ?a_id ] .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 rdfs:label ?a_name .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:種別コード [ic:種別 ?a_shubetsu ; ic:識別値 ?a_shubetsuData ] .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:住所 ?bn5 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ?bn5 ic:区 ?a_ku .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ?bn5 ic:表記 ?a_jusho .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL {?bn5 ic:郵便番号 ?a_yuubin.}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:アクセス ?bn5_2 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL {?bn5_2 ic:備考 ?h_ikikata .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:連絡先 ?bn6 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn6 ic:電話番号 ?a_tel.}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn6 ic:FAX番号 ?a_fax.}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn6 ic:Webサイト ?a_Web.}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:関与 ?bn8 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn8 ic:関与者 [ic:名称 [ic:表記 ?a_secchisha]].}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn8 ic:関与者 [ic:氏名 [ic:表記 ?y_encho]].}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:記述 ?bn10 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn10 ic:種別 ?a_sonotaL .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn10 ic:説明 ?a_sonotaD .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">hoiku:202060017 ic:利用可能時間 ?bn6_2 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn6_2 ic:種別 ?h_syubetsu }</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn6_2 ic:説明 ?h_setsumei }</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:建物 ?bn7 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn7 ic:建物面積 [ic:数値 ?h_tatemono]. }</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn7 ic:敷地面積 [ic:数値 ?h_shikichi]. }</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 dsv:評価 ?bn9 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> ?bn9 dsv:評価ステータス ?h_dai3sya .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn9 dsv:結果公表日時 ?h_dai3date .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn9 ic:参照 [ic:参照先 ?h_dai3URL ] .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:収容人数 [ic:種別 ?h_syuyou ; ic:数値 ?h_syuyouninzu ].</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 dsv:入所児童数 ?bn12 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn12 ic:種別 ?h_nyusyojidou .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn12 ic:数値 ?h_nyusyojidou_ninzu .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn12 ic:メタデータ / ic:日付 / ic:標準型日付 ?h_nyusyojidou_meta. }</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 dsv:入所可能人数 ?bn13 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn13 ic:種別 ?h_kanou .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn13 ic:数値 ?h_kanou_ninzu .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn13 ic:メタデータ / ic:日付 / ic:標準型日付 ?h_kanou_meta. }</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 dsv:入所待ち人数 ?bn14 .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn14 ic:種別 ?h_machi .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn14 ic:数値 ?h_machi_ninzu .}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> OPTIONAL{ ?bn14 ic:メタデータ/ ic:日付 / ic:標準型日付 ?h_machi_meta. }</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:備考 ?y_bikou .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 ic:料金 [ ic:種別 ?y_ryokins ; ic:説明 ?y_ryokin ].</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}UNION{</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;"> hoiku:202060017 dsv:認可年月日 ?y_ninka .</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}</span><br />
<span style="color: blue; font-family: "verdana" , sans-serif; font-size: small;">}</span><br />
<b><br />
</b> <b>【雑感】</b><br />
上記が、ある施設が有している全プロパティの値を表示させるクエリだ。<br />
施設によって、プロパティの存在・不存在がバラバラなので、UNION句とOPTIONAL句の組み合わせを工夫することによりそれに対応させている。<br />
<br />
しかしながらいつも思うのが、共通語彙基盤のRDFをグラフ型データベースから抽出するには、このような複雑な呪文を詠唱する必要があるため、<b>利活用のハードルがどーんと上がってしまうのが残念すぎる</b>こと。呪文が長い分、抽出効率も悪いし。<br />
<br />
一方、フラットな構造であるウィキデータから、例えば「横浜市役所」の持つ全部の情報を手に入れるのは、たった1行のクエリでできる。超かんたんで速い。スマート。<br />
<span style="color: blue; font-family: "verdana" , sans-serif;">SELECT * WHERE { wd:Q11543018 ?p ?o .}</span><br />
<br />
共通語彙基盤のデータ構造はマークアップ的でありXMLとは相性がいいが、それをグラフ構造(トリプル)にするとブランクノードが挟まりすぎて非常に扱いづらくなる。<br />
共通語彙基盤対応データは、グラフデータベースに突っ込んで使うより、XMLを直接パーシングするなり、JSON-LDのままjavascriptで取り込んじゃったりするほうが向いてるのではないかと思えてきた。このあたり、IMI関係者や有識者の意見をじっくり聞いてみたいところ。<br />
<br />
なお、横浜市の保育所等LODはURIの参照解決に対応しており、施設のSubject URIにアクセスするとJSON-LD形式で当該施設の全データが取り出せる。<br />
<a href="https://data.city.yokohama.lg.jp/lod/v2/%E4%BF%9D%E8%82%B2%E6%89%80%E5%9E%8B/202060017" target="_blank">https://data.city.yokohama.lg.jp/lod/v2/保育所型/202060017</a><br />
(読みたいときはUnicode(UTF16)でデコードしてください。)<br />
エンドポイントに呪文を送るより、素直に参照解決データを使うほうが簡単だったかも、とアプリを完成させてから思うのでありました。うーむ。。。<br />
<br />
mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-69104166978060864562019-03-06T21:04:00.006+09:002019-03-11T07:26:04.423+09:00統計LOD「社会・人口統計体系」について<b><a href="https://www.stat.go.jp/data/ssds/index.html" target="_blank">社会・人口統計体系</a> </b>とは、別名「<b>統計でみる都道府県・市区町村のすがた</b>」ともいい、あらゆる統計データを収集・加工し、これを地域別に編成し整備したものである。<br />
<br />
このデータをLOD化し、統計LODのエンドポイントからAPIでデータを取得できるようしたのは、総務省統計局及び(独)統計センターの大きな成果の一つだ。
<br />
<br />
この社会・人口統計体系LOD、上手に使いこなせれば非常に便利で、アイディア次第で面白いことがたくさんできる。
<br />
<br />
<a href="https://www.mirko.jp/ranking/" target="_blank"><b>あんなこと</b></a> や <a href="https://www.mirko.jp/townpower/" target="_blank"><b>こんなこと</b></a><br />
<br />
しかしながら現在、社会・人口統計体系LODが、世の中に広く普及し多くの人に利用されているとは全く言い難い状況だ。
<br />
(私以外にガチで使っている人っています?)
<br />
<br />
そして今後、統計LODの予算が減らされ、更新が停止してしまったり、事業そのものが無くなってしまうことを私は危惧している。
<br />
<br />
ということで、本日はもっと多くの方に社会・人口統計体系LODの良さを知っていただくために、便利なクエリをご紹介。<br />
<br />
自作の <b><a href="https://www.mirko.jp/ranking/socialAndDemographic.xlsx" target="_blank">統計指標の一覧表</a></b>(CC0)もプレゼント。<br />
<br />
<h3>
1 ある統計データの自治体ランキングクエリ
</h3>
これは、ある統計指標(この例では2015年の人口総数)について、全国の自治体(この例では都道府県)の状況を調べるためのクエリ。
<br />
<br />
<span style="color: blue; font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: x-small;">PREFIX g00200502-dimension:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/"><http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></a>
<br />PREFIX g00200502-code:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/ontology/g00200502/code/"><http://data.e-stat.go.jp/lod/ontology/g00200502/code/></a>
<br />PREFIX cd-dimension:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/"><http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></a>
<br />PREFIX sdmx-measure:<a class="moz-txt-link-rfc2396E" href="http://purl.org/linked-data/sdmx/2009/measure#"><http://purl.org/linked-data/sdmx/2009/measure#></a>
<br />PREFIX sdmx-dimension:<a class="moz-txt-link-rfc2396E" href="http://purl.org/linked-data/sdmx/2009/dimension#"><http://purl.org/linked-data/sdmx/2009/dimension#></a>
<br />PREFIX sacs:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/terms/sacs#"><http://data.e-stat.go.jp/lod/terms/sacs#></a>
<br />PREFIX ic:<a class="moz-txt-link-rfc2396E" href="http://imi.go.jp/ns/core/rdf#"><http://imi.go.jp/ns/core/rdf#></a>
<br />select ?pref ?observation
<br />where {
<br />?s g00200502-dimension:indicator g00200502-code:indicator-A1101 ;
<br /> cd-dimension:timePeriod "2015"^^xsd:gYear ;
<br /> sdmx-measure:obsValue ?observation ;
<br /> sdmx-dimension:refArea ?areacode .
<br />?areacode sacs:administrativeClass sacs:Prefecture ;
<br /> ic:表記 ?pref .
<br />} ORDER BY DESC(?observation)
</span><br />
<br />
<h3>
2 ある自治体の様々な統計データを並べるクエリ
</h3>
これは、ある自治体(この例では京都府)について、社会・人口統計体系にあるすべての統計データを調べるためのクエリ。
<br />
<br />
<b>以下のクエリはすべての調査年のデータが吐き出されるため、データ量が多くブラウザが固まる可能性大。
</b><br />
<span style="color: blue; font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: x-small;">PREFIX g00200502-dimension:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/"><http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></a>
<br />PREFIX cd-dimension:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/"><http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></a>
<br />PREFIX sdmx-measure:<a class="moz-txt-link-rfc2396E" href="http://purl.org/linked-data/sdmx/2009/measure#"><http://purl.org/linked-data/sdmx/2009/measure#></a>
<br />PREFIX sdmx-dimension:<a class="moz-txt-link-rfc2396E" href="http://purl.org/linked-data/sdmx/2009/dimension#"><http://purl.org/linked-data/sdmx/2009/dimension#></a>
<br />PREFIX sac:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/sac/"><http://data.e-stat.go.jp/lod/sac/></a>
<br />select ?indicator ?year ?o
<br />where {
<br />?s sdmx-dimension:refArea sac:C26000-19700401 ;
<br /> cd-dimension:timePeriod ?year ;
<br /> g00200502-dimension:indicator ?indicator ;
<br /> sdmx-measure:obsValue ?o .
<br />} </span><br />
<br />
<b>2015年調査のデータのみ取得の場合はこう。これは固まらない。
</b><br />
<span style="color: blue; font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: x-small;">PREFIX g00200502-dimension:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/"><http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></a>
<br />PREFIX cd-dimension:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/"><http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></a>
<br />PREFIX sdmx-measure:<a class="moz-txt-link-rfc2396E" href="http://purl.org/linked-data/sdmx/2009/measure#"><http://purl.org/linked-data/sdmx/2009/measure#></a>
<br />PREFIX sdmx-dimension:<a class="moz-txt-link-rfc2396E" href="http://purl.org/linked-data/sdmx/2009/dimension#"><http://purl.org/linked-data/sdmx/2009/dimension#></a>
<br />PREFIX sac:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/sac/"><http://data.e-stat.go.jp/lod/sac/></a>
<br />select ?indicator ?o
<br />where {
<br />?s sdmx-dimension:refArea sac:C26000-19700401 ;
<br /> cd-dimension:timePeriod "2015"^^xsd:gYear ;
<br /> g00200502-dimension:indicator ?indicator ;
<br /> sdmx-measure:obsValue ?o .
<br />} ORDER BY ASC(?indicator)
</span><br />
<br />
<b>2013~2015年調査のデータを取得する場合はこうなる。
</b><br />
<span style="color: blue; font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: x-small;">PREFIX g00200502-dimension:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/"><http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></a>
<br />PREFIX cd-dimension:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/"><http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></a>
<br />PREFIX sdmx-measure:<a class="moz-txt-link-rfc2396E" href="http://purl.org/linked-data/sdmx/2009/measure#"><http://purl.org/linked-data/sdmx/2009/measure#></a>
<br />PREFIX sdmx-dimension:<a class="moz-txt-link-rfc2396E" href="http://purl.org/linked-data/sdmx/2009/dimension#"><http://purl.org/linked-data/sdmx/2009/dimension#></a>
<br />PREFIX sac:<a class="moz-txt-link-rfc2396E" href="http://data.e-stat.go.jp/lod/sac/"><http://data.e-stat.go.jp/lod/sac/></a>
<br />select ?indicator ?year ?o
<br />where {
<br />?s sdmx-dimension:refArea sac:C26000-19700401 ;
<br /> g00200502-dimension:indicator ?indicator ;
<br /> sdmx-measure:obsValue ?o ;
<br /> cd-dimension:timePeriod ?year .
<br /> { ?s cd-dimension:timePeriod "2015"^^xsd:gYear .}
<br /> UNION
<br /> { ?s cd-dimension:timePeriod "2014"^^xsd:gYear .}
<br /> UNION
<br /> { ?s cd-dimension:timePeriod "2013"^^xsd:gYear .}
<br />} ORDER BY ASC(?indicator) DESC(?year)
</span><br />
<br />
<br />
<br />
<br />mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com1tag:blogger.com,1999:blog-6819158836191680640.post-15745692964074890102019-03-06T20:44:00.002+09:002019-03-06T20:47:07.607+09:00IODD2019大阪 ウィキデータ・ソン <a href="https://iodd2019osaka.peatix.com/" target="_blank">インターナショナル・オープンデータ・デイ2019(IODD2019)の大阪会場</a>に参加してきた。
<br />
<br />
今回のテーマは、ウィキデータの編集。
<br />
<br />
「ウィキペディア本文」を編集したり新規で項目を作成するのは相応の知識が必要だが、今回はウィキデータに地理情報を追加するという、誰でも手軽に実施できる内容。
<br />
<br />
具体的には、ウィキペディアに掲載されている様々な施設について、そのウィキデータを見て、座標や住所などの地理情報データがないものを、ネットで情報を調べてどんどん追加していくというもの。
<br />
<br />
私自身はこれまでウィキペディアの編集やウィキデータの利用をしたことがなかったため、当イベントは、自身の見識を深め、新たなアイディアのインスピレーションを得るのに大いに参考になった。
<br />
<br />
また、当イベントのおまけ成果物として、ウィキデータを使ったWEBアプリを会場でこしらえた。
<br />
これ→ <a class="moz-txt-link-freetext" href="https://www.mirko.jp/iodd2019/">https://www.mirko.jp/iodd2019/</a>
<br />
<br />
ウィキデータはオープンなSPARQL APIで提供されており、またCORS(クロスオリジンリソースシェアリング)にも対応しているため、ブラウザJavascriptのみで手軽に活用アプリが作成できる。
<br />
<br />
以下、私がよく使うJavascriptのみのお手軽Webアプリのひな形だ。
<br />
これをベースとして色々作れちゃうので、ご参考に。
<br />
<br />
<span style="color: blue; font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif; font-size: x-small;"><!DOCTYPE html>
<br /><html>
<br /><head>
<br /><meta charset="UTF-8">
<br /><title>ウィキデータ可視化アプリ</title>
<br /><script>
<br />function execute() { // ボタンクリック時の動作
<br /> var endpoint = '<a class="moz-txt-link-freetext" href="https://query.wikidata.org/sparql">https://query.wikidata.org/sparql</a>'; //Endpointをセット
<br /> var method = "POST"; //メソッド(POST or GET)
<br /> //都市コードを取得
<br /> var index = document.selectForm.cityselect.selectedIndex;
<br /> var cityCode = document.selectForm.cityselect.options[index].value;
<br /> //クエリ文字列をセット
<br /> var query = 'SELECT DISTINCT ?s ?label ?point ';
<br /> query += 'WHERE{ ?s rdfs:label ?label;';
<br /> query += 'wdt:P131 wd:' + cityCode +';';
<br /> query += 'wdt:P625 ?point.';
<br /> query += 'FILTER(lang(?label)="ja")}';
<br /> sparqlQuery(query,endpoint,method) ; //スパークルクエリ送信
<br />}
<br />function sparqlQuery(queryStr,endpoint,method) { // XMLHttpRequestでクエリ送信
<br /> var querypart = "query=" + encodeURIComponent(queryStr);
<br /> var xmlhttp = new XMLHttpRequest();
<br /> xmlhttp.open(method, endpoint, true);
<br /> xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
<br /> xmlhttp.setRequestHeader("Accept", "application/sparql-results+json");
<br /> xmlhttp.onreadystatechange = function() {
<br /> if(xmlhttp.readyState == 4) {
<br /> if(xmlhttp.status == 200 || xmlhttp.status == 201 ) {
<br /> onSuccessQuery(xmlhttp.responseText);
<br /> } else {
<br /> document.getElementById("results").innerHTML = "エラー" ;
<br /> }
<br /> }
<br /> }
<br /> xmlhttp.send(querypart);
<br />}
<br />function onSuccessQuery(text) { // 結果(JSON文字列)を配列に格納
<br /> var jsonObj = JSON.parse(text);
<br /> var head , rows ;
<br /> if (jsonObj.responseJSON) {
<br /> head = jsonObj.responseJSON.head.vars;
<br /> rows = jsonObj.responseJSON.results.bindings;
<br /> } else {
<br /> if(!(jsonObj.head)){
<br /> document.getElementById("results").innerHTML = "スパークル構文エラー" ;
<br /> return;
<br /> }
<br /> head = jsonObj.head.vars;
<br /> rows = jsonObj.results.bindings;
<br /> }
<br /> if (rows.length === 0) {
<br /> document.getElementById("results").innerHTML = "検索条件の該当データなし" ;
<br /> return;
<br /> }
<br /> makeTable(head, rows);
<br />}
<br />function makeTable(head, rows) { // 配列をテーブルにして出力
<br /> var html = "<table border='1'><tr>";
<br /> for (var i=0; i<head.length; i++) { //ヘッダ部分の書込み
<br /> html += "<th>" + head[i] + "</th>";
<br /> }
<br /> html += "</tr>";
<br /> for (var i=0; i<rows.length; i++) { //内容の書込み
<br /> html += "<tr>";
<br /> for (var j=0; j<head.length; j++) {
<br /> var col = head[j];
<br /> if(rows[i][col] != null){
<br /> html += "<td>" + rows[i][col].value + "</td>";
<br /> }else{
<br /> html += "<td></td>";
<br /> }
<br /> }
<br /> html += "</tr>";
<br /> }
<br /> html += "</table>";
<br /> document.getElementById("results").innerHTML = html;
<br />}
<br /></script>
<br /></head>
<br /><body>
<br /><form name="selectForm">
<br /><select name='cityselect'>
<br /><option value="Q35765">大阪市</option>
<br /><option value="Q193428">堺市</option>
<br /><option value="Q335423">高槻市</option>
<br /><option value="Q270912">枚方市</option>
<br /><option value="Q467479">豊中市</option>
<br /><option value="Q243863">東大阪市</option>
<br /><option value="Q740456">岸和田市</option>
<br /><option value="Q653510">吹田市</option>
<br /><option value="Q502403">茨木市</option>
<br /><option value="Q389633">寝屋川市</option>
<br /></select>
<br /><input type="button" value="クエリ実行" onclick="execute()">
<br /></form>
<br /><div id="results"></div>
<br /></body>
<br /></html> </span>mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-17124461478679090282018-11-11T17:48:00.000+09:002018-11-11T20:12:36.886+09:00LODチャレンジ2018自作のWebアプリ、 <a href="https://www.mirko.jp/townpower/" target="_blank"><b>ザ・地域統計パワーバトル</b></a> が、<a href="http://2018.lodc.jp/" target="_blank">LODチャレンジ2018</a>において、グランプリにあたる<b style="color: red;">最優秀賞</b>をいただきました。また、併せて日立株式会社様より <b style="color: red;">Inspire the LOD賞</b>を頂きました。<br />
<br />
さらに、自作のオントロジー、<a href="https://www.mirko.jp/ontology/ramen/owlramen/owlramen.html" style="color: blue; font-weight: bold;" target="_blank">OWL de ラーメンオントロジー</a> は、オントロノミー合同会社様から <b><span style="color: red;">オントロジー賞</span></b>を頂きました。<br />
<br />
自作アプリ等の公表の場を与えてくださるだけでも本当にありがたいことで、それに加えて賞までいただけるのは感謝しきれないくらいです。関係者様ありがとうございます。<br />
<br />
<br />
僕がデータの利活用やプログラミングに取り組み始めたのは3年ほど前で、それ以前はさほど興味を持っていませんでした。<br />
<br />
以前は、休日は大好きな魚釣りに行くことが多かったのですが、一日家を空けて魚を釣って楽しんで帰ってくると、家族から白い目で見られることが多く、やむ無く封印することになりました。<br />
<br />
冬はスノーボードに行くのを楽しみにしていましたが、行くたびに時間とお金と体力を使い果たしすぎるために、これもやむ無く封印しています。<br />
<br />
そこで目を付けたのが<span style="color: blue;"><b>オープンデータ利活用</b></span>です。<br />
<br />
1.家にいながらスキマ時間でできるので家族サービスの支障にならない。<br />
2.PCひとつでできるのでお金がかからず、家計にやさしい。<br />
3.社会貢献にもなる。<br />
4.お父さん意外とすごい人だったんだ、って娘に褒められる。<br />
<br />
長く続けていけたらなぁ、と思っています。mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-32487057068437690942018-09-11T20:17:00.001+09:002018-09-12T20:52:51.777+09:00IMIツール Ver 1.0.0共通語彙を利活用するためのツールである <b><a href="https://imi.go.jp/goi/dmd-editor" target="_blank">IMIツール</a></b> は、先日まで<span style="color: blue;"><b>検証版</b></span>だったが、このたび待望の<b><span style="color: blue;">正式版</span></b> Ver 1.0.0 がリリースされた。<br />
さっそく使ってみる。<br />
<br />
とりあえず、検証版で作ったDMDを読み込ませる。<br />
<br />
む、<b><span style="color: red; font-size: large;">エラー</span></b>だ (-_-)<br />
<br />
まあ、仕様が変わったのだろう。<span style="font-size: large;">しようがない…</span><span style="font-size: large;">。</span><br />
<br />
オヤジギャグはさておき、気を取り直して、一からDMDを作り直す。<br />
手持ちのエクセル表を読み込ませて、適切なクラス・プロパティをブラウザ上で選んでいく。<br />
応用語彙を、IMI語彙記法を用いて追加する。<br />
この辺りの操作感は検証版と同じだ。<br />
<br />
さて、DMDが無事完成し、RDF出力だ。<br />
果たして検証版のダメな点は直っているのだろうか。<br />
<br />
1 <b><span style="color: blue;">JSON-LD</span></b> ⇒ 検証版から据え置き。不具合解消なし。<br />
2 <b><span style="color: blue;">RDF-XML</span></b> ⇒ 検証版から据え置き。不具合解消なし。<br />
3 <b><span style="color: blue;">Turtle</span></b> ⇒ 検証版から据え置き。不具合解消なし。<br />
4 <b><span style="color: blue;">主語の扱い</span></b> ⇒ 検証版から据え置き。不具合解消なし。<br />
<br />
…ぶっちゃけこれでは使い物にならないっす。<br />
技術委員さん、このRDFちゃんとチェックしてます?ほんとにいいのこれで??<br />
経産省やIPAは、共通語彙基盤を本気で流行らせたい気が無いのだろうか… (-_-)<br />
<br />
1千万くれたら僕が最高のツールを作ります。<br />
(ウソです)mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-13563363468561543452018-08-11T17:03:00.002+09:002018-11-27T21:14:54.058+09:00統計LODのSPARQLクエリ解説(小地域編)このたび、Webアプリ 「<a href="https://www.mirko.jp/townpower/" target="_blank"><b>ザ・地域統計パワーバトル</b></a>」 を公開した。<br />
<br />
このアプリは「<a href="https://www.civicpowerbattle.org/" target="_blank"><b>シビックパワーバトル</b></a>」に着想を得て開発したものだ。<br />
<br />
バトル自体は興味を引くためのジョークだが、地域と地域を比較したり、また日本(全国値)と比較することで、自分の住んでいる地域の特徴を知り、どのような問題点を持つか把握することが可能となる。<b><span style="color: blue;">地域分析ツール</span></b>という観点で遊んでいただけたら幸いだ。<br />
<br />
さて、このアプリは、e-StatのWeb APIからデータを取得し表示させている。<br />
都道府県と市区町村のデータは <b><a href="https://www.e-stat.go.jp/api/" target="_blank">REST API</a> </b>から、町丁・字の「小地域」のデータは、<b><a href="http://data.e-stat.go.jp/lodw/" target="_blank">統計LOD</a> </b>のSPARQL APIから取得している。<br />
<br />
都道府県と市区町村のデータは、SPARQL APIからも取得することが可能だが、実行速度のより高速なREST APIを利用している。<br />
小地域データは現在、SPARQL APIからのみの提供だ。<br />
<br />
本稿では、統計LODの小地域データを扱うためのSPARQLクエリを紹介する。クエリをコピペして、<a href="http://data.e-stat.go.jp/lod/sparql/" target="_blank"><b>統計LODのエンドポイント</b></a>でお試しあれ。<br />
<br />
<br />
<b>1 平成27年国勢調査の対象自治体の一覧</b><br />
<span style="color: blue; font-size: x-small;">PREFIX sdmx-dimension: <http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX qb: <http://purl.org/linked-data/cube#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX sacs: <http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX ic: <http://imi.go.jp/ns/core/rdf#></span><br />
<span style="color: blue; font-size: x-small;">select distinct ?code ?pref ?area</span><br />
<span style="color: blue; font-size: x-small;">where {</span><br />
<span style="color: blue; font-size: x-small;">?s sdmx-dimension:refArea ?code ;</span><br />
<span style="color: blue; font-size: x-small;"> qb:dataSet <http://data.e-stat.go.jp/lod/dataset/g00200521/d0003148521>.</span><br />
<span style="color: blue; font-size: x-small;">?code sacs:prefectureLabel ?pref ;</span><br />
<span style="color: blue; font-size: x-small;"> ic:表記 ?area ;</span><br />
<span style="color: blue; font-size: x-small;">}order by ?code</span><br />
<span style="color: blue; font-size: x-small;"><br /></span>
このクエリで、平成27年国勢調査の対象自治体の「<a href="http://data.e-stat.go.jp/lodw/rdfschema/lodRegion" target="_blank"><b>期間付き標準地域コード</b></a>」を取得することができる。(重いので乱発しないこと!)<br />
<br />
<br />
<b>2 京都市左京区に含まれる小地域の一覧</b><br />
<span style="color: blue; font-size: x-small;">PREFIX smallArea: <http://data.e-stat.go.jp/lod/terms/smallArea/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX dcterms: <http://purl.org/dc/terms/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX sac: <http://data.e-stat.go.jp/lod/sac/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#><span style="white-space: pre;"> </span></span><br />
<span style="color: blue; font-size: x-small;">select *</span><br />
<span style="color: blue; font-size: x-small;">where {</span><br />
<span style="color: blue; font-size: x-small;">?s a smallArea:SmallAreaCode ;</span><br />
<span style="color: blue; font-size: x-small;"> dcterms:isPartOf sac:C26103-19700401 ;</span><br />
<span style="color: blue; font-size: x-small;"> rdfs:label ?name .</span><br />
<span style="color: blue; font-size: x-small;">} order by ?s</span><br />
<span style="color: blue; font-size: x-small;"><br /></span>
上記の <b>sac:C26103-19700401</b> は平成27年国勢調査時点の、京都市左京区の期間付き標準地域コードである。この部分を変えることで他の市区町村の情報を得ることができる。<br />
<br />
<br />
<b>3 京都市左京区聖護院山王町の情報</b><br />
<span style="color: blue; font-size: x-small;">PREFIX sa-g00200521-2015: <http://data.e-stat.go.jp/lod/smallArea/g00200521/2015/></span><br />
<span style="color: blue; font-size: x-small;">select *</span><br />
<span style="color: blue; font-size: x-small;">where {</span><br />
<span style="color: blue; font-size: x-small;"> sa-g00200521-2015:S26103018006 ?p ?o .</span><br />
<span style="color: blue; font-size: x-small;">}</span><br />
<br />
<br />
<b>4 京都市左京区聖護院山王町のポリゴン</b><br />
<span style="color: blue; font-size: x-small;">PREFIX sa-g00200521-2015: <http://data.e-stat.go.jp/lod/smallArea/g00200521/2015/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX geo: <http://www.opengis.net/ont/geosparql#></span><br />
<span style="color: blue; font-size: x-small;">select ?polygon</span><br />
<span style="color: blue; font-size: x-small;">where {</span><br />
<span style="color: blue; font-size: x-small;"> sa-g00200521-2015:S26103018006 geo:hasGeometry [ geo:asWKT ?polygon ] .</span><br />
<span style="color: blue; font-size: x-small;">}</span><br />
小地域のポリゴンを取得することもできる。当アプリではこのクエリは使っていないが、オープンストリートマップなどで領域を表示させるのも面白いと思う。<br />
<br />
<br />
<b>5 京都市左京区聖護院山王町の年齢別・男女別人口</b><br />
<span style="color: blue; font-size: x-small;">PREFIX sdmx-dimension: <http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX sa-g00200521-2015: <http://data.e-stat.go.jp/lod/smallArea/g00200521/2015/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX qb: <http://purl.org/linked-data/cube#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX cd-dimension: <http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX estat-measure: <http://data.e-stat.go.jp/lod/ontology/measure/></span><br />
<span style="color: blue; font-size: x-small;">select ?age ?sex ?population</span><br />
<span style="color: blue; font-size: x-small;">where {</span><br />
<span style="color: blue; font-size: x-small;">?s sdmx-dimension:refArea sa-g00200521-2015:S26103018006 ;</span><br />
<span style="color: blue; font-size: x-small;"> qb:dataSet <http://data.e-stat.go.jp/lod/dataset/g00200521/ds012015003>;</span><br />
<span style="color: blue; font-size: x-small;"> cd-dimension:age ?age;</span><br />
<span style="color: blue; font-size: x-small;"> cd-dimension:sex ?sex;</span><br />
<span style="color: blue; font-size: x-small;"> estat-measure:population ?population.</span><br />
<span style="color: blue; font-size: x-small;">}order by ?sex ?age</span><br />
<span style="color: blue; font-size: x-small;"><br /></span>
このクエリで、いわゆる「人口ピラミッド」に必要な情報を得ることができる。<br />
<br />
<br />
<b>6 京都市左京区聖護院山王町の年齢別・男女別人口、外国人人口、世帯数、配偶関係、労働力状態</b><br />
<span style="color: blue; font-size: x-small;">PREFIX sdmx-dimension: <http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX sa-g00200521-2015: <http://data.e-stat.go.jp/lod/smallArea/g00200521/2015/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX qb: <http://purl.org/linked-data/cube#></span><br />
<span style="color: blue; font-size: x-small;">PREFIX cd-dimension: <http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX estat-measure: <http://data.e-stat.go.jp/lod/ontology/measure/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX g00200521-dimension-2015: <http://data.e-stat.go.jp/lod/ontology/g00200521/dimension/2015/></span><br />
<span style="color: blue; font-size: x-small;">PREFIX g00200521-dimension-2010: <http://data.e-stat.go.jp/lod/ontology/g00200521/dimension/2010/></span><br />
<span style="color: blue; font-size: x-small;">select ?dataset ?sex ?age ?maritalStatus ?labourForce ?population ?households ?avrage</span><br />
<span style="color: blue; font-size: x-small;">where {</span><br />
<span style="color: blue; font-size: x-small;">?s sdmx-dimension:refArea sa-g00200521-2015:S26103018006 ;</span><br />
<span style="color: blue; font-size: x-small;"> qb:dataSet ?dataset .</span><br />
<span style="color: blue; font-size: x-small;">OPTIONAL{</span><br />
<span style="color: blue; font-size: x-small;">?s cd-dimension:age ?age;</span><br />
<span style="color: blue; font-size: x-small;"> cd-dimension:sex ?sex;</span><br />
<span style="color: blue; font-size: x-small;"> estat-measure:population ?population.</span><br />
<span style="color: blue; font-size: x-small;">}</span><br />
<span style="color: blue; font-size: x-small;">OPTIONAL{</span><br />
<span style="color: blue; font-size: x-small;">?s estat-measure:households ?households .</span><br />
<span style="color: blue; font-size: x-small;">}</span><br />
<span style="color: blue; font-size: x-small;">OPTIONAL{</span><br />
<span style="color: blue; font-size: x-small;">?s cd-dimension:sex ?sex;</span><br />
<span style="color: blue; font-size: x-small;"> estat-measure:population ?population.</span><br />
<span style="color: blue; font-size: x-small;">}</span><br />
<span style="color: blue; font-size: x-small;">OPTIONAL{</span><br />
<span style="color: blue; font-size: x-small;">?s cd-dimension:sex ?sex;</span><br />
<span style="color: blue; font-size: x-small;"> estat-measure:age ?avrage.</span><br />
<span style="color: blue; font-size: x-small;">}</span><br />
<span style="color: blue; font-size: x-small;">OPTIONAL{</span><br />
<span style="color: blue; font-size: x-small;">?s cd-dimension:sex ?sex;</span><br />
<span style="color: blue; font-size: x-small;"> g00200521-dimension-2015:maritalStatus ?maritalStatus;</span><br />
<span style="color: blue; font-size: x-small;"> estat-measure:population ?population.</span><br />
<span style="color: blue; font-size: x-small;">}</span><br />
<span style="color: blue; font-size: x-small;">OPTIONAL{</span><br />
<span style="color: blue; font-size: x-small;">?s cd-dimension:sex ?sex;</span><br />
<span style="color: blue; font-size: x-small;"> g00200521-dimension-2010:labourForce ?labourForce;</span><br />
<span style="color: blue; font-size: x-small;"> estat-measure:population ?population.</span><br />
<span style="color: blue; font-size: x-small;">}</span><br />
<span style="color: blue; font-size: x-small;">}order by ?dataset ?sex ?age ?maritalStatus ?labourForce</span><br />
<span style="color: blue; font-size: x-small;"><br /></span>
「ザ・地域統計パワーバトル」では、実際にこのクエリを使ってデータを取得している。<br />
OPTIONAL句で各種データを並列させているところがポイント。<br />
短いクエリを連発するのが良いのか、このような重いクエリにするのが良いのか悩んだが、プログラムが複雑化するのを避けるために、今回は重いクエリ一発で、情報を一気に取得する方法を採用した。<br />
<br />
<strike>統計LODの実行速度が倍くらいになってくれたらなぁ…。</strike><br />
<strike>統計局さん、統計センターさん、日立さん、よろしくお願いします。</strike><br />
<strike><br /></strike>
<span style="color: red; font-size: large;">統計LODの実行速度が5倍くらい高速になりました!!</span><br />
<span style="color: red; font-size: large;">おかげさまで快適になりました。</span><br />
<span style="color: red; font-size: large;">関係者のみなさま、ありがとうございます!!!</span><br />
<span style="color: red; font-size: large;"><br /></span>mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-15747733939786377842018-06-25T18:38:00.000+09:002018-06-30T17:43:32.486+09:00(各論)IMIツールの「データ形式変換」機能について作成したDMDを、元データ(エクセル表など)と一緒に、IMIツール「<b><span style="color: blue;">データ形式変換</span></b>」に読み込ませると、簡単に共通語彙対応データ(JSON-LD、RDF/XML、Turtle)が出力できる。<br />
<br />
ここでは、<b><span style="color: blue;">データ形式変換</span></b> から出力された各データについて、私見を紹介する。<br />
<br />
<br />
<b><span style="font-size: large;"><i>1 JSON-LD形式 ⇒ </i><span style="color: #274e13;">(^^)</span></span></b><br />
<br />
<b><a href="https://www.mirko.jp/imi/fairy/imi_fairy.json.txt" target="_blank">(例)共通語彙基盤「妖精」(JSON-LD形式) </a></b><br />
<br />
データの階層構造もきれいに収まっており、視認性もよくGOOD!<br />
一点疑問に思うのは、URIを示す表現が以下のようになっていること。<br />
<b><span style="color: blue;"><br /></span></b>
<b><span style="color: blue;">"ic:参照先": {</span></b><br />
<b><span style="color: blue;"> "@value": "http://example.com/xxx/aaa.html",</span></b><br />
<b><span style="color: blue;"> "@type": "xsd:anyURI"</span></b><br />
<b><span style="color: blue;">}</span></b><br />
<br />
JSON-LDでは、次のように、目的語がURIの場合は <b>@id </b>を使うのが一般的な記法だと思う。<br />
<b><span style="color: blue;"><br /></span></b>
<b><span style="color: blue;">"ic:参照先": {</span></b><br />
<b><span style="color: blue;"> "@id": "http://example.com/xxx/aaa.html"</span></b><br />
<b><span style="color: blue;">}</span></b><br />
<b><span style="color: blue;"><br /></span></b>
<br />
<b><span style="font-size: large;"><i>2 RDF/XML形式 ⇒ </i><span style="color: blue;">(-_-)</span></span></b><br />
<br />
<b><a href="https://www.mirko.jp/imi/fairy/imi_fairy.xml.txt" target="_blank">(例)共通語彙基盤「妖精」(RDF/XML形式)</a></b><br />
<br />
JSON-LD同様、データの階層構造はきれいに収まっているが、出力されるテキストに、改行コードやインデントスペースが全く入っていないのがつらすぎる。<br />
ブラウザに読み込ませたら構造が分かるが、そのままの状態ではテキストエディターでの編集は困難。<br />
<br />
また、JSON-LD同様、URIを示す表現に疑問符。<br />
<b style="color: blue;"><ic:画像 rdf:datatype="xsd:anyURI">http://example.com/xxx.jpg</ic:画像></b><br />
<br />
<b>rdf:resource</b> を使って以下のように記述するのが一般的。<br />
<b><span style="color: blue;"><ic:画像 rdf:resource="http://example.com/xxx.jpg"/></span></b><br />
<br />
<br />
<b><span style="font-size: large; font-style: italic;">3 Turtle形式 ⇒ </span><span style="color: red; font-size: large;">(-"-)</span></b><br />
<br />
<b><a href="https://www.mirko.jp/imi/fairy/imi_fairy.ttl.txt" target="_blank">(例)共通語彙基盤「妖精」(Turtle形式)</a></b><br />
<br />
ブランクノード表現が多用されており読みにくい。<br />
形式的には一応Turtleの要件を満たしているが、これではN-Triplesとほとんど一緒。<br />
Turtleの優れているところは人間が読みやすい点。これではダメだ。<br />
また、冒頭で名前空間接頭辞の宣言をしているにも関わらず、データ内で接頭辞を使っていないところもダメダメな感じ。<br />
<br />
あと、上述の2形式と同様、URIの扱いに疑問符。<br />
<b><span style="color: blue;">"http://example.com/xxx/aaa.html"^^xsd:anyURI</span></b><br />
<br />
スタンダードなのはこちら。<br />
<span style="color: blue;"><b><http://example.com/xxx/aaa.html></b></span><br />
<br />
ちなみに私は<b>RDFタートルズの一員</b>である。<br />
個人的な思いとしても、もっとTurtle生成プログラムを作りこんでいただきたいところだ。最低でも<b><span style="color: blue;"><a href="https://www.mirko.jp/imi/fairy/fairy.ttl.txt" target="_blank">このくらい</a></span></b>にはしてほしいなぁ。<br />
<br />
<br />
<span style="font-size: large;"><b><i>4 主語の扱い</i></b></span><br />
<br />
すべての出力データに関して、共通の問題点は <span style="color: red;"><b>主語(subject) </b></span>がないところ。<br />
<br />
RDFはご存じのとおり主語・述語・目的語のトリプル構造となっており、文法的には、主語には <b>URI</b> 又は <b>ブランクノード </b>を使うこととされている。<br />
<br />
「<b>中間ノード</b>」の主語に対し、ブランクノードを利用するのは何ら問題ない。<br />
一方で、ある事物を示す「<b>おおもとの主語</b>」に対しては、ブランクノードではなくURIを付与するのが普通だ。<br />
<br />
しかしながら、IMIツールから出力されるRDFは、おおもとの主語もブランクノードになってしまっている。<br />
おおもとの主語にURIが設定されていないと、RDFとしては扱いづらく、トリプルストアに入れ込んだときも扱いが困難となる。<br />
<br />
私は、何とかして主語を設定しようと、IMIツールの設定項目をいろいろ試したり、IMI語彙記法でいろいろと書き込んでみたが、上手くいかなかった。<br />
(他に方法があるのかもしれないが…)<br />
<br />
IPAさんにお願いしたいのは、IMIツールのGUI上に、主語の名前空間URIの設定項目を作り、そこに入力したURIに、データ内のいずれかの列のデータをくっつけたものを、主語URIとして出力できるようにすること。<br />
<br />
<br />
<b><span style="font-size: large;"><i>5 まとめ</i></span></b><br />
<br />
目につく不具合はいくつかあるものの、一旦DMDを作ってしまえば、様々な形式のRDFが簡単に出力できるのは非常に便利。<br />
上記で挙げた不具合をすべて解消し、<span style="color: red; font-size: x-large;"><b>(^^♪ </b></span>になった <b>正式版IMIツール </b>の早期リリースを望みます。よろしくお願いします m(__)mmirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-82248498220997503182018-06-25T18:21:00.000+09:002018-06-25T23:01:47.811+09:00(各論)IMIツールの「DMD作成支援」機能について共通語彙対応データを作るには、まず <b><span style="color: blue;">DMD(Data Model Description / データモデル記述)</span></b>を作る必要がある。<br />
<br />
DMDは、特定のデータを共通語彙対応にするための「設計図」のようなもの。<br />
<br />
一旦DMDを作ってしまえば、元データ(エクセル表など)と一緒に、<b><span style="color: blue;">IMIツール</span> </b>に読み込ませるだけで、簡単に共通語彙対応のRDFデータ(JSON-LD、RDF/XML、Turtle)ができる、という仕組みだ。<br />
<br />
良い点は、IMIツールを使えば、ほぼマウス操作のみで割と簡単にDMDが作れるところ。<br />
また、一旦DMDを作ってしまえば、何度でも使い回しができ、そのDMDを配布すれば誰でも同じように使えるところ。優れたDMDを作れば、それが全国津々浦々に広まる可能性を秘めている。<br />
<br />
悪い点は、構造化項目明記法により、データ構造が非常に複雑になるため、IMIツール以外の方法(手作業など)で作るのが現実的でないところ。<br />
<br />
<br />
さて、ここで、IMIツールの <b><span style="color: blue;">DMD作成支援</span></b> を実際にに使ってみて感じた点を、以下に紹介させていただく。<br />
<br />
良いと感じたところは、GUIがなかなか良くできていて、クラス(型)やプロパティの設定を、マウス操作のみで直観的に行うことができるところだ。<br />
<br />
一方、難しいと思った点は <b style="background-color: white;"><span style="color: blue;">応用語彙</span></b> の追加だ。<br />
<br />
「徳川将軍一覧」のデータを例にあげると、将軍は「人」なので、ルートとなるクラスは <b><span style="color: red;">ic:人型</span></b> にする、と、誰しも考えるところだろう。<br />
<br />
そして、コア語彙だけでは表現できない、徳川将軍固有の項目については、<span style="color: blue;"><b>応用語彙</b></span>として追加したい、と考える。<br />
<br />
そこで私は、ルートである <b><span style="color: red;">ic:人型</span></b>クラスに、応用語彙のプロパティを追加しようと頑張ったのだが、どうしてもできない。<br />
<br />
しばらく悩んで理解したのは、コア語彙クラスには、そのクラスが持つコア語彙プロパティしかセットできない、ということ。<br />
<br />
言い換えると、応用語彙のプロパティを追加したい場合は、<b><span style="color: red;">ic:人型</span></b>クラスを継承した独自定義のクラスを作って、そいつをルートクラスとしなければならない、ということだ。<br />
<br />
理解すれば簡単なことだが、理解するまでかなり悩んだので、もうちょっと分かりやすくしてほしい点の一つとして挙げておく。<br />
<br />
<br />
新しいクラスを作ったり、応用語彙を追加するには、<b><span style="color: blue;">IMI語彙記法 </span></b>を用いて、その内容を記述する必要がある。その記載例は次の通り。<br />
<br />
<b># 人型クラスを継承した「将軍型クラス」を新規作成する</b><br />
<b><span style="color: blue;"> class ex:将軍型 {@ic:人型};</span></b><br />
<b><br /></b>
<b># 「官位」を示すプロパティを作る</b><br />
<b><span style="color: blue;"> property ex:官位 {@xsd:string} ;</span></b><br />
<b><br /></b>
<b># 将軍型クラスのプロパティとして「官位」を設定する。</b><br />
<b><span style="color: blue;"> set ex:将軍型 > ex:官位;</span></b><br />
<br />
それほど難しくはないのだが、IMIの固有の記法であるため、やはりある程度の勉強や試行錯誤が必要となる。<br />
これもGUIでできるようになるのが理想的だが、どうしてもできなければ、記載例をもっと豊富に提示していただきたいところだ。<br />
<br />
「DMD作成支援」では、<b>応用語彙の追加が最も難しい。</b><br />
さらに使いやすくなるよう、正式版リリース時にはぜひ改善していただきたい。mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-6384771346137599632018-06-24T16:40:00.000+09:002018-06-25T18:46:15.494+09:00(総論)共通語彙基盤の活用に関する考察共通語彙基盤の活用を検討する際、誰しもまず悩むのは、「手持ちの表形式のデータを、どのように共通語彙基盤対応とするか」、という点に尽きるのではないだろうか。<br />
<br />
例えば、次のような表形式のデータがあるとする。<br />
<br />
<table border="1"><tbody>
<tr><th>名前</th><th>年齢(享年)</th></tr>
<tr><td>徳川 家康</td><td><div style="text-align: center;">
75</div>
</td></tr>
<tr><td>徳川 秀忠</td><td><div style="text-align: center;">
54</div>
</td></tr>
<tr><td>徳川 家光</td><td><div style="text-align: center;">
48</div>
</td></tr>
</tbody></table>
<br />
上記の表データを、汎用性を考慮せず、単純にRDFに変換すると次のようになる。(Turtle形式)<br />
<br />
<b><span style="color: blue;">@prefix shogun: <http://example.org/shogun_schema#> .</span></b><br />
<b><span style="color: blue;">:001 shogun:名前 "徳川 家康" ;</span></b><br />
<b><span style="color: blue;"> shogun:年齢 75 .</span></b><br />
<b><span style="color: blue;">:002 shogun:名前 "徳川 秀忠" ;</span></b><br />
<b><span style="color: blue;"> shogun:</span></b><b><span style="color: blue;">年齢</span></b><b><span style="color: blue;"> 54 .</span></b><br />
<b><span style="color: blue;">:003 shogun:名前 "徳川 家光" ;</span></b><br />
<b><span style="color: blue;"> shogun:</span></b><b><span style="color: blue;">年齢</span></b><b><span style="color: blue;"> 48 .</span></b><br />
<br />
上記で使っている <b style="color: blue;">shogun:名前 </b>や<b style="color: blue;"> </b><b><span style="color: blue;">shogun:年齢 </span></b>は、私が適当に定義した語彙であり、こういった語彙は「<b>独自定義語彙</b>」などと呼ばれている。<br />
<br />
独自定義語彙は、政府組織や権威のある学術機関がきっちり定義したものであれば再利用性が生じるが、そうでなければ、作成者限りの「狭い語彙」とみなされる。<br />
<br />
上記のような、すべてが「狭い語彙」のRDFの価値は無に等しく、元データのエクセル表のほうがよっぽど汎用的で分かりやすい。<br />
<br />
次に、世界標準の語彙を使って書き直したRDFを示す。<br />
<br />
<b><span style="color: blue;">@prefix foaf: <http://xmlns.com/foaf/0.1/> .</span></b><br />
<b><span style="color: blue;">:001 foaf:name "徳川 家康" ;</span></b><br />
<b><span style="color: blue;"> foaf:age 75 .</span></b><br />
<b><span style="color: blue;">:002 foaf:name "徳川 秀忠" ;</span></b><br />
<b><span style="color: blue;"> foaf:age 54 .</span></b><br />
<b><span style="color: blue;">:003 foaf:name "徳川 家光" ;</span></b><br />
<b><span style="color: blue;"> foaf:age 48 .</span></b><br />
<br />
上記であれば、誰もが納得の「開かれた」RDFであることが一目瞭然だ。<br />
しかしながら、作成者のセンスによっては、次のように書かれることもあろう。<br />
<br />
<b><span style="color: blue;">@prefix schema: <http://schema.org/> .</span></b><br />
<span style="color: blue; font-weight: 700;">@prefix foaf: <http://xmlns.com/foaf/0.1/> .</span><br />
<b><span style="color: blue;">:001 schema:familyName "徳川" ;</span></b><br />
<b><span style="color: blue;"> schema:givenName "家康" ;</span></b><br />
<span style="color: blue; font-weight: 700;"> foaf:age 75 .</span><br />
<b><span style="color: blue;">:002 schema:familyName "徳川" ;</span></b><br />
<b><span style="color: blue;"> schema:givenName "秀忠" ;</span></b><br />
<b><span style="color: blue;"> </span></b><span style="color: blue; font-weight: 700;">foaf</span><b><span style="color: blue;">:age 54 .</span></b><br />
<b><span style="color: blue;">:003 schema:familyName "徳川" ;</span></b><br />
<b><span style="color: blue;"> schema:givenName "家光" ;</span></b><br />
<b><span style="color: blue;"> </span></b><span style="color: blue; font-weight: 700;">foaf</span><b><span style="color: blue;">:age 48 .</span></b><br />
<br />
これはこれで、世界標準のRDFとしてきちんと成立している。<br />
じゃあ、どっちが正しいの、と聞かれると、どっちも正しい、としか言いようがない。<br />
<br />
<b><span style="color: red;">(日本語)これはラーメンです。</span></b><br />
<b><span style="color: red;">(英語) This is a ramen.</span></b><br />
<b><span style="color: red;">(フランス語) C'est un ramen.</span></b><br />
<b><span style="color: red;">(日本語・大阪弁)これはラーメンやねん。</span></b><br />
<b><span style="color: red;">(日本語・博多弁)これはラーメンばい。</span></b><br />
<br />
上記がどれも正しいのと一緒。使っている言語や方言が違うだけだ。<br />
<br />
<br />
これらを踏まえた上で、さて、共通語彙基盤はどこを目指しているのか。<br />
我々ユーザーは、どう理解し、どう活用したらいいのか。<br />
<br />
IMIのホームページには次の記載がある。<br />
<br />
『<b>国・地方公共団体等が公開するデータの標準化を通じて、データの作成、流通、交換を容易にし促進するための基盤で、データに「価値」を生み出すことを目指しています。</b>』<br />
<br />
ここ数年で、国や自治体のオープンデータ事業はかなり進み、官が保有している膨大なデータが、二次利用可能な形で、徐々に公開されるようになってきた。<br />
その一方で、その提供されるデータ群は、省庁や自治体ごとに形式がバラバラで、使い勝手が良いとは言い難い。<br />
<br />
これらのまとまりのないデータを標準化し、ユーザーが使いやすいものにするためのアプローチの一つが「政府推奨データセット」であり、もう一つがこの共通語彙基盤だ。<br />
<br />
徳川将軍のデータに戻って、その二つの役割分担を考えてみる。<br />
<br />
<b>【政府推奨データセット】</b><br />
⇒ 徳川将軍データセットに必要な項目は「名前」及び「年齢」であると決める。<br />
<br />
<b>【共通語彙基盤】</b><br />
⇒ 徳川将軍データセットにおける「名前」及び「年齢」という各項目が、具体的に何を示しているかを明確にする。<br />
<br />
もう少し具体的にいうと、共通語彙基盤を用いて、例えば「ものごとの名前」を表現するときは、その対象の性質により表現方法が変わる。<br />
<br />
<b><span style="color: blue;">(人の名前の場合) 人型>氏名型>ic:氏名>ic:姓名 ⇒ 徳川家康</span></b><br />
<b><span style="color: blue;">(組織の名称の場合) 組織型>名称型>ic:表記 ⇒ 加賀藩</span></b><br />
<b><span style="color: blue;">(イベントの名称の場合)イベント型>名称型>ic:表記 ⇒ 大政奉還</span></b><br />
<br />
このような形で、対象項目が何を示しているかをきっちり指し示し、曖昧さを排除した表現とするのが、共通語彙基盤の役割であろう。<br />
<br />
<b>【共通語彙基盤の適用例】</b><br />
<b><span style="color: blue;">@prefix ic: <http://imi.go.jp/ns/core/rdf#> .</span></b><br />
<b><span style="color: blue;">:001 a ic:人型 ;</span></b><br />
<b><span style="color: blue;"> ic:氏名 [ ic:姓名 "徳川 家康"^^xsd:string ] ;</span></b><br />
<b><span style="color: blue;"> ic:年齢 [ ic:数値 "75"^^xsd:integer ] .</span></b><br />
<b><span style="color: blue;">:002 a ic:人型 ;</span></b><br />
<b><span style="color: blue;"> ic:氏名 [ ic:姓名 "徳川 秀忠"^^xsd:string ] ;</span></b><br />
<b><span style="color: blue;"> ic:年齢 [ ic:数値 "54"^^xsd:integer ] .</span></b><br />
<b><span style="color: blue;">:003 a ic:人型 ;</span></b><br />
<b><span style="color: blue;"> ic:氏名 [ ic:姓名 "徳川 家光"^^xsd:string ] ;</span></b><br />
<b><span style="color: blue;"> ic:年齢 [ ic:数値 "48"^^xsd:integer ] .</span></b><br />
<br />
<br />
曖昧さや多様性といったものは必ずしも悪いものではなく、それがあるからこそ発展があり、新しい知見が生み出されていく。<br />
<br />
しかし、曖昧さや多様性が障害となる分野もある。コンピューターのプログラムや、法律などがそれにあたる。<br />
<br />
もし刑法に「悪いやつには、罰を与える」と書いてあったら、何をしたらどんな罰を受けるのか全く分からないし、戦前の治安維持法のような運用も可能となる。<br />
そのような曖昧さを回避し、「ものを盗んだ人には、懲役3年の刑罰を与える」と具体的に示すのが、共通語彙基盤の本質的な意義だろう。<br />
<br />
法の執行者であり、公共性や中立性が求められる公務の分野においては、共通語彙基盤の思想は比較的馴染みやすい。公的機関が共通語彙基盤を利用する土壌は少しずつ整ってきており、次は実践が必要な段階だ。<br />
<br />
そのためには、IPAは、共通語彙基盤の技術情報や活用ツールの充実だけでなく、背景にある思想の周知や、利用者のメリットの広報に、これまで以上にリソースを割くべきだろう。<br />
共通語彙基盤の魅力を存分に語ることができる「<b>IMI伝道師</b>」を育成して、日本各地を巡ってもらうのもいいかもしれないなぁ。mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-44386300173716167712018-06-03T09:49:00.001+09:002018-06-03T14:28:25.381+09:00IMI意見交換会6月1日、IPAの<b><span style="color: blue;">IMI意見交換会</span></b>で講演させていただいた。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFshFSe0nPakqK_sZO3akqzJJZ48VN_VGoPAOWn4WcgY4e02MbbdvSDlN1UoQ2pcx66wfnR-65f09uQj866jfUthGwT5este64Zqt7rN2GfIpXWtmzKewA_Yknh4g7cqyUe1eI0Tn7UNU/s1600/imiimg.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="393" data-original-width="610" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFshFSe0nPakqK_sZO3akqzJJZ48VN_VGoPAOWn4WcgY4e02MbbdvSDlN1UoQ2pcx66wfnR-65f09uQj866jfUthGwT5este64Zqt7rN2GfIpXWtmzKewA_Yknh4g7cqyUe1eI0Tn7UNU/s320/imiimg.jpg" width="320" /></a></div>
<br />
何をしゃべろうか悩んだが、やはり共通語彙基盤ネタがウケるだろうと考え、<b><span style="color: blue;">共通語彙基盤と Linked Open Data</span> </b>という超壮大なテーマを、超コンパクトにまとめてしゃべってきた。<br />
<br />
しゃべったのは、「<b>共通語彙基盤って、ぶっちゃけ難しすぎるよね</b>」みたいな、身も蓋もない内容。<br />
お気を悪くされた関係者もいたと思う。すいませんでした。<br />
<br />
しかし今回の意見交換会、IPAの本気が感じられる素晴らしい会で、参加してほんとに良かったと感じている。データをめぐる最新の動向を知る良い機会ともなり、非常に勉強になった。<br />
<br />
意外だったのは、拙作の<a href="https://www.mirko.jp/imiRamenLOD/" target="_blank"><b>共通語彙基盤ラーメンデータセット</b></a>がニッチに人気があったこと。鯖江の福野さんの<a href="http://fukuno.jig.jp/2139" style="font-weight: bold;" target="_blank">一日一創ブログ</a>でも紹介していただいた。<br />
<br />
福野さんの、共通語彙基盤に対する感性はさすがに鋭く、ユーザーとして、また技術者としての様々な見解は、非常に共感できるものだった。<br />
全角日本語の語彙は、グローバル社会の中で受け入れられるのは難しいのではないかという問題提起、Schema.orgとの互換性、などなど。<br />
<b><span style="color: red;">多様性と信頼の共存</span></b>、まさにそれが必要だろう。<br />
<br />
みんなの幸せのための共通語彙基盤の発展に、私も、少しでも力添えができたらと考えている。<br />
<div>
<br /></div>
mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-37009423967424720772018-04-30T22:32:00.001+09:002018-06-03T10:27:44.973+09:00ドメインをとったこのたび、<b><span style="color: blue;">mirko.jp</span> </b>のドメインを取得し、公共オープンデータ利活用研究室 mirko のホームページに割り当てた。<br />
<br />
<b><a href="https://www.mirko.jp/">https://www.mirko.jp/</a></b><br />
<br />
公共オープンデータ利活用研究室 mirko は、<a href="https://www.netowl.jp/">ネットオウル</a>のレンタルサーバーで運営している。<br />
ネットオウルは、地元の京都市の会社なので、個人的に応援しているという理由もある。<br />
これまでは、ネットオウルの「ミニバード」というサービスのサブドメインに、僕のニックネーム <b>mirko</b> を割り当てて <b><span style="color: blue;">mirko.minibird.jp</span></b> としていた。<br />
<br />
上記のURLに特に不満はなかったのだが、やっぱり、ずっと使える永続的なURLがいいなと思い、ネットオウルから独自ドメインの取得申請を行った。<br />
何の苦労もなく、5分で手続き完了。<br />
<br />
浸透するまで半日ほど待ち、リダイレクトかけて、グーグル検索のサイト引っ越しをちょいちょいと。はい完成。簡単なもんだ。<br />
<br />
<br />
ドメイン取得で思い出すのは、今から20数年前、まだWEB黎明期だったころ、仲介業者を介さず、苦労して自力でドメインをとったこと。<br />
とったドメインは <b><span style="color: blue;">pospe.com</span></b> 。<br />
<br />
当時、<b><span style="color: red;"><a href="http://postpet.jp/">ポストペット(通称ポスペ)</a></span></b>というメーラーが大流行していて、私はそれをマニアックに解析するという、「<b>ポストペットマニアックス</b>」というサイトを、そのドメインで運営していた。若かりし頃の黒歴史の一つだ。<br />
<br />
そのポストペットマニアックス、結構人気もあって、2年ほど楽しく遊んでいたのだが、当時、お金が全然無くなっちゃって、生活のため、やむ無く <b>pospe.com</b> をドメイン屋に売り払った。<br />
まだポストペット人気が高い時期だったので、僕のポスペコムは8万円くらいで売れたように記憶している。おかげで、何とか生き延びることができた。<br />
(今の時代なら広告収入でウハウハ生活ができたのになぁ…)<br />
<br />
そのポスペコム、今はどうなってるんだろうと覗いてみたら、こんなだった。<br />
<br />
<a href="http://www.pospe.com/"><b>http://www.pospe.com/</b></a><br />
<br />
兵どもが夢の跡かな(笑)mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-39310241895029252232018-04-28T10:49:00.001+09:002018-06-03T09:54:55.823+09:00統計LODの家計調査データセット先日の、統計LODのデータセット追加リリースで、<span style="color: blue;"><b>家計調査</b> </span>が追加された。<br />
<br />
家計調査は、政府が消費者物価指数をつくるときの資料にしたり、景気動向を知る指標としたり、様々な(真面目な)目的で使われている。<br />
<br />
その家計調査、僕らのような一般の統計ユーザーが面白いと思う点は、食べ物の品目ごとに、都市別で、世帯当たりの支出金額や消費数量が調査されているところ。<br />
「<span style="color: red;"><b>京都人はパンが好き</b></span>」とか、「<span style="color: red;"><b>餃子日本一はどこか?</b></span>」の元ネタだ。<br />
<br />
ただし、家計調査は標本調査であり、しかも都市別となると標本数がかなり少ないので、統計としての定量的な信頼性はイマイチだ。<br />
<br />
まあ、それをきちんと踏まえた上で、<span style="color: blue;"><b>政府がお墨付きを与えたトリビアネタ </b></span>との位置づけでどんどん使えば、政府統計の普及啓発にも一役買うことができる、ということだ。<br />
<br />
さっそく、スパークルをたたいてデータセットを覗いてみる。<br />
<br />
まずは「調査年月」を調べるクエリ。<br />
2005年9月以降の毎月のデータがあることがわかる。<br />
ちなみに、家計調査は「家計調査年報」という形で、1年間の合計値や平均値が公表されているが、統計LODには年報データは無いようでガッカリ。<br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;"><br /></span>
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX qb: <http://purl.org/linked-data/cube#></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX g00200561-dimension: <http://data.e-stat.go.jp/lod/ontology/g00200561/dimension/2015/></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX g00200561-code: <http://data.e-stat.go.jp/lod/ontology/g00200561/code/2015/></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX cd-dimension: <http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">SELECT DISTINCT ?yearmonth</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">WHERE {</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">?s qb:dataSet <http://data.e-stat.go.jp/lod/dataset/g00200561/d0003103532> ;</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;"> g00200561-dimension:ieClassification g00200561-code:ieClassification-1_1_2 ;</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;"> cd-dimension:timePeriod ?yearmonth .</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">} ORDER BY DESC(?yearmonth)</span><br />
<br />
<br />
次は、2017年7月のパンへの支出金額を、対象自治体ごとに調べるクエリだ。<br />
都道府県庁所在市 + その他の政令市 + 全国値 の、計53の観測値が表示される。<br />
<br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX xsd: <http://www.w3.org/2001/XMLSchema#></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX qb: <http://purl.org/linked-data/cube#></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX g00200561-dimension: <http://data.e-stat.go.jp/lod/ontology/g00200561/dimension/2015/></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX g00200561-code: <http://data.e-stat.go.jp/lod/ontology/g00200561/code/2015/></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX cd-dimension: <http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX sdmx-dimension: <http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX estat-measure: <http://data.e-stat.go.jp/lod/ontology/measure/></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">PREFIX ic: <http://imi.go.jp/ns/core/rdf#></span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">select ?citycode ?cityname ?o</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">where {</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">?s qb:dataSet <http://data.e-stat.go.jp/lod/dataset/g00200561/d0003103532> ;</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;"> g00200561-dimension:ieClassification g00200561-code:ieClassification-1_1_2 ;</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;"> cd-dimension:timePeriod "2017-07"^^xsd:gYearMonth ;</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;"> sdmx-dimension:refArea ?citycode ;</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;"> estat-measure:moneyAmount ?o .</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">?citycode ic:表記 ?cityname .</span><br />
<span style="color: blue; font-family: "arial" , "helvetica" , sans-serif;">} ORDER BY ASC(?citycode)</span><br />
<br />
これらのクエリをアプリに組み込んで、面白いものができないかなーと現在検討中。<br />
<br />
家計調査データセットについて、総務省統計局へお願いしたいのは、次の2点。<br />
ひとつ目は「年報」のデータも入れてほしいこと。<br />
ふたつ目は、支出金額だけでなく「消費数量」のデータも欲しいこと。<br />
よろしくお願いします m(__)m<br />
<div>
<br /></div>
mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-63733027429434808212018-04-27T22:00:00.000+09:002018-06-03T09:55:32.752+09:00ブログを作ってみた。理由は、<span style="color: blue;"><a href="https://www.mirko.jp/ranking/" target="_blank"><b>自治体なんでもランキング with 統計LOD</b></a> </span>の <strong><span style="color: blue;">おまけコラム</span></strong> を、ブログに移したほうが合理的かなー、と思ったから。<br />
<br />
ブログも、今時はいろんなサービスがよりどりみどりで迷ってしまう。<br />
FC2とかアメブロとかはてなブログとか…<br />
<br />
悩んだ結果、僕はグーグルのブログサービス <strong><span style="color: #cc0000;">Blogger </span></strong>にした。<br />
<br />
検索でもっと上位に来るブログサービスも色々ありそうだが、僕のブログはただの独り言日記みたいなものなので、あまり読まれなくてもいいし、何より広告が無いのがイイ!<br />
グーグルなので、親サイト自体がつぶれて、サービスが停止されることもまずないだろうし。<br />
(グーグルがブログサービスを突然やめちゃう可能性はあるが…)<br />
<br />
ワードプレスを使って自分で作ろうとも思ったが、最近忙しくて、めんどくさくなって諦めてしまった…<br />
時間ができて、ワードプレスのほうが良さそうなら、そのうち乗り換えるかも。mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-77375295488305637092018-04-23T20:44:00.002+09:002018-06-03T09:55:56.481+09:00「S」をめぐる、IPAと統計局のすれ違い (2018.4.15)2018年4月13日、統計LODのデータが拡充された。<br />
このWEBアプリで使っている「社会・人口統計体系」のデータも、今回たくさん追加されたので、さっそくプログラムを修正し、追加されたデータも取得できるようにした。<br />
市区町村レベルのデータが大幅に増えたので、一度お試しあれ。<br />
(データが増えた分、前よりさらに重くなったような気がするのは、きっと気のせいだろう…)<br />
<br />
さて、統計LODでは、今回、データの拡充と同時に、共通語彙基盤の名前空間URIを、旧URIから新URIに置き換える修正を実施した。<br />
私が以前から要望していたことを実現していただき、感謝の意をお伝えしたい。<br />
私はさっそく、この修正に合わせ、「自治体なんでもランキング with 統計LOD」で使っているSPARQLクエリ内の、共通語彙基盤URIを書き換えることにした。<br />
<br />
「ん? ……!」<br />
<br />
調べてみると、統計LODで使われている名前空間URIは次のようになっている。<br />
<span style="color: blue; font-weight: bold;">http://imi.go.jp/ns/core/rdf#</span> (<a href="http://data.e-stat.go.jp/lodw/rdfschema/lodRegion/" target="_blank">ここ参照</a>)<br />
<br />
一方、IPAが使ってくれ、と言っているURIは次のものだ。<br />
<span style="color: blue; font-weight: bold;">http<span style="color: red;">s</span>://imi.go.jp/ns/core/rdf#</span> (<a href="https://imi.go.jp/core/ContentNegotiation.html" target="_blank">ここ参照</a>)<br />
<br />
…あー、恐れていたことが起きてしまった!<br />
<br />
IPAからしたら、ちゃんとリダイレクトかけてるから別にいーじゃん、という考えが根っこにあるのかもしれないが、私のようなオープンデータ作成者や、アプリケーション開発者にとっては、決して看過できない大問題だ。<br />
なぜなら、<span style="color: blue; font-weight: bold;">http://imi.go.jp/ns/core/rdf#</span> と <span style="color: blue; font-weight: bold;">http<span style="color: red;">s</span>://imi.go.jp/ns/core/rdf#</span> は、全く別の文字列だから。<br />
データとデータがつながる Linked Data の特性を生かすための「フェデレーテッドクエリ」も、これでは全く真価を発揮できず、つながるものもつながらない。スパークラーの皆さんなら、きっと共感していただけるかと思う。<br />
<br />
このIPAと統計LODとの交通事故における「過失割合」を考えると、私は8:2でIPAが悪いと思う。<br />
(統計LOD側の不注意も少しはあるが…)<br />
<br />
共通語彙基盤における、RDF用名前空間はまず次のURIからスタートした。<br />
<span style="color: blue; font-weight: bold;">http://imi.ipa.go.jp/ns/core/rdf#</span><br />
その後、次のURIに変更された。<br />
<span style="color: blue; font-weight: bold;">http://imi.go.jp/ns/core/rdf#</span><br />
最初のものはIPAドメインのサブドメインとしてIMIが設定されていたが、名前空間URIの不変性を担保するために、IPAドメインとは切り離し、IMI独自ドメインとして設定するのが望ましいということだろう。その意図はよく分かる。<br />
<br />
その後、今度は以下のURIに変更された。<br />
<span style="color: blue; font-weight: bold;">http<span style="color: red;">s</span>://imi.go.jp/ns/core/rdf#</span><br />
最近は猫も杓子もSSLで、SSLにあらずんばWEBにあらず、という勢いだ。<br />
IPAは我が国の情報処理を司る大本営。SSL対応とするのは当たり前と言えば当たり前。<br />
<br />
大切なのは、結果として3種類できてしまった名前空間URIを、ユーザーに対しどのように周知徹底し、最新のURIにいかに導いていくかだ。<br />
IPAはそこを大事にしなければならないというのに、最新の<a href="https://imi.go.jp/core/241/index.html" target="_blank">コア語彙バージョン2.4.1のページ</a>で提示されているRDFスキーマやJSON-LDコンテキストを見ると、驚くべきことに、いまだに「s」がついていない。(2018年4月15日現在)<br />
これでは、統計LODサイドが勘違いするのもむべなるかな。はっきり言ってこれはIPAの怠慢だと言わざるを得ない。起こるべくして起きた事故だ。<br />
<br />
共通語彙の目的は、みんなが使う語彙の共通化。共通語彙基盤はみんなのハブ空港。<br />
共通化どころか、自らの手で基準を乱立させ、周知徹底もせず、リダイレクトをかけるだけで満足しているようなデリカシーのない共通語彙からは、ユーザーはどんどん離れていくのが目に見えている。<br />
共通語彙基盤を本気で流行らせたいのなら、もっとちゃんとしてください!頼みますよ!!mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com2tag:blogger.com,1999:blog-6819158836191680640.post-65075836307183628572018-04-23T20:43:00.007+09:002018-06-06T08:11:45.021+09:00東京南多摩5市賞に寄せて - 自治体の真の実力比較 - (2018.3.3)LODチャレンジ2017の他の方の受賞作品を見ようと思い、受賞作品発表の<a href="http://lodc.jp/2015/concrete5/blog/2018-02-22">プレスリリース</a>を見ていたら、当アプリが<b><span style="color: red;">東京南多摩5市賞</span></b>を受賞していることを知ってビックリ!<br />
多摩5市の特産品まで頂けるとのこと。本当にありがとうございます m(__)m<br />
<br />
私は愛知県出身で京都在住。多摩5市には縁もゆかりもなく、今まで生きてきた。 しかし、多摩5市に頂いたこのサプライズの恩返しをしなくては、と思い、急遽『多摩5市ボタン』を追加した。 こういう小回りが利く点が、個人の趣味でやっている良いところかも。<br />
<br />
さて、次のグラフをご覧いただきたい。<br />
<img class="image" src="https://www.mirko.jp/ranking/tama1.jpg" /><br />
これは多摩5市の人口総数を比較したグラフだ。 トップの八王子市と最下位の稲城市では、6倍以上の差がある。<br />
<br />
「自治体なんでもランキング with 統計LOD」には欠点があり、八王子市と稲城市のように、そもそも自治体の規模が違う場合、その自治体の「真の実力」を比較することができない。<br />
例えば、自治体の将来を担う15歳未満の子供がどれだけいるか。 総数で見た場合は、次のグラフのように、分母がでかい八王子市が多いに決まっている。<br />
<img class="image" src="https://www.mirko.jp/ranking/tama2.jpg" /><br />
<br />
真の実力を測るには、15歳未満の子供の「割合」が重要だ。 そこで、「人口1000人当たりの値」で表示するボタンも作成した。 そのボタンを用い、15歳未満の子供のグラフを作成すると、なんと稲城市がトップに躍り出た。稲城市は若年層の割合が高いようだ。<br />
<img class="image" src="https://www.mirko.jp/ranking/tama3.jpg" /><br />
<br />
<br />
次のグラフは昼間人口の夜間人口に対する比率を示したものだ。<br />
<img class="image" src="https://www.mirko.jp/ranking/tama3-2.jpg" /><br />
<br />
「夜間人口」とは、そこに居住している人口のこと。一方「昼間人口」とは、夜間人口から通勤・通学者を差し引きした人口のことだ。 このグラフを見ると、稲城市は昼間人口が少ない(=夜間人口が多い)ことから、23区などのベッドタウンになっており、子育て世帯が多いことが推測できる。子供が多い理由はこのあたりにあるのだろう。<br />
<br />
視点を変えて、1000人当たりの市町村税収納済額(≒税収)を見てみよう。<br />
<img class="image" src="https://www.mirko.jp/ranking/tama4.jpg" /><br />
多摩市がダントツで、稲城市、日野市と続くことが分かる。<br />
<br />
以上、総数だけでは分からない自治体の実力と、地域分析の手法を少しだけ紹介させていただいた。 なお、このアプリの人口1000人当たりの計算は、すべて2015年の国勢調査人口により割り出したものであるため、各統計の調査年次により、正しい値と乖離する場合があることをご了承いただきたい。<br />
<br />
多摩5市のことを全く知らなかった私が、LODチャレンジをきっかけに、5市と繋がりを持つことができ、とても嬉しく思っている。八王子市、町田市、日野市、多摩市、稲城市の関係者の皆様に、感謝の意をお伝え申し上げたい。mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-35915815695134054082018-04-23T20:39:00.002+09:002018-06-03T09:58:54.824+09:00統計LODのSPARQLクエリ研究 (2017.12.28)<b><span style="color: blue;">自治体なんでもランキング with 統計LOD</span></b> に必要な情報を、一挙に入手するクエリは以下の通り。<br />
統計LOD の SPARQL Endpoint は<a href="http://data.e-stat.go.jp/lod/sparql/" target="_blank">こちら</a>。クエリをコピペして一度お試しあれ。<br />
なお、アプリ上では、統計指標(述語 <span style="color: blue;">g00200502-dimension:indicator</span> に対する 目的語)については、ドロップダウンリストで選択したものをセットするが、ここでは便宜的に「<span style="color: blue;">g00200502-code:indicator-A1101</span>」(人口総数)にしている。<br />
<h5>
<span style="font-size: small;">【都道府県】</span></h5>
<span style="color: blue; font-family: inherit;">PREFIX g00200502-dimension:<http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></span><br />
<span style="color: blue; font-family: inherit;">PREFIX g00200502-code:<http://data.e-stat.go.jp/lod/ontology/g00200502/code/></span><br />
<span style="color: blue; font-family: inherit;">PREFIX cd-dimension:<http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue; font-family: inherit;">PREFIX sdmx-measure:<http://purl.org/linked-data/sdmx/2009/measure#></span><br />
<span style="color: blue; font-family: inherit;">PREFIX sdmx-dimension:<http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue; font-family: inherit;">PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue; font-family: inherit;">PREFIX ic:<http://imi.go.jp/ns/core/rdf#></span><br />
<span style="color: blue; font-family: inherit;">select ?pref ?year ?observation</span><br />
<span style="color: blue; font-family: inherit;">where {</span><br />
<span style="color: blue; font-family: inherit;">?s g00200502-dimension:indicator g00200502-code:indicator-A1101 ;</span><br />
<span style="color: blue; font-family: inherit;"> cd-dimension:timePeriod ?year ;</span><br />
<span style="color: blue; font-family: inherit;"> sdmx-measure:obsValue ?observation ;</span><br />
<span style="color: blue; font-family: inherit;"> sdmx-dimension:refArea ?areacode .</span><br />
<span style="color: blue; font-family: inherit;">?areacode sacs:administrativeClass sacs:Prefecture ;</span><br />
<span style="color: blue; font-family: inherit;"> ic:表記 ?pref .</span><br />
<span style="color: blue; font-family: inherit;">} ORDER BY DESC(?year) DESC(?observation)</span><br />
<h5>
<span style="font-size: small;">【政令指定都市】</span></h5>
<span style="color: blue;">PREFIX g00200502-dimension:<http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></span><br />
<span style="color: blue;">PREFIX g00200502-code:<http://data.e-stat.go.jp/lod/ontology/g00200502/code/></span><br />
<span style="color: blue;">PREFIX cd-dimension:<http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue;">PREFIX sdmx-measure:<http://purl.org/linked-data/sdmx/2009/measure#></span><br />
<span style="color: blue;">PREFIX sdmx-dimension:<http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue;">PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue;">PREFIX ic:<http://imi.go.jp/ns/core/rdf#></span><br />
<span style="color: blue;">select ?pref ?city ?year ?observation</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;">?s g00200502-dimension:indicator g00200502-code:indicator-A1101 ;</span><br />
<span style="color: blue;"> cd-dimension:timePeriod ?year ;</span><br />
<span style="color: blue;"> sdmx-measure:obsValue ?observation ;</span><br />
<span style="color: blue;"> sdmx-dimension:refArea ?areacode .</span><br />
<span style="color: blue;">?areacode sacs:administrativeClass sacs:DesignatedCity ;</span><br />
<span style="color: blue;"> ic:表記 ?city ;</span><br />
<span style="color: blue;"> sacs:prefectureLabel ?pref .</span><br />
<span style="color: blue;">} ORDER BY DESC(?year) DESC(?observation)</span><br />
<h5>
<span style="font-size: small;">【全ての市町村及び東京特別区】</span></h5>
<span style="color: blue;">PREFIX g00200502-dimension:<http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></span><br />
<span style="color: blue;">PREFIX g00200502-code:<http://data.e-stat.go.jp/lod/ontology/g00200502/code/></span><br />
<span style="color: blue;">PREFIX cd-dimension:<http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue;">PREFIX sdmx-measure:<http://purl.org/linked-data/sdmx/2009/measure#></span><br />
<span style="color: blue;">PREFIX sdmx-dimension:<http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue;">PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue;">PREFIX ic:<http://imi.go.jp/ns/core/rdf#></span><br />
<span style="color: blue;">select ?pref ?city ?year ?observation</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;">?s g00200502-dimension:indicator g00200502-code:indicator-A1101 ;</span><br />
<span style="color: blue;"> cd-dimension:timePeriod ?year ;</span><br />
<span style="color: blue;"> sdmx-measure:obsValue ?observation ;</span><br />
<span style="color: blue;"> sdmx-dimension:refArea ?areacode .</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:DesignatedCity .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:CoreCity .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:City .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:SpecialCity .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:SpecialWard .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:Town .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:Village .}</span><br />
<span style="color: blue;"> ?areacode ic:表記 ?city ;</span><br />
<span style="color: blue;"> sacs:prefectureLabel ?pref .</span><br />
<span style="color: blue;">} ORDER BY DESC(?year) DESC(?observation)</span><br />
<h5>
</h5>
全市区町村分を取得するクエリは、複数の自治体種別をUNIONで繋げているのがスマートでないが、これは統計LODの自治体情報のオントロジー構造の問題によるものであり、現状ではこうする他に手がない。次の「おまけコラム」で、その問題点について詳しく述べたので、改善していただけるとありがたい。<br />
<br />
また、統計調査というものの性質上致し方ないことであるが、統計の種類により調査年が異なるのも利活用を難しくする一つの要因だ。最新年の情報のみ欲しい場合でも、一旦、すべての調査年の値を入手し、必要な年の値のみ抽出する必要がある。<br />
<br />
最大のネックは、クエリが長くて処理が重すぎること。特に、全市区町村分を取得するクエリは、下手すると何分も待たされ、途中で寝てしまう。サーバに負荷をかけすぎて、他の利用者に迷惑をかけることにもなってしまう。<br />
そこで、考えたのが以下のクエリ。(これは都道府県バージョン)<br />
<h5>
<span style="font-size: small;"> 【一段目】都道府県のうち、北海道の調査年を取得</span></h5>
<span style="color: blue;">PREFIX g00200502-dimension:<http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></span><br />
<span style="color: blue;">PREFIX g00200502-code:<http://data.e-stat.go.jp/lod/ontology/g00200502/code/></span><br />
<span style="color: blue;">PREFIX sdmx-dimension:<http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue;">PREFIX sac:<http://data.e-stat.go.jp/lod/sac/></span><br />
<span style="color: blue;">PREFIX cd-dimension:<http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue;">select ?year</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;">?s g00200502-dimension:indicator g00200502-code:indicator-A1101 ;</span><br />
<span style="color: blue;"> sdmx-dimension:refArea sac:C01000-19700401 ;</span><br />
<span style="color: blue;"> cd-dimension:timePeriod ?year .</span><br />
<span style="color: blue;">} ORDER BY DESC(?year)</span><br />
<h5>
<span style="font-size: small;"> 【二段目】都道府県の名称と統計調査の観測値を取得</span></h5>
<span style="color: blue;">PREFIX g00200502-dimension:<http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></span><br />
<span style="color: blue;">PREFIX g00200502-code:<http://data.e-stat.go.jp/lod/ontology/g00200502/code/></span><br />
<span style="color: blue;">PREFIX cd-dimension:<http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue;">PREFIX xsd:<http://www.w3.org/2001/XMLSchema#></span><br />
<span style="color: blue;">PREFIX sdmx-measure:<http://purl.org/linked-data/sdmx/2009/measure#></span><br />
<span style="color: blue;">PREFIX sdmx-dimension:<http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue;">PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue;">PREFIX ic:<http://imi.go.jp/ns/core/rdf#></span><br />
<span style="color: blue;">select ?pref ?observation</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;">?s g00200502-dimension:indicator g00200502-code:indicator-A1101 ;</span><br />
<span style="color: blue;"> cd-dimension:timePeriod "(一段目で取得した調査年をセット)"^^xsd:gYear ;</span><br />
<span style="color: blue;"> sdmx-measure:obsValue ?observation ;</span><br />
<span style="color: blue;"> sdmx-dimension:refArea ?areacode .</span><br />
<span style="color: blue;">?areacode sacs:administrativeClass sacs:Prefecture ;</span><br />
<span style="color: blue;"> ic:表記 ?pref .</span><br />
<span style="color: blue;">} ORDER BY DESC(?observation)</span><br />
<br />
上記のようにすると、二段階になり、一見遅くなるように思うが、全ての調査年を走査する必要がなくなるため、負荷が軽減され、結果として高速化される。しかしながら、これでもまだ重く、特に「全市区町村分」は途中で固まることもあり実用的ではない。<br />
どの部分がボトルネックとなっているか調べた結果、『標準自治体コードをもとに、自治体名(市区町村、都道府県)を取得する部分』がかなり重いことが分かった。データセットを跨ぐと重くなるのだろうか。<br />
<br />
(都道府県)<br />
<span style="color: blue;">?areacode ic:表記 ?pref .</span><br />
<br />
(市区町村)<br />
<span style="color: blue;">?areacode ic:表記 ?city ;</span><br />
<span style="color: blue;"> sacs:prefectureLabel ?pref .</span><br />
<br />
上記の問題を解消するため、クエリをもう一段階分割し、三段構成とすることとした。<br />
そのクエリは以下のとおり。(これは全市区町村バージョン)<br />
<h5>
<span style="font-size: small;"> 【一段目】全自治体の標準自治体コードと、市区町村名称及び都道府県名称を取得</span></h5>
<span style="color: blue;">PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue;">PREFIX ic:<http://imi.go.jp/ns/core/rdf#></span><br />
<span style="color: blue;">select ?areacode ?pref ?city</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;">?areacode a sacs:StandardAreaCode ;</span><br />
<span style="color: blue;"> ic:表記 ?city ;</span><br />
<span style="color: blue;"> sacs:prefectureLabel ?pref .</span><br />
<span style="color: blue;">} ORDER BY ?areacode</span><br />
<br />
ホームページを開くと、上記【一段目】のクエリを自動的にエンドポイントへ送信し、全ての自治体の標準自治体コードと、対応する市区町村名、その上位自治体である都道府県名を取得し、クライアントPCのメモリにオブジェクトとして格納しておく。<br />
このクエリはやや重いが、取得したオブジェクトは、ページを閉じたり、別のページに遷移するまではメモリに保持されるため、一度の取得で何度も使いまわしが可能だ。<br />
メモリへの格納後、次に「札幌市」の調査年を取得、最後に観測値を取得する。<br />
<h5>
<span style="font-size: small;"> 【二段目】市区町村のうち、札幌市の調査年の取得</span></h5>
<span style="color: blue;">PREFIX g00200502-dimension:<http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></span><br />
<span style="color: blue;">PREFIX g00200502-code:<http://data.e-stat.go.jp/lod/ontology/g00200502/code/></span><br />
<span style="color: blue;">PREFIX sdmx-dimension:<http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue;">PREFIX sac:<http://data.e-stat.go.jp/lod/sac/></span><br />
<span style="color: blue;">PREFIX cd-dimension:<http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue;">select ?year</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;">?s g00200502-dimension:indicator g00200502-code:indicator-A1101 ;</span><br />
<span style="color: blue;"> sdmx-dimension:refArea sac:C01100-19731201 ;</span><br />
<span style="color: blue;"> cd-dimension:timePeriod ?year .</span><br />
<span style="color: blue;">} ORDER BY DESC(?year)</span><br />
<h5>
<span style="font-size: small;"> 【三段目】全市区町村の統計調査の観測値を取得</span></h5>
<span style="color: blue;">PREFIX g00200502-dimension:<http://data.e-stat.go.jp/lod/ontology/g00200502/dimension/></span><br />
<span style="color: blue;">PREFIX g00200502-code:<http://data.e-stat.go.jp/lod/ontology/g00200502/code/></span><br />
<span style="color: blue;">PREFIX cd-dimension:<http://data.e-stat.go.jp/lod/ontology/crossDomain/dimension/></span><br />
<span style="color: blue;">PREFIX xsd:<http://www.w3.org/2001/XMLSchema#></span><br />
<span style="color: blue;">PREFIX sdmx-measure:<http://purl.org/linked-data/sdmx/2009/measure#></span><br />
<span style="color: blue;">PREFIX sdmx-dimension:<http://purl.org/linked-data/sdmx/2009/dimension#></span><br />
<span style="color: blue;">PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue;">select ?areacode ?observation</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;">?s g00200502-dimension:indicator g00200502-code:indicator-A1101 ;</span><br />
<span style="color: blue;"> cd-dimension:timePeriod "(二段目で取得した調査年をセット)"^^xsd:gYear ;</span><br />
<span style="color: blue;"> sdmx-measure:obsValue ?observation ;</span><br />
<span style="color: blue;"> sdmx-dimension:refArea ?areacode .</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:DesignatedCity .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:CoreCity .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:City .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:SpecialCity .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:SpecialWard .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:Town .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:Village .}</span><br />
<span style="color: blue;">} ORDER BY DESC(?observation)</span><br />
<br />
上記クエリの結果がコールバックされたら、三段目で取得した「<span style="color: blue;">?areacode</span>」と、一段目で取得済みの、メモリに格納してある標準自治体コード等の情報を Javascript でマッチングさせ、ブラウザ上に表示させる。<br />
ブラウザ内でのマッチング作業に少し時間がかかるが、SPARQLサーバー上で行うよりもずっと高速だ。<br />
Fusekiサーバー内でどのような処理が行われているか詳しいことは分からないが、重いクエリ一発で処理を行うより、軽いクエリを複数回組み合わせたほうが、結果として素早く処理が完了できるようだ。統計LODを利用したアプリケーション開発を考えておられる方には、このように細かくクエリを分割する手法をお勧めしたい。<br />
<br />
余談だが、今回の統計LODリニューアル後のデータは、共通語彙基盤の語彙が多く使われており、その使いどころも、IPAの解説に近い形に手直しをされた。これは素晴らしい取組だと思う。その一方で、使われている共通語彙の名前空間URIが未だに「旧」であるところがイケてない(<a href="https://imi.go.jp/core/232/index.html">こちら参照</a>)。速やかに新URIに修正していただきたいところだ。mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com0tag:blogger.com,1999:blog-6819158836191680640.post-75948184483448274202018-04-23T20:33:00.001+09:002018-06-06T07:57:06.504+09:00統計LODの地方自治体オントロジーについての考察 (2017.12.28)統計LODにおける地方自治体定義のオントロジーは、下図のような構成になっている。<br />
このWEBアプリの「全市区町村」検索で必要な情報は、背景が黄色の部分だ。<br />
<br />
<img class="image" src="https://www.mirko.jp/ranking/01.jpg" /><br />
<br />
上図の「第三階層」は、市区町村クラスに属するグループであるが、市・東京23区・町・村に加え、「政令指定都市の行政区」も同格に扱うこととされている。<br />
一般的に「市区町村」と言った場合、そこに政令指定都市の行政区を含めるかどうかは議論の分かれるところであるが、行政区は東京特別区とは異なり地方公共団体そのものではないので、クラス分類基準の同一性という観点で捉えると「含めない」のが正解だろう。<br />
また、政令指定都市が属する第四階層より、行政区が属する階層のほうが浅い位置にあるのも違和感を覚える。<br />
<br />
第三階層の「市」と、第四階層の「政令指定都市」「中核市」「特例市」との関係も、私の感覚では、不適当と感じられる。<br />
現行の統計LODにおける、「市」のクラスとインスタンスの関係を図に表すと、以下の通りとなる。<br />
<br />
<img class="image" src="https://www.mirko.jp/ranking/m01.jpg" /><br />
<br />
普通の市と、政令市・中核市・特例市が異なるクラス階層に属しているのは、オントロジー構成的にみても望ましくない上、実際にSPARQL検索を行う際にも不便だ。<br />
現行では、政令市等を含めたすべての「市」を取得したい場合、以下のように UNION で繋げる必要があり、これではスマートでない。<br />
<br />
<span style="color: blue;">PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue;">select ?areacode</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:City .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:DesignatedCity .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:CoreCity .} UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:SpecialCity .} </span><br />
<span style="color: blue;">}</span><br />
<br />
または<br />
<br />
<span style="color: blue;">PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue;">PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#></span><br />
<span style="color: blue;">select ?areacode</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;"> { ?bigCity rdfs:subClassOf sacs:City .</span><br />
<span style="color: blue;"> ?areacode sacs:administrativeClass ?bigCity . } UNION</span><br />
<span style="color: blue;"> { ?areacode sacs:administrativeClass sacs:City .} </span><br />
<span style="color: blue;">}</span><br />
<br />
私としては、下図のような構成が望ましいと考える。この構成であれば、インスタンス集合のパーティション性を満たし、かつ、スマートで高速なクエリが使えるため、利便性も高い。<br />
SPARQLサーバーのレスポンスを向上させるには、機器の物理的な増強だけでなく、このようなオントロジーの見直しからもアプローチすべきだろう。<br />
<br />
<img class="image" src="https://www.mirko.jp/ranking/m02.jpg" /><br />
<br />
(クエリ)<br />
<span style="color: blue;">PREFIX sacs:<http://data.e-stat.go.jp/lod/terms/sacs#></span><br />
<span style="color: blue;">PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#></span><br />
<span style="color: blue;">select ?areacode</span><br />
<span style="color: blue;">where {</span><br />
<span style="color: blue;">?allCity rdfs:subClassOf sacs:City .</span><br />
<span style="color: blue;">?areacode sacs:administrativeClass ?allCity .</span><br />
<span style="color: blue;">}</span><br />
<br />
私は、統計LODの地方自治体オントロジーについて、オントロジーとして望ましい状態に修正し、同時にSPARQL検索の利便性も向上させるため、下図《 案1 》又は《 案2 》が良いと考えている。統計局及び統計センターの関係者の方、ご検討願います。<br />
<br />
<img class="image" src="https://www.mirko.jp/ranking/02.jpg" /><br />
<br />
<img class="image" src="https://www.mirko.jp/ranking/03.jpg" /><br />
<br />
粗探しのような要望ばかり述べてしまったが、今回のリニューアルにより、データセットが拡充され、使い勝手もずいぶん良くなったことは間違いなく、私のようなマニアには嬉しい限りだ。<br />
統計LODのさらなる発展と、地方自治体の統計データLOD化の波及を願い、微力ながら私も応援していきたい。mirkohttp://www.blogger.com/profile/13549356348308881695noreply@blogger.com2