BH13.13/D2RQ
提供:TogoWiki
目次 |
概要
D2RQ = RDBに収納してあるデータをRDFに変換するツールの調査
ツール調査・使用の目的
- RDF化およびトリプルサーバ構築を省くことが出来る
- Oracle等の信頼性の高いRDBMSを利用できる
類似のツール
- Virtuoso RDF View
- Triplify
- Spyder
- (注意) ARC2はMySQLを使ってTriplestoreを構成しているがERモデルへのマッピングができるわけではない
今回検証する構成
- D2R Serverをラッパーとして既存RDBからSPARQLエンドポイントを構築
D2RQ : Accessing Relational Databases as Virtual RDF Graphs
Members (だいたい辞書順)
- 藤原
- 山本
- 山中
調査環境
- D2RQ
- version 0.8.1 (2012/06/22)
- SPARQL 1.1 に対応
- Oracle, MySQL, PostgreSQL, SQL Server, HSQLDB, Interbase/Firebird に対応
- version 0.8.1 (2012/06/22)
- MySQL
- version 5.5.22
- Oracle
- version 12c (12.1.0)
インストール・設定 - 概要 -
大まかな流れ
- D2RQ インストール
- マッピングファイルを自動生成
- マッピングファイルを編集
- WEBサーバ起動(D2R Server、Tomcat、Jetty など)
1. D2RQ インストール
JDBC Driver の用意
- Oracle 12c の場合
- ここから Java のバージョンに応じた JDBC (ojdbc6.jar または ojdbc7.jar) をダウンロードして <d2rq-root>/lib/db-drivers/ に配置
- http://www.oracle.com/technetwork/database/features/jdbc/jdbc-drivers-12c-download-1958347.html
- MySQL の場合
- MySQLおよびPostgreSQLのJDBCは予めD2RQに含まれている
D2RQ に付属する D2R Server を利用することができるが、TomcatやJetty上で稼働させることも可能。以下、Tomcatでの設定方法概要
- D2RQPath/webapp/WEB-INF/web.xml を編集
<context-param> <param-name>configFile</param-name> <param-value>config-example.ttl</param-value> </context-param>
- antでd2rq.war作成
cd D2RQPath/ ant war chmod 0755 d2rq.war
- d2rq.war を TomcatPath/webapp/ にコピー
- Tomcat CORS対応のため tomcat/conf/web.xml を編集
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2. マッピングファイルを自動生成
- Oracle 12c の場合
- JDBC Driver 指定文字列: oracle.jdbc.driver.OracleDriver
- JDBC 接続文字列: jdbc:oracle:thin:@localhost:1521:db01
- Oracle の各スキーマはユーザー表以外の表を含み、これらのマッピングは必要ないため --tables <表名カンマ区切り> を付ける。なぜか表名にスキーマ指定が必要。
./generate-mapping -o mapping.ttl -d oracle.jdbc.driver.OracleDriver -u user01 -p oracle --tables USER01.EMP,USER01.DEPT jdbc:oracle:thin:@localhost:1521:db01
- MySQL の場合
./generate-mapping -o mapping.ttl -u user1 -p pass jdbc:mysql://mysql.server.jp:3306/MEDLINE
3. マッピングファイルを編集
以下に設定例あり
調査目標
SPARQL1.1の対応度を調査
- D2RQ非対応キーワードなど
マッピングファイル設定方法を調査
- サンプルデータベースを利用し、主に以下の項目について設定方法を調査
- 任意のURIを設定できるか
- 述語に任意のオントロジーを利用できるか
- テーブルをjoinしてRDFを生成できるか
- 複数カラムの値をまとめてRDFを生成できるか
- 複数データベースに接続してRDを生成できるか(※BH13.13では未調査、その後D2RQで確認済)
パフォーマンスに関する調査
- D2RQとVirtuosoのパフォーマンスを比較
- 大量データを取得(※BH13.13では未調査)
D2RQサーバーが発行するSQLに関する調査
- "d2r-query"コマンドのログを調査
- D2RQがRDBに対して実際にどのようなSQLを発行しているか調査
ログに関する調査
- D2RQが発行したSQLやSQL実行時間等のログが出力されるか(※BH13.13では未調査、その後SQLクエリが出力されるオプションがd2r-queryコマンドにあることを確認)
調査結果
SPARQL1.1の対応度の調査結果
- 調査結果:BH12.12/SPARQL11test
- D2RQ非対応キーワード
- FROM
- SERVICES (0.8.2dev以降で対応)
- VALUES
- D2RQ非対応キーワード
マッピングファイル設定方法の調査結果
対象データベース
- MEDLINEを収納したMySQLデータベース
- 書誌情報2300万件以上を収納
- 対象テーブル数:4
- 対象レコード数:約7000万レコード
- 対象とするデータベースのテーブル
mysql> desc AUTHORS; +---------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+------------------+------+-----+---------+-------+ | PMID | int(10) unsigned | NO | PRI | 0 | | | PDATE | varchar(64) | YES | MUL | NULL | | | AUTHORS | text | YES | MUL | NULL | | +---------+------------------+------+-----+---------+-------+ mysql> desc TITLES; +-------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+-------+ | PMID | int(10) unsigned | NO | PRI | 0 | | | TITLE | text | NO | MUL | NULL | | +-------+------------------+------+-----+---------+-------+ mysql> desc PMID_JVIP; +-------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------+------+-----+---------+-------+ | PMID | int(10) unsigned | NO | PRI | 0 | | | VOLUME | varchar(64) | YES | MUL | NULL | | | ISSUE | varchar(64) | YES | | NULL | | | SPAGE | varchar(64) | YES | MUL | NULL | | | MEDLINEPGN | varchar(128) | YES | MUL | NULL | | | NLMUNIQUEID | varchar(16) | YES | MUL | NULL | | +-------------+------------------+------+-----+---------+-------+ mysql> desc JOUR_INFO; +-----------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+---------+-------+ | ISSN | char(12) | YES | MUL | NULL | | | NLMUNIQUEID | char(10) | NO | PRI | NULL | | | TITLE | varchar(127) | YES | MUL | NULL | | | ISOABBREVIATION | char(32) | YES | MUL | NULL | | | MEDLINETA | char(32) | YES | MUL | NULL | | | COUNTRY | char(12) | YES | | NULL | | +-----------------+--------------+------+-----+---------+-------+
対象データベースから生成するRDFについて
- 生成したいRDF例
<http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> rdf:type colil:PubMed . <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> togows:pmid "10592235" . <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> togows:ti "The Protein Data Bank." . <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> colil:writtenBy "Berman HM, Westbrook J, Feng Z, Gilliland G, Bhat TN, Weissig H, Shindyalov IN, Bourne PE" . <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> togows:so "Nucleic Acids Res. 2000Jan1;28(1):235-42" .
マッピングファイル
- 目的のRDFを生成するために必要な設定
- 主語のURIを"http://togows.dbcls.jp/entry/ncbi-pubmed/[PMID]"に設定
- 述語にtogowsオントロジーやcolilオントロジーを利用
- "PMID_JVIP"テーブルと"JOUR_INFO"テーブルをjoin、および複数のカラムの値をまとめて書誌情報のソース("Nucleic Acids Res. 2000Jan1;28(1):235-42")を生成
- "generate-mapping"コマンドにより自動で出力されたmappingファイル
- 実行コマンド "./generate-mapping -o mapping.ttl -u user1 -p pass jdbc:mysql://mysql.server.jp:3306/MEDLINE"
- 各項目の簡単な説明と、目的のRDFを生成するために必要な修正箇所をコメントとして追記
@prefix map: <#> .
@prefix db: <> .
@prefix vocab: <vocab/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> .
@prefix jdbc: <http://d2rq.org/terms/jdbc/> .
# prefixを追加
@prefix d2r: <http://sites.wiwiss.fu-berlin.de/suhl/bizer/d2r-server/config.rdf#> . # 新規追加行
@prefix meta: <http://www4.wiwiss.fu-berlin.de/bizer/d2r-server/metadata#> . # 新規追加行
@prefix colil: <http://purl.jp/bio/10/colil/ontology/201303#> . # 新規追加行
@prefix togows: <http://togows.dbcls.jp/ontology/ncbi-pubmed#> . # 新規追加行
map:database a d2rq:Database;
d2rq:jdbcDriver "com.mysql.jdbc.Driver";
d2rq:jdbcDSN "jdbc:mysql://mysql.server.jp:3306/MEDLINE";
d2rq:username "user1";
d2rq:password "pass";
jdbc:autoReconnect "true";
jdbc:zeroDateTimeBehavior "convertToNull";
.
# Table TITLES
map:TITLES a d2rq:ClassMap; # "TITLES"テーブルから生成されるRDFの主語について設定する項目
d2rq:dataStorage map:database;
# Sorry, I don't know which columns to put into the uriPattern # Primary keyをD2RQが上手く認識できなかった → コメント削除
# for "TITLES" because the table doesn't have a primary key. # 削除
# Please specify it manually. # 削除
d2rq:uriPattern "TITLES"; # 主語のURIパターンを設定 → d2rq:uriPattern "http://togows.dbcls.jp/entry/ncbi-pubmed/@@TITLES.PMID@@";
d2rq:class vocab:TITLES; # 主語のrdf:typeを設定 → d2rq:class colil:PubMed;
d2rq:classDefinitionLabel "TITLES";
.
map:TITLES_PMID a d2rq:PropertyBridge; # "TITLES"テーブルから生成されるRDFの述語と目的語について設定する項目。"PMID"カラムを元に設定
d2rq:belongsToClassMap map:TITLES;
d2rq:property vocab:TITLES_PMID; # 述語を設定 → d2rq:property togows:pmid;
d2rq:propertyDefinitionLabel "TITLES PMID";
d2rq:column "TITLES.PMID";
d2rq:datatype xsd:integer; # 述語の型を設定 → 削除
.
map:TITLES_TITLE a d2rq:PropertyBridge; # "TITLES"テーブルから生成されるRDFの述語と目的語について設定する項目。"TITLE"カラムを元に設定
d2rq:belongsToClassMap map:TITLES;
d2rq:property vocab:TITLES_TITLE; # 述語を設定 → d2rq:property togows:ti;
d2rq:propertyDefinitionLabel "TITLES TITLE";
d2rq:column "TITLES.TITLE";
.
# Table AUTHORS
map:AUTHORS a d2rq:ClassMap;
d2rq:dataStorage map:database;
# Sorry, I don't know which columns to put into the uriPattern # 削除
# for "AUTHORS" because the table doesn't have a primary key. # 削除
# Please specify it manually. # 削除
d2rq:uriPattern "AUTHORS"; # 主語のURIパターンを設定 → d2rq:uriPattern "http://togows.dbcls.jp/entry/ncbi-pubmed/@@AUTHORS.PMID@@";
d2rq:class vocab:AUTHORS; # "TITLES"テーブルでrdf:typeは設定したので、このテーブルでは必要ない → 削除
d2rq:classDefinitionLabel "AUTHORS";
.
map:AUTHORS_PMID a d2rq:PropertyBridge; # 削除
d2rq:belongsToClassMap map:AUTHORS; # 削除
d2rq:property vocab:AUTHORS_PMID; # 削除
d2rq:propertyDefinitionLabel "AUTHORS PMID"; # 削除
d2rq:column "AUTHORS.PMID"; # 削除
d2rq:datatype xsd:integer; # 削除
. # 削除
map:AUTHORS_PDATE a d2rq:PropertyBridge; # 削除
d2rq:belongsToClassMap map:AUTHORS; # 削除
d2rq:property vocab:AUTHORS_PDATE; # 削除
d2rq:propertyDefinitionLabel "AUTHORS PDATE"; # 削除
d2rq:column "AUTHORS.PDATE"; # 削除
. # 削除
map:AUTHORS_AUTHORS a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:AUTHORS;
d2rq:property vocab:AUTHORS_AUTHORS; # 述語を設定 → d2rq:property colil:writtenBy;
d2rq:propertyDefinitionLabel "AUTHORS AUTHORS";
d2rq:column "AUTHORS.AUTHORS";
.
# Table PMID_JVIP
map:PMID_JVIP a d2rq:ClassMap;
d2rq:dataStorage map:database;
# Sorry, I don't know which columns to put into the uriPattern # 削除
# for "PMID_JVIP" because the table doesn't have a primary key. # 削除
# Please specify it manually. # 削除
d2rq:uriPattern "PMID_JVIP"; # 主語のURIパターンを設定 → d2rq:uriPattern "http://togows.dbcls.jp/entry/ncbi-pubmed/@@PMID_JVIP.PMID@@";
d2rq:class vocab:PMID_JVIP; # 削除
d2rq:classDefinitionLabel "PMID_JVIP";
.
# " JOUR_INFO"テーブルをjoinして値を取得し、述語・目的語が書誌情報のソースとなる設定を追加
map:PMID_JVIP_SO a d2rq:PropertyBridge; # 新規追加行
d2rq:belongsToClassMap map:PMID_JVIP; # 新規追加行
d2rq:property togows:so; # 新規追加行
d2rq:propertyDefinitionLabel "PMID_JVIP SO"; # 新規追加行
d2rq:pattern "@@JOUR_INFO.MEDLINETA@@. @@AUTHORS.PDATE@@;@@PMID_JVIP.VOLUME@@(@@PMID_JVIP.ISSUE@@):@@PMID_JVIP.MEDLINEPGN@@"; # 新規追加行
d2rq:join "PMID_JVIP.NLMUNIQUEID = JOUR_INFO.NLMUNIQUEID"; # 新規追加行
d2rq:join "PMID_JVIP.PMID = AUTHORS.PMID"; # 新規追加行
. # 新規追加行
# 以降、map:PMID_JVIP_PMID関連の記述は全て削除
map:PMID_JVIP_PMID a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:PMID_JVIP;
d2rq:property vocab:PMID_JVIP_PMID;
d2rq:propertyDefinitionLabel "PMID_JVIP PMID";
d2rq:column "PMID_JVIP.PMID";
d2rq:datatype xsd:integer;
.
map:PMID_JVIP_VOLUME a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:PMID_JVIP;
d2rq:property vocab:PMID_JVIP_VOLUME;
d2rq:propertyDefinitionLabel "PMID_JVIP VOLUME";
d2rq:column "PMID_JVIP.VOLUME";
.
map:PMID_JVIP_ISSUE a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:PMID_JVIP;
d2rq:property vocab:PMID_JVIP_ISSUE;
d2rq:propertyDefinitionLabel "PMID_JVIP ISSUE";
d2rq:column "PMID_JVIP.ISSUE";
.
map:PMID_JVIP_SPAGE a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:PMID_JVIP;
d2rq:property vocab:PMID_JVIP_SPAGE;
d2rq:propertyDefinitionLabel "PMID_JVIP SPAGE";
d2rq:column "PMID_JVIP.SPAGE";
.
map:PMID_JVIP_MEDLINEPGN a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:PMID_JVIP;
d2rq:property vocab:PMID_JVIP_MEDLINEPGN;
d2rq:propertyDefinitionLabel "PMID_JVIP MEDLINEPGN";
d2rq:column "PMID_JVIP.MEDLINEPGN";
.
map:PMID_JVIP_NLMUNIQUEID a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:PMID_JVIP;
d2rq:property vocab:PMID_JVIP_NLMUNIQUEID;
d2rq:propertyDefinitionLabel "PMID_JVIP NLMUNIQUEID";
d2rq:column "PMID_JVIP.NLMUNIQUEID";
.
# Table JOUR_INFO # "JOUR_INFO"テーブルからはRDFを生成しないので、"JOUR_INFO"について設定は削除
map:JOUR_INFO a d2rq:ClassMap;
d2rq:dataStorage map:database;
# Sorry, I don't know which columns to put into the uriPattern
# for "JOUR_INFO" because the table doesn't have a primary key.
# Please specify it manually.
d2rq:uriPattern "JOUR_INFO";
d2rq:class vocab:JOUR_INFO;
d2rq:classDefinitionLabel "JOUR_INFO";
.
map:JOUR_INFO_ISSN a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:JOUR_INFO;
d2rq:property vocab:JOUR_INFO_ISSN;
d2rq:propertyDefinitionLabel "JOUR_INFO ISSN";
d2rq:column "JOUR_INFO.ISSN";
.
map:JOUR_INFO_NLMUNIQUEID a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:JOUR_INFO;
d2rq:property vocab:JOUR_INFO_NLMUNIQUEID;
d2rq:propertyDefinitionLabel "JOUR_INFO NLMUNIQUEID";
d2rq:column "JOUR_INFO.NLMUNIQUEID";
.
map:JOUR_INFO_TITLE a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:JOUR_INFO;
d2rq:property vocab:JOUR_INFO_TITLE;
d2rq:propertyDefinitionLabel "JOUR_INFO TITLE";
d2rq:column "JOUR_INFO.TITLE";
.
map:JOUR_INFO_ISOABBREVIATION a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:JOUR_INFO;
d2rq:property vocab:JOUR_INFO_ISOABBREVIATION;
d2rq:propertyDefinitionLabel "JOUR_INFO ISOABBREVIATION";
d2rq:column "JOUR_INFO.ISOABBREVIATION";
.
map:JOUR_INFO_MEDLINETA a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:JOUR_INFO;
d2rq:property vocab:JOUR_INFO_MEDLINETA;
d2rq:propertyDefinitionLabel "JOUR_INFO MEDLINETA";
d2rq:column "JOUR_INFO.MEDLINETA";
.
map:JOUR_INFO_COUNTRY a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:JOUR_INFO;
d2rq:property vocab:JOUR_INFO_COUNTRY;
d2rq:propertyDefinitionLabel "JOUR_INFO COUNTRY";
d2rq:column "JOUR_INFO.COUNTRY";
.
- 上記の自動で出力されたmappingファイルをコメントに従い修正した内容
@prefix map: <#> .
@prefix db: <> .
@prefix vocab: <vocab/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> .
@prefix jdbc: <http://d2rq.org/terms/jdbc/> .
@prefix d2r: <http://sites.wiwiss.fu-berlin.de/suhl/bizer/d2r-server/config.rdf#> .
@prefix meta: <http://www4.wiwiss.fu-berlin.de/bizer/d2r-server/metadata#> .
@prefix colil: <http://purl.jp/bio/10/colil/ontology/201303#> .
@prefix togows: <http://togows.dbcls.jp/ontology/ncbi-pubmed#> .
map:database a d2rq:Database;
d2rq:jdbcDriver "com.mysql.jdbc.Driver";
d2rq:jdbcDSN "jdbc:mysql://mysql.server.jp:3306/MEDLINE";
d2rq:username "user1";
d2rq:password "pass";
jdbc:autoReconnect "true";
jdbc:zeroDateTimeBehavior "convertToNull";
.
# Table TITLES
map:TITLES a d2rq:ClassMap;
d2rq:dataStorage map:database;
d2rq:uriPattern "http://togows.dbcls.jp/entry/ncbi-pubmed/@@TITLES.PMID@@";
d2rq:class colil:PubMed;
d2rq:classDefinitionLabel "TITLES";
.
map:TITLES_PMID a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:TITLES;
d2rq:property togows:pmid;
d2rq:propertyDefinitionLabel "TITLES PMID";
d2rq:column "TITLES.PMID";
.
map:TITLES_TITLE a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:TITLES;
d2rq:property togows:ti;
d2rq:propertyDefinitionLabel "TITLES TITLE";
d2rq:column "TITLES.TITLE";
.
# Table AUTHORS
map:AUTHORS a d2rq:ClassMap;
d2rq:dataStorage map:database;
d2rq:uriPattern "http://togows.dbcls.jp/entry/ncbi-pubmed/@@AUTHORS.PMID@@";
d2rq:classDefinitionLabel "AUTHORS";
.
map:AUTHORS_AUTHORS a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:AUTHORS;
d2rq:property colil:writtenBy;
d2rq:propertyDefinitionLabel "AUTHORS AUTHORS";
d2rq:column "AUTHORS.AUTHORS";
.
# Table PMID_JVIP
map:PMID_JVIP a d2rq:ClassMap;
d2rq:dataStorage map:database;
d2rq:uriPattern "http://togows.dbcls.jp/entry/ncbi-pubmed/@@PMID_JVIP.PMID@@";
d2rq:classDefinitionLabel "PMID_JVIP";
.
map:PMID_JVIP_SO a d2rq:PropertyBridge;
d2rq:belongsToClassMap map:PMID_JVIP;
d2rq:property togows:so;
d2rq:propertyDefinitionLabel "PMID_JVIP SO";
d2rq:pattern "@@JOUR_INFO.MEDLINETA@@. @@AUTHORS.PDATE@@;@@PMID_JVIP.VOLUME@@(@@PMID_JVIP.ISSUE@@):@@PMID_JVIP.MEDLINEPGN@@";
d2rq:join "PMID_JVIP.NLMUNIQUEID = JOUR_INFO.NLMUNIQUEID";
d2rq:join "PMID_JVIP.PMID = AUTHORS.PMID";
.
修正したマッピングファイルを利用して生成されたRDFについて
- マッピングファイルを修正しなかった場合(デフォルトのまま)
- 例えば、PMID"10592235"について"TITLES"テーブルから生成されるRDF
db:TITLES rdf:type vocab:TITLES . db:TITLES vocab:TITLES_PMID 10592235 . db:TITLES vocab:TITLES_TITLE "The Protein Data Bank." .
- マッピングファイルを修正した場合
- 例えば、PMID"10592235"についてのRDF
<http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> rdf:type colil:PubMed . <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> togows:pmid "10592235" . <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> togows:ti "The Protein Data Bank." . <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> colil:writtenBy "Berman HM, Westbrook J, Feng Z, Gilliland G, Bhat TN, Weissig H, Shindyalov IN, Bourne PE" . <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> togows:so "Nucleic Acids Res. 2000Jan1;28(1):235-42" .
パフォーマンスに関する調査結果
D2RQとVirtuosoのパフォーマンスを比較
比較のためD2RQで生成されるRDFをVirtuosoに収納し、サンプルクエリの実行時間を比較
- D2RQ設定
・対象サンプルデータベース 上記マッピングファイル設定例と同じデータベース ・マッピングファイル設定 上記マッピングファイル設定例と同じ
- SPARQL
PREFIX colil: <http://purl.jp/bio/10/colil/ontology/201303#>
PREFIX togows: <http://togows.dbcls.jp/ontology/ncbi-pubmed#>
select * where{
?s rdf:type colil:PubMed;
togows:pmid "11104519" ;
?p ?o .
}
- D2RQとVirtuosoのパフォーマンスを比較結果
- クエリ実行時間
- Virtuoso (virtuoso opensource stable7):1.3秒
- D2RQ (ver 0.8.1):0.9秒
- クエリ実行時間
D2RQサーバーが発行するSQLに関する調査結果
"d2r-query"コマンドのログ
"d2r-query"コマンドに"--vervose"オプションを付けて実行すると、出力されるログに、引数で渡したSPARQLに対応するSQLが含まれる
- ログの出力例
$ ./d2r-query --verbose mapping.ttl "SELECT * WHERE{ <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> ?p ?o }"
11:56:41 INFO SystemLoader :: Reading mapping file from mapping.ttl
11:56:41 INFO MapParser :: Done reading D2RQ map with 1 databases and 3 class maps
11:56:41 INFO d2r_query :: Query:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX db: <http://localhost:2020/>
PREFIX togows: <http://togows.dbcls.jp/ontology/ncbi-pubmed#>
PREFIX d2r: <http://sites.wiwiss.fu-berlin.de/suhl/bizer/d2r-server/config.rdf#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX map: <http://localhost:2020/#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX colil: <http://purl.jp/bio/10/colil/ontology/201303#>
PREFIX vocab: <http://localhost:2020/vocab/>
PREFIX meta: <http://www4.wiwiss.fu-berlin.de/bizer/d2r-server/metadata#>
SELECT * { <http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> ?p ?o }
11:56:41 INFO ConnectedDB :: Establishing JDBC connection to jdbc:mysql://mysql.server.jp:3306/MEDLINE
11:56:42 INFO ConnectedDB :: JDBC database product type: MySQL
11:56:42 INFO ConnectedDB :: Using vendor class: de.fuberlin.wiwiss.d2rq.sql.vendor.MySQL
11:56:42 INFO Mapping :: Compiled 5 property bridges
11:56:42 INFO SQLIterator :: SELECT `TITLES`.`PMID`, `TITLES`.`TITLE` FROM `TITLES` WHERE `TITLES`.`PMID` = 10592235
11:56:42 INFO SQLIterator :: SELECT `AUTHORS`.`AUTHORS` FROM `AUTHORS` WHERE (`AUTHORS`.`AUTHORS` IS NOT NULL AND `AUTHORS`.`PMID` = 10592235)
11:56:42 INFO SQLIterator :: SELECT `PMID_JVIP`.`MEDLINEPGN`, `PMID_JVIP`.`ISSUE`, `AUTHORS`.`PDATE`, `PMID_JVIP`.`VOLUME`, `JOUR_INFO`.`MEDLINETA` FROM `AUTHORS`, `JOUR_INFO`, `PMID_JVIP` WHERE (`AUTHORS`.`PDATE` IS NOT NULL AND `AUTHORS`.`PMID` = `PMID_JVIP`.`PMID` AND `JOUR_INFO`.`MEDLINETA` IS NOT NULL AND `JOUR_INFO`.`NLMUNIQUEID` = `PMID_JVIP`.`NLMUNIQUEID` AND `PMID_JVIP`.`ISSUE` IS NOT NULL AND `PMID_JVIP`.`MEDLINEPGN` IS NOT NULL AND `PMID_JVIP`.`PMID` = 10592235 AND `PMID_JVIP`.`VOLUME` IS NOT NULL)
-----------------------------------------------------------------------------------------------------------------
| p | o |
=================================================================================================================
| togows:ti | "The Protein Data Bank." |
| togows:pmid | "10592235" |
| rdf:type | colil:PubMed |
| colil:writtenBy | "Berman HM, Westbrook J, Feng Z, Gilliland G, Bhat TN, Weissig H, Shindyalov IN, Bourne PE" |
| togows:so | "Nucleic Acids Res. 2000Jan1;28(1):235-42" |
-----------------------------------------------------------------------------------------------------------------
11:56:42 INFO ConnectedDB :: Closing connection to jdbc:mysql://mysql.server.jp:3306/MEDLINE
- 「引数で渡したSPARQL」と「D2RQが発行したSQL」を比較
・引数で渡したSPARQL
SELECT * WHERE{
<http://togows.dbcls.jp/entry/ncbi-pubmed/10592235> ?p ?o
}
・D2RQが発行したSQL
SELECT `TITLES`.`PMID`, `TITLES`.`TITLE`
FROM `TITLES`
WHERE `TITLES`.`PMID` = 10592235
SELECT `AUTHORS`.`AUTHORS`
FROM `AUTHORS`
WHERE (`AUTHORS`.`AUTHORS` IS NOT NULL
AND `AUTHORS`.`PMID` = 10592235)
SELECT `PMID_JVIP`.`MEDLINEPGN`, `PMID_JVIP`.`ISSUE`, `AUTHORS`.`PDATE`, `PMID_JVIP`.`VOLUME`, `JOUR_INFO`.`MEDLINETA`
FROM `AUTHORS`, `JOUR_INFO`, `PMID_JVIP`
WHERE (`AUTHORS`.`PDATE` IS NOT NULL
AND `AUTHORS`.`PMID` = `PMID_JVIP`.`PMID`
AND `JOUR_INFO`.`MEDLINETA` IS NOT NULL
AND `JOUR_INFO`.`NLMUNIQUEID` = `PMID_JVIP`.`NLMUNIQUEID`
AND `PMID_JVIP`.`ISSUE` IS NOT NULL
AND `PMID_JVIP`.`MEDLINEPGN` IS NOT NULL
AND `PMID_JVIP`.`PMID` = 10592235
AND `PMID_JVIP`.`VOLUME` IS NOT NULL)
D2RQサーバーが発行するSQL (EMP表とDEPT表)
概要
- D2RQサーバーのバックエンドとしてOracle12cを使用
- SQLトレース機能を使ってD2RQサーバーから発行されたSQLを確認する
使用するデータ
- EMP(employee)表とDEPT(department)表
- SQL文
CREATE TABLE dept ( deptno NUMBER CONSTRAINT pk_DeptTab_deptno PRIMARY KEY, dname VARCHAR2(30), loc VARCHAR2(30) ); CREATE TABLE emp ( empno NUMBER PRIMARY KEY, ename VARCHAR2(30), job VARCHAR2(20), deptno NUMBER REFERENCES dept (deptno) ); INSERT INTO dept (deptno, dname, loc) VALUES (1, 'Sales', 'Boston'); INSERT INTO dept (deptno, dname, loc) VALUES (2, 'Manufacturing', 'Chicago'); INSERT INTO dept (deptno, dname, loc) VALUES (3, 'Marketing', 'Boston'); INSERT INTO emp (empno, ename, job, deptno) VALUES (1, 'Alvarez', 'SalesRep', 1); INSERT INTO emp (empno, ename, job, deptno) VALUES (2, 'Baxter', 'Supervisor', 2); INSERT INTO emp (empno, ename, job, deptno) VALUES (3, 'Chen', 'Writer', 3); INSERT INTO emp (empno, ename, job, deptno) VALUES (4, 'Davis', 'Technician', 2);
結果
- 発行したSPARQL
SELECT ?ename
WHERE {
?empno <ename> ?ename .
?empno <deptno> ?deptno .
?deptno <loc> 'Boston'
};
- 想定していたSQL
SELECT ename
FROM emp, dept
WHERE
e.deptno = d.deptno
AND d.loc = 'Boston';
- D2RQサーバーにより実行されたSQL
- 特徴1: 結合条件は "T1_USER01_EMP"."DEPTNO" = "T3_USER01_DEPT"."DEPTNO" としてよいはずだが、T2_USER01_EMP と T2_USER01_DEPT という結合用の表が用いられている。
- 特徴2: リテラルが目的語となる場合には、これが IS NOT NULL であることが条件に明示される。
- 性能懸念: 「結合用の表」を冗長に結合しているが索引が適切に使用されていればレスポンス時間の増加は数倍以内で問題なし。NOT NULL の評価も索引対象列であり問題なし。
SELECT DISTINCT
"T1_USER01_EMP"."EMPNO"
, "T2_USER01_DEPT"."DEPTNO"
, "T1_USER01_EMP"."ENAME"
FROM
"USER01"."EMP" "T2_USER01_EMP"
, "USER01"."EMP" "T1_USER01_EMP"
, "USER01"."DEPT" "T2_USER01_DEPT"
, "USER01"."DEPT" "T3_USER01_DEPT"
WHERE (
"T1_USER01_EMP"."EMPNO" = "T2_USER01_EMP"."EMPNO"
AND "T1_USER01_EMP"."ENAME" IS NOT NULL
AND "T2_USER01_DEPT"."DEPTNO" = "T2_USER01_EMP"."DEPTNO"
AND "T2_USER01_DEPT"."DEPTNO" = "T3_USER01_DEPT"."DEPTNO"
AND "T3_USER01_DEPT"."LOC" = 'Boston'
AND "T3_USER01_DEPT"."LOC" IS NOT NULL
);
その他
D2RQ vs Oracle RDFView
RDFView
Oracle 12c にはD2RQ同様の変換をデータベース内のビューとして定義する RDFView 機能がある
- RDFView (Oracle's Doc) - http://docs.oracle.com/cd/E49329_01/appdev.121/b72469/sem_relational_views.htm
Direct Mapping と R2RML
W3C勧告のマッピング記述方法には次の2つがある
- Direct Mapping - http://www.w3.org/TR/rdb-direct-mapping/
- D2RQ では試験的機能として --w3c オプションで出力可能、Oracle RDFView でサポート
- R2RML (W3C) - http://www.w3.org/TR/r2rml/
- Oracle RDFView でサポート
Cosmic データ
- Oracle のダンプが入手可能な公共データとして Cosmic を使用する
参考
- The D2RQ Mapping Language
- generate-mapping: Auto-generating D2RQ mapping files
- D2R Server: Accessing databases with SPARQL and as Linked Data
- Getting Started with D2RQ
- d2r-query: Running SPARQL queries against a database
- Oracle RDFView 日本語 ドキュメント
- Berlin SPARQL Benchmark V1.0 Results
- Exploiting U.K. Government Linked Data
back to BH13.13

