SPARQL入門 〜RDFデータセット（DBPedia）から、「鎌倉に属するお寺」を抽出できるクエリを書けるようになろう〜

# SPARQLとは
- SPARQL（SPARQL Protocol and RDF Query Language）は、RDF（Resource Description Framework）データモデルに対するクエリ言語です。
- RDFは、主語-述語-目的語のトリプルでデータを表現します。

# DBpediaの概要と利用方法
## DBPediaとは
- DBpediaは、Wikipediaの構造化データを抽出したデータセットであり、RDF形式で提供されています。
- DBpediaには多くの知識が含まれており、SPARQLエンドポイントを通じてクエリを実行できます。

## DBpedia SPARQLエンドポイント
- DBpediaのSPARQLエンドポイント: http://dbpedia.org/sparql


# 基本的なSPARQLクエリの書き方
## クエリの基本構造
```
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>

SELECT ?subject ?predicate ?object
WHERE {
  ?subject ?predicate ?object.
}
LIMIT 10
```
### SPQRQLクエリの基本文法の説明
#### PREFIX
SPARQLクエリでは、IRI（Internationalized Resource Identifier）を短縮して記述するためにPREFIXを使用します。PREFIXはRDFデータセットの名前空間のエイリアスであり、クエリの簡潔性と読みやすさを向上させます。
以下は、上記例におけるPREFIXの説明です。

##### dbp: http://dbpedia.org/property/
- 用途: DBpediaのプロパティを指します。Wikipediaのインフォボックスなどから抽出された属性情報を表現します。
- 例: dbp:birthDate は "生年月日" を表します。

##### dbo: http://dbpedia.org/ontology/
- 用途: DBpediaオントロジーを指します。DBpediaが定義する概念（クラス）やプロパティを表現します。
- 例: dbo:Person は "人" クラスを表し、dbo:birthPlace は "生誕地" を表します。
 
##### dbr: http://dbpedia.org/resource/
- 用途: DBpediaリソースを指します。Wikipediaの各ページに対応するエンティティ（リソース）を表現します。
- 例: dbr:Kamakura は "鎌倉" というWikipediaページに対応するリソースを表します。

#### SPARQL基本構文
```SELECT ?subject ?predicate ?object```
- 取得したい変数を指定します。変数名は ? で始まります。ここでは ?subject、?predicate、?object の3つの変数を選択しています。

```WHERE { ?subject ?predicate ?object. }```
- 取得するトリプルパターンを指定します。RDFデータは主語-述語-目的語のトリプルとして表現されるため、WHERE句の中ではこのトリプルパターンを定義します。


```LIMIT 10```
- 取得する結果の最大数を指定します。ここでは、最大10個の結果を取得します。

## 具体的なクエリの構築
### 鎌倉に関する情報を取得するクエリ
まずは、鎌倉に関する情報を取得する。
```

PREFIX dbr: <http://dbpedia.org/resource/>

SELECT ?property ?value
WHERE {
  dbr:Kamakura ?property ?value.
}
LIMIT 10
```
実行結果↓
![スクリーンショット 2024-05-23 15.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796362/beba50bc-7011-1911-a54f-6ef82073b045.png)
SPARQLは、主語、述語、目的語のトリプルでデータを指定・取得しますが、以上の例だとこのように表現できるかと思います。
- 主語（名前空間dbr:Kamakura）は、述語（property）な関係にある。目的語（value）と。
- 今回は、主語は（名前空間dbr:Kamakura）に指定しているので、鎌倉に関係ある述語と目的語全てを抽出しているということです。

### 鎌倉のお寺を取得するクエリ
以下は、鎌倉のお寺を取得するクエリです。
```
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX gold: <http://purl.org/linguistics/gold/>

SELECT ?temple ?description
WHERE {
  ?temple dbo:wikiPageWikiLink dbr:Kamakura ;
          gold:hypernym dbr:Temple ;
          dbo:abstract ?description .
  FILTER (lang(?description) = "ja")
}
LIMIT 10
```
実行結果↓
![スクリーンショット 2024-05-23 15.54.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3796362/9f86f423-c10f-7ebf-fe86-3a59678bf604.png)

とれました。

#### 説明
まず、このクエリでは取得したい対象としてお寺のリソースを変数 ?temple に設定します。これは、クエリの主語として機能します。
次に、述語として dbo:wikiPageWikiLink を使用し、このリソースが dbr:Kamakura に関連していることを指定します。これにより、?temple が鎌倉に関連するリソースであることを確認します。
さらに、gold:hypernym プロパティを使用して、?temple が dbr:Temple という上位概念に該当することを指定します。これにより、リソースが寺であることを特定します。
最後に、述語 dbo:abstract を使用して、?temple の説明を変数 ?description に取得します。ここで dbo:abstract は説明（アブストラクト）を示すプロパティです。
また、FILTER を使用して、説明が日本語 (ja) であることを条件として追加します。これにより、取得する説明が日本語であることを保証します。
クエリの結果として、最大10件の結果を取得するように LIMIT 10 を指定しています。これにより、クエリの結果は10件に制限されます。
この一連の手順により、鎌倉に関連するお寺の情報を日本語の説明付きで取得することができます。