クラウド型データカタログサービス data.world の無償版で学ぶ SPARQL 実践ガイド

## 概要

data.world というクラウド型データカタログサービスがあるのですが、その特徴の１つである SPARQL によりクエリを発行できる機能を検証した内容を記事にします。data.world アカウントの申し込み方法から初めて、提供されているチュートリアルとドキュメントに記載されている SPARQL の紹介をしたうえで、既存のデータセットに手動で追加したデータを組み合わせてクエリを実行する方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/698c615a-afe4-24ec-33bb-52aa9e6f624c.png)

引用元：[The Data Catalog Platform | data.world](https://data.world/)

既存のデータセットに手動で追加したデータを組み合わせてクエリを実行する方法では、既存のデータセットデータに日本語の名称を追加した結果を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6a2bea0a-fffc-50a5-f9ec-e73edeebb3ca.png)

SPARQL の基本的な実行方法について下記の記事で紹介しています。

- [Google Colab （Python）にて SPARQL により Wikidata からデータを抽出する方法 #wikidata - Qiita](https://qiita.com/manabian/items/69aed65995f037ad0dd8)

## data.world の申し込み方法

### Community Platform と　Enterprise Data Catalog

data.world には、Community Platform と　Enterprise Data Catalogがあります。

> data.world offers two primary environments: the Enterprise Data Catalog and the Community platform. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b30cee6d-51ba-f9c1-5d1d-1301c8b673df.png)

引用元：[Exploring data.world: Community and Enterprise Offerings](https://docs.data.world/en/257934-exploring-data-world--community-and-enterprise-offerings.html)

今回は、Community Platform の Individual を利用するため、無償で利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/266aa725-4dfd-d04f-5301-569dff83e46f.png)

引用元：[Community Pricing | data.world](https://data.world/product/community/)

Enterprise Data Catalog については下記のサイトから申し込めるようですが、利用前のユースケースインタビューがあるようなので日本では手軽に試せない可能性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/455fc7c5-3ab9-e0bf-b019-274eccc52fa6.png)

引用元：[Get Started: Select Your Pricing Plan and We'll be in Touch | data.world](https://data.world/product/pricing/)

2 つの提供方法の差異が整理されているページを確認できませんでしたが、ドキュメントを確認するとどちらの提供方法で利用できる機能であるかが明示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d958f965-f6ed-ad7b-b9c5-59e8fe85c4a0.png)

引用元：[Supported sources (data.world)](https://docs.data.world/en/105177-currently-supported-data-sources.html)

### Community Platform の Individual 版の申し込み方法

### 1. data.world のサインアップページ（ https://data.world/sign-up ）にて必要事項を記入、あるいは、`Join with Google`を選択

私は`Join with Google`を選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8b265621-a98e-7f64-67c6-830cc36a5160.png)

引用元：[Signup | data.world](https://data.world/sign-up)

### 2. ユーザー名を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d600ad88-95bd-ead0-20e0-f98fd17d9b91.png)

### 3. data.world にログインできることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ed68ce3b-3859-6580-56f5-912ee6453179.png)

## data.world の SPAQL チュートリアル

### コンテンツ概要

data.world の製品ドキュメントではなく、 Gitbook 形式で下記のサイトにてコンテンツが提供されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2015a795-28f7-8b50-2a81-6de95e049f90.png)

引用元：[Welcome! · GitBook (data.world)](https://docs.data.world/tutorials/sparql/)

コンテンツの構成としては、下記の 3 ページがテーマごとにあり、 7 テーマあります。

1. 特定テーマの説明がされているページがあり
1. 自分で課題を解く Exercise のページ
1. Exercise の解決策が提示されているページ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8bdeccd1-5f7f-2220-7c3a-4ac65f9ee60c.png)

引用元：[Welcome! · GitBook (data.world)](https://docs.data.world/tutorials/sparql/)

data.world にログインしている場合には、コンテンツのページで SPAQL を実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fdb4912e-338b-a22b-6f9f-32f6aec9b015.png)

引用元：[Your First SPARQL Query · GitBook (data.world)](https://docs.data.world/tutorials/sparql/Your_First_Sparql_Query.html)

data.world のページ上で実行したい場合には、SPARQL_Tutorial データセットのページ ( https://data.world/tutorial/sparqltutorial )にアクセス後、右側にある`Launch workspace`を選択して表示されたページにクエリを発行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2ef369e7-0c39-1204-0bc7-7a1cd34724b2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/01932a01-5fa9-324c-4ea1-65f8d69aca69.png)

### コンテンツのテーマ

2024年9月24日時点で下記のテーマがあります。

| # | タイトル                            | コンテンツ概要                                                                                                                                    |
| -------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1        | Your First SPARQL Query             | SPARQLの基本構文を学び、初めてのクエリを実行する方法を説明します。`PREFIX`、`SELECT`、`WHERE`句の使い方を紹介します。                                 |
| 2        | Matching Exact Values In Queries    | クエリで特定の値を正確にマッチングする方法を学びます。特定の値に一致するデータをフィルタリングする方法を説明します。                               |
| 3        | Sorting and Summary Statistics      | クエリ結果をソートする方法と、集計統計（`MIN`、`MAX`など）を取得する方法を学びます。`ORDER BY`や`LIMIT`句の使い方も含まれます。                    |
| 4        | Grouping Your Data                  | データをグループ化し、各グループの集計を行う方法を学びます。`GROUP BY`句と集計関数の活用方法を紹介します。                                          |
| 5        | Filtering Your Data                 | データを様々な条件でフィルタリングする方法を学びます。特に、フィルタリング条件の指定方法や日付によるフィルタリングについて説明します。              |
| 6        | Introduction to Data Munging        | データの前処理（データマンジング）の基本を学びます。`BIND`を使った新しい変数の作成や、`FILTER`を使ったデータ操作方法を紹介します。                |
| 7        | Linking Datasets Together           | 複数のデータセットをリンクさせてクエリを実行する方法を学びます。SPARQLを使ったデータ統合と連携の基本的なテクニックを説明します。                  |

## data.world における SPARQL に関するドキュメント

### コンテンツ概要

data.world のドキュメントにて、 SPARQL の利用方法が紹介されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/45b64262-e1f6-6b01-8aee-2809ac3c1303.png)

引用元：[SPARQLing data.world](https://docs.data.world/en/114334-sparqling-data-world.html#UUID-eaf8084c-7c30-73a6-732b-15631cdecddf)

サンプルデータとして下記が提供されているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fba50724-5a1a-ca4b-a911-27b0536b3e1b.png)

引用元：[SPARQLing data.world](https://docs.data.world/en/114334-sparqling-data-world.html#UUID-eaf8084c-7c30-73a6-732b-15631cdecddf_UUID-c7284152-983f-6549-7337-4b0dffb325c5)

上記ページにて、`Name`の項目を選択することで、そのプロジェクト、あるいは、データセットに移動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5b731a7c-1a18-e92b-c8f7-f98395d09a1e.png)

ドキュメントに記載されている以下のようなコードを実行することで、data.worldでのSPARQLに対する理解を深めることができます。下記では CSV ファイル（Tabular files）からデータ取得する方法が紹介されています。実行できるサンプルコードの場合には`Run the query`という文言があり、そこをクリックするとクエリを実行できるプロジェクト、あるいは、データセットに移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7d7edee1-e325-15ad-719b-b720a2e4f4e2.png)

引用元：[Tabular files (data.world)](https://docs.data.world/en/114340-tabular-files.html#UUID-bf670d56-2684-c255-1f9f-56852e394a88_UUID-9e30a725-5928-38ec-2b12-7fa139746dc7)

移動先のページにて、クエリを実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/05a1b035-c296-704c-3a1d-6d42827ef68a.png)


## 既存のデータセットに手動で追加したデータを組み合わせてクエリを実行する方法

### 実施内容概要

[SPARQL_Tutorial](https://data.world/tutorial/sparqltutorial)に含まれる GOT.csv といるファイルのデータの日本語の名称のカラムを追加した結果を取得する手順を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/41d32ee6-2016-ba10-a446-53ad98f73ea7.png)

ベースとなる GOT.csv には、下記のようなデータを保持しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8d9befc6-184d-1244-a4fa-02541c17e85f.png)

日本語の名称を保持させた CSV ファイルをアップロードし、そのデータと上記データを組み合わせます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1733fa71-1be0-0ee8-6273-896e24a33add.png)

最終的には下記のようなクエリを発行して、その結果を取得します。英語をベースにした製品であることから日本語が適切に表示されていませんが、データをダウンロードすると想定通りの結果であることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1e8f9783-eec6-a19f-c0d3-0e250bde9bf1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/41d32ee6-2016-ba10-a446-53ad98f73ea7.png)


### 実施手順

#### 1. 右上の`+ New`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d1fb0914-e5f0-0500-f3bb-35af3f4add76.png)

#### 2. `Create new project`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7bccad6d-6667-5f8c-21c3-e076daf811f8.png)

#### 3. 適切な Project name を入力後、`Create project`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/48f12eea-bdd9-550f-9aad-ec23a61723ff.png)

#### 4. プロジェクトのページにて、`+ Add` -> `Dataset`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c715747d-89ab-d6f7-bb1f-f28930b7b5bb.png)

#### 5. `SPARQL_Tutorial`と検索して`SPARQL_Tutorial`の`Connect`を選択して、`Connected`に変更されたことを確認後に`Done`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/003ea749-749f-1789-d50c-7cf875df627d.png)


#### 6. 下記のデータをもつ`GOT_JAPANESE_NAME.csv`というファイルをローカル環境で作成して、プロジェクトの画面にドロップ

```csv
ID,FName__JA_JP,LName__JA_JP
1,ティリオン,ラニスター
2,ジェイミー,ラニスター
3,サーセイ,ラニスター
4,ロブ,スターク
5,ジョン,スターク
6,サンサ,スターク
7,アリア,スターク
8,ブラン,スターク
9,リコン,スターク
10,レイガー,ターガリエン
11,ヴィセーリス,ターガリエン
12,デナーリス,ターガリエン
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a138b145-2d84-3049-318b-bca5b2dc6a8d.png)

#### 7.  `GOT_JAPANESE_NAME.csv`というファイルが追加されたことを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4fc236aa-9769-977e-a09e-25364bbba673.png)


#### 8.  `+ Add` -> `SPARQL Query`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e59752b9-45e2-da57-894e-d03dff19426a.png)

#### 9. 既存のデータセットのデータである`GOT.csv`のデータを表示

```sparql
PREFIX GOT_JAJP: <https://{user_name}.linked.data.world/d/{project_name}/>

SELECT ?ID ?fname_ja_jp ?lname_ja_jp
WHERE {
    ?person GOT_JAJP:col-got_japanese_name-id ?ID ;
            GOT_JAJP:col-got_japanese_name-fname_ja_jp ?fname_ja_jp ;
            GOT_JAJP:col-got_japanese_name-lname_ja_jp ?lname_ja_jp ;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8edbbd73-8e38-9e97-8767-5d9cf42bb716.png)

#### 10. 追加したデータである`GOT_JAPANESE_NAME.csv`ファイルのデータを表示

下記のクエリにて、`{user_name}`と`{project_name}`の箇所を修正してクエリを実行します。

```sparql
PREFIX GOT_JAJP: <https://{user_name}.linked.data.world/d/{project_name}/>

SELECT ?ID ?fname_ja_jp ?lname_ja_jp
WHERE {
    ?person GOT_JAJP:col-got_japanese_name-id ?ID ;
            GOT_JAJP:col-got_japanese_name-fname_ja_jp ?fname_ja_jp ;
            GOT_JAJP:col-got_japanese_name-lname_ja_jp ?lname_ja_jp ;
}
```

私のプロジェクトでは下記のようなクエリを実行します。

```sparql
PREFIX GOT_JAJP: <https://manabian.linked.data.world/d/querywithotherpj/>

SELECT ?ID ?fname_ja_jp ?lname_ja_jp
WHERE {
    ?person GOT_JAJP:col-got_japanese_name-id ?ID ;
            GOT_JAJP:col-got_japanese_name-fname_ja_jp ?fname_ja_jp ;
            GOT_JAJP:col-got_japanese_name-lname_ja_jp ?lname_ja_jp ;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6438dcc9-eb89-5c6a-874b-f045500bb3d4.png)

#### 11.  `GOT_JAPANESE_NAME.csv`というファイルのデータを表示


下記のクエリにて、`{user_name}`と`{project_name}`の箇所を修正してクエリを実行します。

```spark
PREFIX GOT: <https://tutorial.linked.data.world/d/sparqltutorial/>
PREFIX GOT_JAJP: <https://{user_name}.linked.data.world/d/{project_name}/>

SELECT ?ID ?fname ?fname_ja_jp ?lname ?lname_ja_jp  
WHERE {
    ?person GOT:col-got-id ?ID ;
            GOT:col-got-fname ?fname ;
            GOT:col-got-lname ?lname .
    ?person2 GOT_JAJP:col-got_japanese_name-id ?ID ;
            GOT_JAJP:col-got_japanese_name-fname_ja_jp ?fname_ja_jp ;
            GOT_JAJP:col-got_japanese_name-lname_ja_jp ?lname_ja_jp ;
}
```

私のプロジェクトでは下記のようなクエリを実行します。

```spark
PREFIX GOT: <https://tutorial.linked.data.world/d/sparqltutorial/>
PREFIX GOT_JAJP: <https://manabian.linked.data.world/d/querywithotherpj/>

SELECT ?ID ?fname ?fname_ja_jp ?lname ?lname_ja_jp  
WHERE {
    ?person GOT:col-got-id ?ID ;
            GOT:col-got-fname ?fname ;
            GOT:col-got-lname ?lname .
    ?person2 GOT_JAJP:col-got_japanese_name-id ?ID ;
            GOT_JAJP:col-got_japanese_name-fname_ja_jp ?fname_ja_jp ;
            GOT_JAJP:col-got_japanese_name-lname_ja_jp ?lname_ja_jp ;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1e8f9783-eec6-a19f-c0d3-0e250bde9bf1.png)

## Next Challenge

### Challenge 概要

次にチャレンジしたいこと

1. `Enhancements to data`機能の理解
2. 有料サブスクリプションで実施できる内容の調査
3. AI Context Engine に関する調査

### 1. `Enhancements to data`機能の理解

`Enhancements to data`機能として紹介されている下記機能の有用性について調査します。

- [SHACL shapes file support](https://docs.data.world/en/114351-shacl-shapes-file-support.html)
- [Mapping with R2RML](https://docs.data.world/en/114352-mapping-with-r2rml.html)
- [RDF ontologies supported by data.world](https://docs.data.world/en/114353-rdf-ontologies-supported-by-data-world.html)

### 2. 有料サブスクリプションで実施できる内容の調査

Community Platform にて契約できる下記の有料サブスクリプションについて調査します。

1. Enterprise Team
1. Team Professional

`Enterprise Team` は、サイトに下記のプランとして記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0a98a201-9320-d57a-a1bd-55353fd12825.png)

右上の`Setting` -> `Biling`の画面から契約を変更できそうでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0513bf04-d2ee-ba07-0bf0-17b1e69f9e89.png)

`Team Professional`はサイトにて紹介されていませんが、右上の`Setting` -> `Oraganizations` -> `Create organiation` を選択すると、組織の作成時にサブスクリプションを選べました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/62954dd3-1277-64fc-cffc-f17e30b76ac9.png)


### 3. AI Context Engine に関する調査

質問内容に対してセマンティックモデルに基づき回答を実施できる AI Context Engine という機能の技術的な背景を調査します。どのような機能であるかのイメージがつかない方は、操作できるデモ画面になっておりますので動作確認をしてみてください。この機能にて、オントロジーなどを利用している点がユニークです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9a057e6f-fd51-faa1-534d-adc885f55a14.png)

引用元：[Key terms and roles (data.world)](https://docs.data.world/en/250559-key-terms-and-roles.html#UUID-dd9c8b57-a84e-7751-d55a-40ebb505ecb9_section-idm234364268730869)

Thought process を確認すると下記の処理を実施しており、オントロジーなどを利用してデータ取得するクエリを生成しているようです。

|# | ステージ                               | 処理内容（推測）                                                                 |
|-----|----------------------------------------|--------------------------------------------------------------------------|
| 1   | 🔍 Starting...                         | 処理の開始と初期化                                                       |
| 2   | 🗂️ plan-classes-to-use-state           | 使用するクラスやモジュールの計画                                          |
| 3   | 🤔 Evaluating the ontology             | オントロジーを評価し、処理の計画を立てる                                 |
| 4   | 🗂️ build-date-string-state            | 日付に関するデータを整形し、クエリに使える形式に変換                     |
| 5   | 🗂️ question-to-query-state            | 自然言語の質問をシステムクエリに変換                                     |
| 6   | 🤔 Generating and reviewing queries    | クエリを生成し、適切なものかどうか確認                                   |
| 7   | 🤔 Query looks like it ran correctly   | クエリが正しく実行され、必要に応じて微修正が行われる                     |
| 8   | 🗂️ query-to-answer-state              | クエリ結果を元に回答を生成                                               |
| 9   | 🗂️ Packaging up results               | 結果をフォーマットし、ユーザーに返す準備                                 |
| 10  | 🤔 Processing results...               | 最終的な結果の処理とパッケージング                                       |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0e7f71ce-259b-ae4a-06f8-b6645990ba30.png)

引用元：[Key terms and roles (data.world)](https://docs.data.world/en/250559-key-terms-and-roles.html#UUID-dd9c8b57-a84e-7751-d55a-40ebb505ecb9_section-idm234364268730869)

利用されている３つのファイルがドキュメントにて紹介されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d7280f4e-c521-bd49-4055-2d5978ec0490.png)

引用元：[Key terms and roles (data.world)](https://docs.data.world/en/250559-key-terms-and-roles.html#UUID-dd9c8b57-a84e-7751-d55a-40ebb505ecb9_section-idm234364268055048)

残念ながら Community Platform での利用はできない旨の記載があるため、現時点では機能を推測するしかない状況です。

> Contact the data.world support team or your Customer Success Director to get the AI Context Engine API access enabled in the data.world organization for which you want to set up AI Context Engine.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d183993c-ad38-ca94-a38b-e45c68647513.png)

引用元：[Prep tasks for AI Context Engine (data.world)](https://docs.data.world/en/250564-prep-tasks-for-ai-context-engine.html)