ARQをMacにインストールして，さくっとSPARQLでRDFを検索しよう。


##はじめに
[ARQ](http://jena.apache.org/documentation/query/index.html)はJena（Apacheのプロジェクト）で，サポートされているパッケージの１つです。
ARQを使うことで，コマンドプロンプトでSPARQLを実行し，簡易的にRDFを検索することが出来ます。今回はARQをMacにインストールする方法と簡単な使い方をご紹介します。

⚠バージョンによって，インストール方法が変わる恐れがあります。ネット上の情報も古い場合があるので，念のため，解凍したフォルダのREADMEをご覧ください。Windowsの場合のインストール方法もREADMEに載っています（動作は未確認）。

##ダウンロード
[最新版のapache-jena](http://www.apache.org/dist/jena/binaries/)を任意の場所にダウンロードし，解凍します。

例

```
$ wget http://www.apache.org/dist/jena/binaries/apache-jena-2.12.1.tar.gz
$ tar -xzvf apache-jena-2.12.1.tar.gz
```

([Macでwgetコマンドを使えるようにするの書](http://www.absolute-keitarou.net/blog/?p=296)）

##PATHを通す

.bash_profileにPATHを設定し，有効化します。

```
$ vim ~/.bash_profile

#色々な記述があったり無かったり
 export JENA_HOME=インストールした場所/apache-jena-2.10.1
#色々な記述があったり無かったり

$ source ~/.bash_profile
```

##レッツ実行
```
$ arq --version
Jena:       VERSION: 2.10.1
Jena:       BUILD_DATE: 2013-05-11T22:05:51+0100
ARQ:        VERSION: 2.10.1
ARQ:        BUILD_DATE: 2013-05-11T22:05:51+0100
RIOT:       VERSION: 2.10.1
RIOT:       BUILD_DATE: 2013-05-11T22:05:51+0100
```

上記のようにバージョンが表示されればOKです。

```
 Exception in thread "main" java.lang.NoClassDefFoundError:
```

のようなエラーが出た場合には，PATHの指定が間違っているのでご注意ください。

###サンプルクエリ
ちなみに実行形式や実行結果は以下のとおりです。

```r
$ arq --data ex002.ttl --query ex003.rq 
--------------------------------
| craigEmail                   |
================================
| "c.ellis@usairwaysgroup.com" |
| "craigellis@yahoo.com"       |
--------------------------------
```

ちなみに中身は，Learning SPARQLのサンプルデータです。[こちらから](http://www.learningsparql.com/2ndeditionexamples/)ダウンロード出来ます。
ex002.ttlはTurtle形式のRDF,ex003.rqにSPARQLのクエリが書かれています。

```r
$ cat ex002.ttl 
# filename: ex002.ttl

@prefix ab: <http://learningsparql.com/ns/addressbook#> .

ab:richard ab:homeTel "(229) 276-5135" . 
ab:richard ab:email   "richard49@hotmail.com" . 

ab:cindy ab:homeTel "(245) 646-5488" . 
ab:cindy ab:email   "cindym@gmail.com" . 

ab:craig ab:homeTel "(194) 966-1505" . 
ab:craig ab:email   "craigellis@yahoo.com" . 
ab:craig ab:email   "c.ellis@usairwaysgroup.com" . 

$ cat ex003.rq 
# filename: ex003.rq

PREFIX ab: <http://learningsparql.com/ns/addressbook#> 

SELECT ?craigEmail
WHERE
{ ab:craig ab:email ?craigEmail . }

```

###間違いの検出にも
ARQの便利なところは，RDFの間違いについても検出してくれるところです（超重要）。例えば，以下のように，ab:craigとするべきところを，a:craigとしてしまうと，

```
$ cat ex002.ttl 
# filename: ex002.ttl

@prefix ab: <http://learningsparql.com/ns/addressbook#> .

ab:richard ab:homeTel "(229) 276-5135" . 
ab:richard ab:email   "richard49@hotmail.com" . 

ab:cindy ab:homeTel "(245) 646-5488" . 
ab:cindy ab:email   "cindym@gmail.com" . 

ab:craig ab:homeTel "(194) 966-1505" . 
a:craig ab:email   "craigellis@yahoo.com" . 
a:craig ab:email   "c.ellis@usairwaysgroup.com" . 
```

```
$ arq --data ex002.ttl --query ex003.rq 
11:54:56 ERROR riot                 :: [line: 12, col: 1 ] Undefined prefix: a
org.apache.jena.riot.RiotException: [line: 12, col: 1 ] Undefined prefix: a
	at org.apache.jena.riot.system.ErrorHandlerFactory$ErrorHandlerStd.fatal(ErrorHandlerFactory.java:132)
	at 
…以下略
```

上記のようにどこが間違っているのか教えてくれます。


###Resultsオプション
地味に便利なresultsオプションを使うと，異なるフォーマットでの出力も可能です。下記の例では，実行結果をJSONで出力させています。他にも，text, XML, CSV, TSV 形式での出力が可能です。


```r
$ arq --data ex002.ttl --query ex003.rq --results json
{
  "head": {
    "vars": [ "craigEmail" ]
  } ,
  "results": {
    "bindings": [
      {
        "craigEmail": { "type": "literal" , "value": "c.ellis@usairwaysgroup.com" }
      } ,
      {
        "craigEmail": { "type": "literal" , "value": "craigellis@yahoo.com" }
      }
    ]
  }
}
```

ではでは，レッツ エンジョイ スパークルライフ！！しゅわしゅわっ。