法人インフォメーションAPIをRubyで取得する

##はじめに
> この記事は[ブログ](http://nukorou.hatenablog.com/entry/2017/01/20/120000)にも公開されています。

昨日(2017年1月19日)、法人インフォメーション(略称：法人インフォ)が公開されたので、Rubyで取得するところまでやってみたいと思います。

##準備
このAPIは[SPARQL(スパークル)](https://ja.wikipedia.org/wiki/SPARQL)というRDFのクエリ言語でクエリを書くみたいです。ちなみにRDFもSPARQLも初めて扱います。(SQLはSELECTとFROMぐらしかわかってません。)

`gem install linkeddata`


でRDFを扱うためのモジュールをまとめてインストールしてくれるそうです。

##コード
ざっくり説明しますと、`get_all_hojin_id関数`で法人番号(ID)を取得して、`get_hojin_base_info関数`にIDを渡しています。

SPARQLでは、?変数名が変数になるようです。

情報てんこもりの`get_hojin_base_info関数`は最初は理解しにくいかと思ったので、最小構成のSPARQLの例示として、`get_name関数`も用意しました。

あと、`get_all_hojin_id関数`では実は全部のIDは取得できません。SQLが分かる人には当たり前なのかもしれませんが、OFFSETが必要です。あえて、把握しにくくになるからOFFSETは書かなかったのですが、別に問題ないですよね。

あと、地味にOPTIONALってのは重要です！これがないと、全部の情報が必須の条件になってしまうため、ヒットしません。これは、必須ではないよって明示しているのが、OPTIONALみたいです。ここでつまりました。



```ruby
require 'sparql/client'

def get_all_hojin_id(client=nil, limit)
  if client.nil?
    client = SPARQL::Client.new('http://api.hojin-info.go.jp/sparql')
  end
  query_string = "
    PREFIX hj: <http://hojin-info.go.jp/ns/domain/biz/1#>
    PREFIX ic: <http://imi.go.jp/ns/core/rdf#>

    SELECT ?id FROM <http://hojin-info.go.jp/graph/hojin>
    WHERE {
      ?s hj:法人基本情報 ?key .
      ?key ic:ID/ic:識別値 ?id .
    }
    limit #{limit}
  "
  results = client.query(query_string)
end


def get_name(client=nil, id)
  if client.nil?
    client = SPARQL::Client.new('http://api.hojin-info.go.jp/sparql')
  end

  q1 = "
    PREFIX hj: <http://hojin-info.go.jp/ns/domain/biz/1#>
    PREFIX ic: <http://imi.go.jp/ns/core/rdf#>

    SELECT ?name FROM <http://hojin-info.go.jp/graph/hojin>
    WHERE {
      ?s hj:法人基本情報 ?key .
      ?key ic:ID/ic:識別値 '#{id}' .
      ?key ic:名称/ic:表記 ?name
    }
  "
  results = client.query(q1)

end

#個人的に必要そうな情報しか取得してません
def get_hojin_base_info(client=nil, id)
  if client.nil?
    client = SPARQL::Client.new('http://api.hojin-info.go.jp/sparql')
  end

  query_string = "
    PREFIX hj: <http://hojin-info.go.jp/ns/domain/biz/1#>
    PREFIX ic: <http://imi.go.jp/ns/core/rdf#>

    SELECT DISTINCT * FROM <http://hojin-info.go.jp/graph/hojin>
    WHERE {
      ?s hj:法人基本情報 ?key .
      ?key ic:ID/ic:識別値 '#{id}' .
      ?key ic:ID/ic:識別値 ?id .
      OPTIONAL{?key ic:名称/ic:表記 ?name .}
      OPTIONAL{?key ic:住所/ic:表記 ?address .}
      OPTIONAL{?key ic:住所/ic:郵便番号 ?zip_code .}
      OPTIONAL{?key ic:住所/ic:都道府県 ?prefecture .}
      OPTIONAL{?key ic:住所/ic:市区町村 ?city .}
      OPTIONAL{?key ic:住所/hj:丁目番地等 ?chome .}
      OPTIONAL{?key ic:活動状況/ic:発生日 ?start_day .}
      OPTIONAL{?key hj:更新日時/ic:標準型日時 ?updated_at .}
    }
  "
  results = client.query(query_string)
end

if __FILE__ == $0
  client = SPARQL::Client.new('http://api.hojin-info.go.jp/sparql')
  ids = get_all_hojin_id(client, limit=10)

  ids.each do |i|
    name = get_name(client, i.id.to_s)[0].to_h[:name].to_s
    puts name

    base_info = get_hojin_base_info(client, i.id.to_s)[0].to_h
    puts "id:#{base_info[:id]} name:#{base_info[:name]} address:#{base_info[:address]}\n\n"
  end
end

```

##改良するなら
[公式PDF](http://hojin-info.go.jp/hojin/pdf/API.pdf#page=8)の、追加したいデータ名のプロパティパスっていうカラムをコピペして、変数名を自分でつけたらいいと思います。って誰でもわかるかｗ

##参考

[hanzomemo: DBpedia日本語版：SPARQLをRubyから実行](http://hanzomemo.blogspot.jp/2013/04/dbpediasparqlruby.html)
[RDF.rbを用いたRDFデータの読み込み - Qiita](http://qiita.com/tsunagun/items/1ee19c9d2cf1767adf95)