注意:
この機能は、以前はSesame Adapter for Oracle DatabaseまたはSesame Adapterと呼ばれていました。
RDF Semantic Graph support for OpenRDF Sesame (以降、support for Sesameとも記載)は、一般的なSesame Java APIをOracle Spatial and Graph RDF Semantic Graphサポートに統合します。Sesameは「RDFデータの処理とハンドリングのための強力なJavaフレームワークで、これには、これらのデータの作成、解析、保存、推論、問合せが含まれます。」(http://rdf4j.orgを参照)。
「RDFセマンティク・グラフの概要」と「OWLの概要」で説明されている主要な概念について十分に理解していることが前提です。また、Sasame Javeフレームワークの全般的な機能と使用法を十分に理解していることも前提となります。詳細は、http://rdf4j.orgの文書リンクをクリックしてください。
RDF Semantic Graph support for OpenRDF Sesameは、Oracle Database RDF/OWLのセマンティク・データ管理機能を拡張します。
この章には次の主要なトピックがあります。
RDF Semantic Graph support for Apache Jena (「RDF Semantic Graph Support for Apache Jena」を参照)と同じように、support for Sesameは、オープン・ソース・フレームワークと関連ツールを通じてOracleセマンティク・データに対するJavaベースのインタフェースを提供します。ただし、RDF Semantic Graph support for OpenRDF Sesameでは、データにコンテキストのサポートが追加されています。
Jena文では、トリプル(主語、述語、目的語)を処理します。
Sesame文では、トリプルとコンテキストを処理します(Sesame文は、トリプルとコンテキストで構成されるクワッドです)。たとえば、病院の患者データの場合、コンテキストには患者のURIが含まれます。
RDF Semantic Graph support for OpenRDF Sesameには、Oracle Databaseに格納されたセマンティク・データと対話するためのJava APIが用意されています。また、次のとおりSesameツールを包括的に提供します。
Sesame Server (HTTP SPARQLエンドポイントを提供します)。
Sesame Console (リポジトリの作成と管理を行うためのコマンドライン・ツールです)。使用可能なコマンドには次のものがあります。
connect Connects to a (local or remote) set of repositories disconnect Disconnects from the current set of repositories create Creates a new repository drop Drops a repository open Opens a repository to work on, takes a repository ID as argument close Closes the current repository show Displays an overview of various resources load Loads a data file into a repository, takes a file path or URL as argument verify Verifies the syntax of an RDF data file, takes a file path or URL as argument clear Removes data from a repository serql Evaluates the SeRQL query, takes a query as argument sparql Evaluates the SPARQL query, takes a query as argument set Allows various console parameters to be set exit, quit Exits the console
OpenRDF Workbench (Sesame Serverへのグラフィカル・ユーザー・インタフェースです)。
support for Sesameによって提供される機能を次に示します。
(コンテキスト付きおよびコンテキストなしの)文のロード(バルクおよび増分)、エクスポートおよび削除
(コンテキスト付きおよびコンテキストなしの)データの問合せ
推論。推論データは(includeInferred=true場合)問合せ実行中に考慮され、推論トリプルのコンテキストはNULLです。
名前空間の管理
RDF Semantic Graph support for OpenRDF Sesameは、Sesame Storage and Inference Layer (SAIL) APIの様々なインタフェースを実装しています。たとえばクラスOracleSailConnectionは、Sesame SailConnectionインタフェースのOracle実装で、クラスOracleSailStoreはSesame SailインタフェースのOracle実装です。
support for Sesameの一般的な使用フローを、例8-1に抜粋して示します。
例8-1 RDF Semantic Graph support for OpenRDF Sesameの使用フロー例
String query = " PREFIX foaf: <http://xmlns.com/foaf/0.1/> " " PREFIX dc: <http://purl.org/dc/elements/1.1/> " " select ?s ?p ?o ?name WHERE {?s ?p ?o . OPTIONAL {?o foaf:name ?name .} } "; SailRepository sr = new SailRepository( new OracleSailStore(oracle, modelName,…attachmentForInference)); RepositoryConnection repConn = sr.getConnection(); // Data loading can happen here. repConn.add(alice, friendOf, bob, context1); TupleQuery tq = repConn.prepareTupleQuery(QueryLanguage.SPARQL, query); TupleQueryResult tqr = tq.evaluate(); while(tqr.hasNext()) { psOut.print((tqr.next().toString())); }; tqr.close() repConn.close(); sr.shutDown();
support for Sesameを設定および構成するには、次の手順を実行します。
support for Sesameを使用するには、システム環境に必要なソフトウェア(Oracle Database 11gリリース2以上に加えて、Spatial、GraphおよびPartitioningのオプション、RDFセマンティク・グラフのサポート、Sesameバージョン2.3.1、RDF Semantic Graph support for OpenRDF SesameおよびJDK 6以上)があることを、最初に確認しておく必要があります。次の手順を実行することによって、ソフトウェア環境を設定できます。
ソフトウェア環境を設定した後、「 RDFセマンティク・グラフ環境の設定」の説明にあるとおり、RDFセマンティク・グラフ環境でsupport for Sesameを使用して問合せを実行できることを確認します。
support for Sesameを使用してSPARQLエンドポイントを設定するには、クライアント・アプリケーションがHTTPプロトコル経由で通信できるSesame Serverのダウンロードが必要です。Sesame Server (およびOpenRDF Workbench)は、Sesame 2.3.1リリース・パッケージにバンドルされています。この項では、WebLogic Serverにデプロイされるサーブレットを使用して、SPARQLサービスを設定する方法について説明します。Oracleでは、従属するすべてのサード・パーティのライブラリを.warまたは.earファイルにバンドルすることが許可されているわけではないために、手順が多く、複雑になっています。
Oracle WebLogic Server 11g リリース1 (10.3.1)をダウンロードしてインストールします。
Sesameで必要なため、Java 6がインストールされていることを確認します。
http://sourceforge.net/projects/sesame/files/Sesame%202/からSesame 2.3.1リリース・パッケージ(.zip形式)をダウンロードします。
一時ディレクトリに.zipファイルを解凍します。次に例を示します。
mkdir /tmp/sesame cp openrdf-sesame-2.3.1-sdk.zip /tmp/sesame/ cd /tmp/sesame unzip openrdf-sesame-2.3.1-sdk.zip
「ソフトウェア環境の設定」の説明にあるとおり、RDF Semantic Graph support for OpenRDF Sesameがダウンロードされ解凍されていることを確認します。
Sesame_adapterディレクトリと同じレベルにopenrdf-sesame.warという名前のディレクトリを作成し、次に進みます。次に例を示します。
/tmp/openrdf-sesame.war cd /tmp/openrdf-sesame.war
前述の手順で作成したディレクトリに必要なファイルを解凍します。
cd /tmp/openrdf-sesame.war unzip /tmp/sesame/openrdf-sesame-2.3.1/war/openrdf-sesame.war
次のように、必要なファイルをコピーします。(ORACLE_HOMEは、Oracle Databaseのホーム・ディレクトリを指しているとします。)
cp /tmp/Sesame_adapter/web/web.xml /tmp/openrdf-sesame.war/WEB-INF/web.xml cp /tmp/Sesame_adapter/lib/*.jar /tmp/openrdf-sesame.war/WEB-INF/lib cp $ORACLE_HOME/md/jlib/sdordf.jar /tmp/openrdf-sesame.war/WEB-INF/lib cp $ORACLE_HOME/jdbc/lib/ojdbc6.jar /tmp/openrdf-sesame.war/WEB-INF/lib
WebLogic Server管理コンソールを使用し、OracleSemDSという名前のJ2EEデータ・ソースを作成します。データ・ソースの作成中に、SPARQL問合せの実行対象になる関連セマンティク・データを含むデータベース・スキーマのユーザーとパスワードを指定できます。
このデータ・ソースの作成に関する情報は、「WebLogic Serverを使用した必要なデータ・ソースの作成」を参照してください。
次のとおり、WebLogic Serverのautodeployディレクトリに移動し、ファイルをコピーします。(開発ドメインでのアプリケーションに対する自動デプロイの詳細は、http://docs.oracle.com/cd/E11035_01/wls100/deployment/autodeploy.htmlを参照してください。)
cd <domain_name>/autodeploy cp -rf /tmp/openrdf-sesame.war <domain_name>/autodeploy
前述の例で、<domain_name>はWebLogic Serverドメインの名前です。
WebLogic Serverドメインを2つの異なるモード(開発とプロダクション)で実行することはできますが、自動デプロイメント機能を使用できるのは開発モードのみであることに注意してください。
次の例のとおり、ファイルとディレクトリの構造を確認します。
autodeploy/% ls -1R ./openrdf-sesame.war/ openrdf-sesame.war/: favicon.ico favicon.png images META-INF styles WEB-INF openrdf-sesame.war/images: DEBUG.png ERROR.png INFO.png logo.png productgroup.png transparent.png WARN.png openrdf-sesame.war/META-INF: MANIFEST.MF maven openrdf-sesame.war/META-INF/maven: info.aduna.appbase org.openrdf.sesame openrdf-sesame.war/META-INF/maven/info.aduna.appbase: aduna-appbase-webapp-system openrdf-sesame.war/META-INF/maven/info.aduna.appbase/aduna-appbase-webapp-system: pom.properties pom.xml openrdf-sesame.war/META-INF/maven/org.openrdf.sesame: sesame-http-server openrdf-sesame.war/META-INF/maven/org.openrdf.sesame/sesame-http-server: pom.properties pom.xml openrdf-sesame.war/styles: basic default msie-png-alpha.css msie-png-alpha.png w3-html40-recommended.css openrdf-sesame.war/styles/basic: all.css openrdf-sesame.war/styles/default: images msie-minheight.css print.css screen.css openrdf-sesame.war/styles/default/images: bg_body.png bg_header.png bg_html.png hr_menu.png openrdf-sesame.war/WEB-INF: aduna-webapp-servlet.xml aduna-webapp-system-servlet.xml classes includes lib openrdf-http-server-servlet.xml sample-web.xml taglibs tags urlrewrite.xml views web.xml openrdf-sesame.war/WEB-INF/classes: logback.xml openrdf-sesame.war/WEB-INF/includes: components stylesheets.html.jspf taglibs.jspf openrdf-sesame.war/WEB-INF/includes/components: bodyStart.html.jspf bodyStop.html.jspf ContentHeader.html.jspf Footer.html.jspf Header.html.jspf head.html.jspf htmlStart.html.jspf htmlStop.html.jspf logfilterform.html.jspf logpaginationfooter.html.jspf logpaginationheader.html.jspf Message.html.jspf Navigation.html.jspf page.html.jspf tabs.html.jspf openrdf-sesame.war/WEB-INF/lib: activation-1.1.jar aduna-appbase-core-3.9.0.jar aduna-appbase-logging-api-3.9.0.jar aduna-appbase-logging-file-3.9.0.jar aduna-appbase-webapp-base-core-3.9.0.jar aduna-appbase-webapp-system-core-3.9.0.jar aduna-commons-collections-2.7.0.jar aduna-commons-concurrent-2.6.0.jar aduna-commons-i18n-1.3.0.jar aduna-commons-io-2.8.0.jar aduna-commons-iteration-2.7.0.jar aduna-commons-lang-2.8.0.jar aduna-commons-net-2.6.0.jar aduna-commons-platform-info-2.8.0.jar aduna-commons-text-2.6.0.jar aduna-commons-webapp-core-2.8.0.jar aduna-commons-xml-2.6.0.jar aopalliance-1.0.jar asm-1.5.3.jar cglib-2.1_3.jar commons-codec-1.3.jar commons-dbcp-1.2.2.jar commons-httpclient-3.1.jar commons-pool-1.3.jar jcl-over-slf4j-1.5.10.jar jstl-1.1.2.jar logback-classic-0.9.18.jar logback-core-0.9.18.jar ojdbc6.jar sdordf.jar sdordfsesame.jar sesame-http-client-2.3.1.jar sesame-http-protocol-2.3.1.jar sesame-http-server-2.3.1.jar sesame-http-server-spring-2.3.1.jar sesame-model-2.3.1.jar sesame-query-2.3.1.jar sesame-queryalgebra-evaluation-2.3.1.jar sesame-queryalgebra-model-2.3.1.jar sesame-queryparser-api-2.3.1.jar sesame-queryparser-serql-2.3.1.jar sesame-queryparser-sparql-2.3.1.jar sesame-queryresultio-api-2.3.1.jar sesame-queryresultio-binary-2.3.1.jar sesame-queryresultio-sparqljson-2.3.1.jar sesame-queryresultio-sparqlxml-2.3.1.jar sesame-queryresultio-text-2.3.1.jar sesame-repository-api-2.3.1.jar sesame-repository-contextaware-2.3.1.jar sesame-repository-dataset-2.3.1.jar sesame-repository-event-2.3.1.jar sesame-repository-http-2.3.1.jar sesame-repository-manager-2.3.1.jar sesame-repository-sail-2.3.1.jar sesame-rio-api-2.3.1.jar sesame-rio-n3-2.3.1.jar sesame-rio-ntriples-2.3.1.jar sesame-rio-rdfxml-2.3.1.jar sesame-rio-trig-2.3.1.jar sesame-rio-trix-2.3.1.jar sesame-rio-turtle-2.3.1.jar sesame-runtime-2.3.1.jar sesame-sail-api-2.3.1.jar sesame-sail-inferencer-2.3.1.jar sesame-sail-memory-2.3.1.jar sesame-sail-nativerdf-2.3.1.jar sesame-sail-rdbms-2.3.1.jar slf4j-api-1.5.10.jar spring-aop-2.5.6.jar spring-beans-2.5.6.jar spring-context-2.5.6.jar spring-context-support-2.5.6.jar spring-core-2.5.6.jar spring-web-2.5.6.jar spring-webmvc-2.5.6.jar standard-1.1.2.jar urlrewritefilter-3.0.4.jar openrdf-sesame.war/WEB-INF/taglibs: navigation.tld openrdf-sesame.war/WEB-INF/tags: errors.tag openrdf-sesame.war/WEB-INF/views: home overview.jsp system openrdf-sesame.war/WEB-INF/views/home: overview.jsp openrdf-sesame.war/WEB-INF/views/system: info logging overview.jsp openrdf-sesame.war/WEB-INF/views/system/info: debug.jsp overview.jsp openrdf-sesame.war/WEB-INF/views/system/logging: overview.jsp
WebLogic Serverを起動または再起動します。
Webブラウザを使用し、http://<hostname>:7001/openrdf-sesame/querymgt?abortqid=0に示す書式でURLに接続し(Webアプリケーションはポート7001でデプロイされているとします)、デプロイメントを確認します
XMLレスポンスに、support for Sesame問合せ管理サーブレットによるSesame Serverのデプロイメントが成功したことが示されます。
また、OpenRDF Workbenchをインストールすることもできます(これは、Sesame Serverと通信するためのグラフィカル・ユーザー・インタフェース(GUI)です)。OpenRDF WorkbenchをOracle WebLogic Serverにデプロイするには、SPARQLエンドポイントを設定するための前述の手順(この項の冒頭で説明済)のうち少なくとも最初の7つの手順をあらかじめ実行しておく必要があります(その後で、次の手順を行います)。
次のとおり、WebLogic Serverのautodeployディレクトリに移動し、ファイルをコピーします。(開発ドメインでのアプリケーションに対する自動デプロイの詳細は、http://docs.oracle.com/cd/E11035_01/wls100/deployment/autodeploy.htmlを参照してください。)
cd <domain_name>/autodeploy cp -rf /tmp/openrdf-workbench.war <domain_name>/autodeploy
前述の例で、<domain_name>はWebLogic Serverドメインの名前です。
次の例のとおり、ファイルとディレクトリの構造を確認します。
autodeploy/% ls -1R ./openrdf-workbench.war/ openrdf-workbench.war/: favicon.ico favicon.png images locale META-INF scripts styles transformations WEB-INF openrdf-workbench.war/images: affirmative.png edit.png logo.png negative.png productgroup.png server_network.png server.png view.png openrdf-workbench.war/locale: messages.xsl openrdf-workbench.war/META-INF: MANIFEST.MF maven openrdf-workbench.war/META-INF/maven: org.openrdf.sesame openrdf-workbench.war/META-INF/maven/org.openrdf.sesame: sesame-http-workbench openrdf-workbench.war/META-INF/maven/org.openrdf.sesame/sesame-http-workbench: pom.properties pom.xml openrdf-workbench.war/scripts: cookies.html openrdf-workbench.war/styles: basic default msie-png-alpha.css msie-png-alpha.png w3-html40-recommended.css openrdf-workbench.war/styles/basic: all.css openrdf-workbench.war/styles/default: images msie-minheight.css print.css screen.css openrdf-workbench.war/styles/default/images: bg_body.png bg_header.png bg_html.png hr_menu.png openrdf-workbench.war/transformations: add.xsl boolean.xsl clear.xsl contexts.xsl create-memory-rdfs-dt.xsl create-memory-rdfs.xsl create-memory.xsl create-mysql.xsl create-native-rdfs-dt.xsl create-native-rdfs.xsl create-native.xsl create-pgsql.xsl create-remote.xsl create.xsl delete.xsl explore.xsl export.xsl graph.xsl information.xsl list.xsl namespaces.xsl query.xsl remove.xsl repositories.xsl server.xsl summary.xsl table.xsl template.xsl tuple.xsl types.xsl url-encode.xsl openrdf-workbench.war/WEB-INF: classes lib web.xml openrdf-workbench.war/WEB-INF/classes: org openrdf-workbench.war/WEB-INF/classes/org: openrdf openrdf-workbench.war/WEB-INF/classes/org/openrdf: workbench openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench: base commands exceptions proxy RepositoryServlet.class util openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/base: BaseRepositoryServlet.class BaseServlet.class TransformationServlet.class TupleServlet.class openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/commands: AddServlet.class ClearServlet.class ContextsServlet.class CreateServlet.class DeleteServlet.class ExploreServlet.class ExportServlet.class InformationServlet.class InfoServlet.class NamespacesServlet.class QueryServlet.class RemoveServlet.class RepositoriesServlet.class SummaryServlet.class TypesServlet.class openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/exceptions: BadRequestException.class MissingInitParameterException.class openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/proxy: CookieCacheControlFilter$CacheAwareRequest.class CookieCacheControlFilter$CacheAwareResponse.class CookieCacheControlFilter.class ProxyRepositoryServlet.class RedirectFilter.class WorkbenchGateway.class WorkbenchServlet.class openrdf-workbench.war/WEB-INF/classes/org/openrdf/workbench/util: BasicServletConfig.class ConfigTemplate.class DynamicHttpRequest.class TupleResultBuilder.class WorkbenchRequest.class openrdf-workbench.war/WEB-INF/lib: aduna-appbase-core-3.9.0.jar aduna-appbase-logging-api-3.9.0.jar aduna-appbase-logging-file-3.9.0.jar aduna-commons-collections-2.7.0.jar aduna-commons-concurrent-2.6.0.jar aduna-commons-i18n-1.3.0.jar aduna-commons-io-2.8.0.jar aduna-commons-iteration-2.7.0.jar aduna-commons-lang-2.8.0.jar aduna-commons-net-2.6.0.jar aduna-commons-platform-info-2.8.0.jar aduna-commons-text-2.6.0.jar aduna-commons-xml-2.6.0.jar commons-cli-1.1.jar commons-codec-1.3.jar commons-dbcp-1.2.2.jar commons-fileupload-1.2.1.jar commons-httpclient-3.1.jar commons-io-1.3.2.jar commons-pool-1.3.jar jcl-over-slf4j-1.5.10.jar sesame-console-2.3.1.jar sesame-http-client-2.3.1.jar sesame-http-protocol-2.3.1.jar sesame-model-2.3.1.jar sesame-query-2.3.1.jar sesame-queryalgebra-evaluation-2.3.1.jar sesame-queryalgebra-model-2.3.1.jar sesame-queryparser-api-2.3.1.jar sesame-queryparser-serql-2.3.1.jar sesame-queryparser-sparql-2.3.1.jar sesame-queryresultio-api-2.3.1.jar sesame-queryresultio-binary-2.3.1.jar sesame-queryresultio-sparqljson-2.3.1.jar sesame-queryresultio-sparqlxml-2.3.1.jar sesame-queryresultio-text-2.3.1.jar sesame-repository-api-2.3.1.jar sesame-repository-contextaware-2.3.1.jar sesame-repository-dataset-2.3.1.jar sesame-repository-event-2.3.1.jar sesame-repository-http-2.3.1.jar sesame-repository-manager-2.3.1.jar sesame-repository-sail-2.3.1.jar sesame-rio-api-2.3.1.jar sesame-rio-n3-2.3.1.jar sesame-rio-ntriples-2.3.1.jar sesame-rio-rdfxml-2.3.1.jar sesame-rio-trig-2.3.1.jar sesame-rio-trix-2.3.1.jar sesame-rio-turtle-2.3.1.jar sesame-runtime-2.3.1.jar sesame-sail-api-2.3.1.jar sesame-sail-inferencer-2.3.1.jar sesame-sail-memory-2.3.1.jar sesame-sail-nativerdf-2.3.1.jar sesame-sail-rdbms-2.3.1.jar slf4j-api-1.5.10.jar slf4j-jdk14-1.5.10.jar
WebLogic Serverを起動または再起動します。
Webブラウザを使用して、書式http://<hostname>:7001/openrdf-workbenchのURLに接続し(Webアプリケーションはポート7001でデプロイされているとします)、デプロイメントを確認します
OpenRDF WorkbenchロゴのあるWebページが表示されます。左側にある「Repositories」リンクをクリックすると、リポジトリのリストが表示されます。
WebLogic Server管理コンソールを使用して必要なJ2EEデータ・ソースを作成するには、次の手順に従います。
OracleSailStore APIおよびその他の関連APIを使用してセマンティク・モデルを作成し、データを(増分またはバルク)ロードして論理推論を実行することができます。
セマンティク・モデルがOracle Databaseに格納された後、Sesame Console (「RDF Semantic Graph support for OpenRDF SesameによるSesame Consoleの使用」参照)を使用してSesame Serverに接続し、Oracleのセマンティク・モデル・ベースのリポジトリを作成することができます。たとえば、リポジトリIDmyOracleReposのリポジトリを作成し、これにはLUBMという名前のセマンティク・モデルとOWLPRIMEルールベースを使用するとします。
この新しく作成されたリポジトリは、Sesame Server上の新しいサービス・エンドポイントを提供します。
一部のアプリケーションでは長時間にわたるSPARQL問合せを終了できるようにする必要があるため、RDF Semantic Graph support for OpenRDF SesameとSesame Serverの設定で強制終了のフレームワークが導入されています。基本的に、実行に時間がかかりそうな問合せに対しては、各々に一意の問合せID (qid)値を指定する必要があります。
たとえば、次のSPARQL問合せでは、すべてのトリプルの主語を選択します。リクエストに応じてこの問合せを終了できるように、問合せID (qid)が設定されます。
PREFIX ORACLE_SEM_FS_NS: <http://example.com/semtech#qid=8761>
SELECT ?subject WHERE {?subject ?property ?object }
qid属性値は、長整数型です。qidの値は、独自のアプリケーション・ニーズに基づき、特定の問合せに合わせて選択することができます。
qid値とともに送信されたSPARQL問合せを終了するには、アプリケーションから次の形式で強制終了リクエストをサーブレットに送信し、一致するQID値を指定します。
http://<hostname>:7001/openrdf-sesame/querymgt?abortqid=8761
Oracle Databaseに格納されているセマンティク・データを問い合せる方法は2つあります。SEM_MATCHベースのSQL文とRDF Semantic Graph support for OpenRDF Sesameを介したSPARQL問合せです。それぞれの方法での問合せは、表面的には類似していますが、動作には重要な違いがあります。アプリケーションの動作を一貫性のあるものにするには、SEM_MATCH問合せとSPARQL問合せの違いを理解し、その問合せ結果を処理する際に注意が必要です。
2つの方法を次の簡単な例で示します。
問合せ1 (SEM_MATCHベース)
select s, p, o
from table(sem_match('{?s ?p ?o}', sem_models('Test_Model'), ....))
問合せ2 (RDF Semantic Graph support for OpenRDF Sesameを介したSPARQL問合せ)
select ?s ?p ?o
where {?s ?p ?o}
これらの2つの問合せは、同じ種類の機能を実行しますが、いくつか重要な違いがあります。問合せ1 (SEM_MATCHベース)は次のようになります。
Test_Modelからすべてのトリプルを読み取ります。
URI、bNode、プレーン・リテラルおよび型付きリテラルを区別せず、長いリテラルを処理しません。
特定の文字('\n'など)はエスケープ解除しません。
問合せ2 (RDF Semantic Graph support for OpenRDF Sesameを介して実行されるSPARQL問合せ)もTest_Modelからすべてのトリプルを読み取ります(同じ基礎となるTest_Modelを参照しているModelOracleSemに対してコールを実行したと想定します)。ただし、問合せ2は次のようになります。
(SEM_MATCH表関数による、s、pおよびo列のみではなく)追加の列を読み取り、URI、bNodes、プレーン・リテラル、型付きリテラルおよび長いリテラルを区別します。これによって、Sesame Nodeオブジェクトを適切に作成できるようになります。
Oracle Databaseに格納される際にエスケープされる文字をエスケープ解除します。
2つの方法でのもう1つの違いは、空白ノード処理です。
SEM_MATCHベースの問合せにおいて、空白ノードは常に定数とみなされます。
SPARQL問合せにおいて、<と>で囲まれていない空白ノードは、問合せがsupport for Sesameを介して実行されるときに変数とみなされます。これは、SPARQL標準セマンティクと一致します。ただし、<と>で囲まれた空白ノードは、問合せが実行されるときに定数とみなされ、空白ノード・ラベルには、基礎となるデータのモデル化で必要とされる適切な接頭辞が、support for Sesameによって追加されます。
RDF Semantic Graph support for OpenRDF Sesame APIを使用して作成されるセマンティク・モデルの名前の最大長は、22文字です。
この項では、SPARQL問合せ処理を強化できる、RDF Semantic Graph support for OpenRDF Sesameのいくつかのパフォーマンス関連機能について説明します。これらの機能は、デフォルトでは自動的に実行されます。
DISTINCT、OPTIONAL、GRAPH、FILTER、UNION、ORDER BYおよびLIMITを含むSPARQL問合せは、SEM_MATCHテーブル・ファンクションに基づく単一のSQL問合せに変換されます。SPARQLのASK、DESCRIBEおよびCONSTRUCT問合せの場合、support for Sesameでは、追加の問合せ変換ロジックと中間層処理が使用されます。
SEM_MATCHに基づくSQL問合せの実行が失敗した場合、support for SesameではSesameの評価戦略を使用してその問合せを実行します。
RDF Semantic Graph support for OpenRDF Sesameを使用した問合せのパフォーマンスを改善するための推奨事項は次のとおりです。
アプリケーション表での追加の結合の数を減らすため、SPARQL問合せのGRAPH句には、関連するトリプル・パターンのみを記述します。(説明は、「文の格納とRDF Semantic Graph Support for OpenRDF Sesameの問合せ文への影響」を参照)
名前付きグラフ問合せのGRAPH句内のトリプル・パターンに、NULLバインディングによる変数は使用しません。NULLバインディングは関連するアプリケーション表との結合でいずれの行も一致しないため、このバインディングは削除されます。
前述の理由により、GRAPH句内にOPTIONAL句、またはOPTIONAL句内にGRAPH句は記述しません。
アプリケーション表のCONTEXT列(「文の格納とRDF Semantic Graph Support for OpenRDF Sesame問合せへの影響」を参照)には、空白ノードを使用しません(これは、2つの異なるセマンティク・モデルの名前付きグラフの空白ノードが同じラベルを持つ場合、それらが同じリソースとみなされてしまうためです)。これは、トリプル内の空白ノードには該当しません(異なるモデルのものは別々に格納されます)。
MDSYS.SEMM_model-nameビュー(「モデルのメタデータ」の表1-2を参照)には、グラフ名または各モデルのコンテキストの列がないため、これらの2つの情報は、そのOracleセマンティク・モデル内に格納されません。この情報は、ユーザーのアプリケーション表のCONTEXT列に保持されます。
セマンティク・ネットワーク内に存在しないモデル名を使用したOracleSailStoreオブジェクトが初めて作成されると、自動的に新しいアプリケーション表が作成されて、次の列が格納されます。
TRIPLE(タイプSDO_RDF_TRIPLE_S)
CONTEXT(タイプVARCHAR2)
その後、指定されたモデル名を持つセマンティク・モデルが作成されます。名前付きグラフ問合せと文指向操作のパフォーマンスを強化するため、デフォルトの索引がアプリケーション表に作成され、この索引が、TRIPLE列のトリプルの主語、述語および目的語のフィールドの3つの数値ID属性と同様にCONTEXT列(先行列)も処理します。
SPARQL問合せがセマンティク・モデルに対して実行されたとき、問合せが名前付きグラフを使用しない(GRAPH句を含まない)場合、生成されたSQL文はそのモデルのアプリケーション表を使用しません。ただし、その問合せにGRAPH句がある場合、生成されたSQL文は、SEM_MATCHベースの副問合せとそのモデルのアプリケーション表を結合し、関連するコンテキストまたは名前付きグラフまで結果を調べます。アプリケーション表との結合の数は、GRAPH句にあるトリプル・パターンの数によって異なるため、アプリケーション表との追加の結合の数を減らすには、関連するトリプル・パターンのみをGRAPH句に記述することをお薦めします。
RDF Semantic Graph support for OpenRDF Sesameでは、ヒントと追加の問合せオプションを渡すことができます。問合せオプションを含むOracle固有の名前空間を使用してSPARQL名前空間接頭辞の構文をオーバーロードすることで、これらの機能を実装できます。PREFIX ORACLE_SEM_xx_NS形式の名前空間では、xxの部分に機能の種別(ヒントならHT、APなら追加の述語など)が表されています。
SQLヒントは、次の形式の行を含むSEM_MATCH問合せに渡すことができます。
PREFIX ORACLE_SEM_HT_NS: <http://oracle.com/semtech#hint>
ここでのhintは、SEM_MATCHによってサポートされる任意のヒントです。次に例を示します。
PREFIX ORACLE_SEM_HT_NS: <http://oracle.com/semtech#leading(t0,t1)>
SELECT ?book ?title ?isbn
WHERE { ?book <http://title> ?title. ?book <http://ISBN> ?isbn }
この例で、t0,t1は、問合せの1番目と2番目のパターンを指します。
SEM_MATCHと比較すると、ヒントの指定に若干違いがあることに注意してください。名前空間の値の構文の制限により、カンマ(,)は空白ではなく、t0とt1(または他のヒント・コンポーネント)を区切るために使用されます。
SQLヒントの使用に関する詳細は、「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を、特にoptions属性でのHINT0キーワードに関する資料を参照してください。
SEM_MATCH filter属性に、WHEREキーワードのないWHERE句の形式の文字列として、追加の選択基準を指定することができます。次の形式の1行を含めることで、追加のWHERE句述語をSEM_MATCH問合せに渡すことができます。
PREFIX ORACLE_SEM_AP_NS: <http://oracle.com/semtech#pred>
predは、問合せに追加されるWHERE句の内容を反映します。次に例を示します。
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ORACLE_SEM_AP_NS:<http://www.oracle.com/semtech#label$RDFLANG='fr'>
SELECT DISTINCT ?inst ?label
WHERE { ?inst a <http://someCLass>. ?inst rdfs:label ?label . }
ORDER BY (?label) LIMIT 20
この例では、ラベル変数の言語形式が'fr'である必要がある問合せに、制限事項が追加されます。
追加の問合せオプションは、次の形式の行を含むSEM_MATCH問合せに渡すことができます。
PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#option>
optionは、問合せに追加される問合せオプション(またはカンマで区切られた複数の問合せオプション)を反映します。次に例を示します。
PREFIX ORACLE_SEM_FS_NS:
<http://oracle.com/semtech#timeout=3,dop=4,INF_ONLY,ORDERED,ALLOW_DUP=T>
SELECT * WHERE {?subject ?property ?object }
次の問合せオプションがサポートされています。
ALLOW_DUP=tは、結果が重複する場合がありますが、複数のセマンティク・モデルを問い合せるための、より高速な方法です。
DOP=nは、問合せに対する並列度(n)指定します。マルチコアまたはマルチCPUのプロセッサで、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。
INF_ONLYを指定すると、推論されたモデルのみが問い合せられます。(このオプションでは、問合せに対してincludeInferred=trueオプションも指定する必要があります。)
ORDEREDは、最後に必要なRDF_VALUE$結合を実行している間、問合せトリプル・パターン結合のために主要なSQLヒントに変換されます。
QID=nは、問合せID番号を指定します。この機能は、問合せに応答がない場合、その問合せを取り消すために使用できます。
REWRITE=Fは、SEM_MATCH表関数に対してODCI_Table_Rewriteを無効にします。
SKIP_CLOB=Tは、問合せに対してCLOB値が戻されないようにします。
TIMEOUT=n(問合せタイムアウト)は、問合せが、終了されるまで実行する秒数(n)を指定します。
USE_BIND_VAR (n) は、トリプル・パターンでn番目の定数の問合せ解析時に使用されるバインド変数を指定します。(この機能をOPTIONAL句の定数に適用しないでください。)
この項では、RDF Semantic Graph support for OpenRDF Sesameによって使用可能になるRDFセマンティク・グラフ機能の一部について説明します。使用可能な機能をサポートするAPIコールの包括的なドキュメントについては、RDF Semantic Graph support for OpenRDF Sesameのリファレンス情報(Javadoc)を参照してください。support for Sesameによって使用可能なサーバー側機能の詳細は、このマニュアルの関連する章を参照してください。
仮想モデル(「仮想モデル」を参照)は、OracleSailStoreコンストラクタで指定され、透過的に処理されます。仮想モデルがモデルとルールベースの組合せのために存在している場合には、問合せの応答に使用されます。そのような仮想モデルが存在しない場合には、データベースに作成されます。
注意:
RDF Semantic Graph support for OpenRDF Sesameを介した仮想モデルのサポートは、Oracle Databaseリリース11.2以上でのみ使用可能です。
次の例では、既存の仮想モデルを再利用します。
public void vm(String jdbcUrl,
String user,
String password,
String model,
PrintStream psOut)
{
String m1 = "TEST_1";
String m2 = "TEST_2";
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
// create the attachment semantic model in case it doesn't exist
// (constructor handles it)
OracleSailStore store = new OracleSailStore(op, m1);
store.shutDown();
store= new OracleSailStore(op, m2);
store.shutDown();
String vmName = "VM_" + m1;
// create a virtual model with name vmName that will be used in the
// OracleSailStore
Oracle oracle = op.getOracle();
oracle.executeCall(
"begin sem_apis.create_virtual_model(?,sem_models(?,?), null); end;",
vmName, m1, m2);
op.returnOracle(oracle);
String[] modelNames = {m2};
String[] rulebaseNames = {};
Attachment attachment = Attachment.createInstance(modelNames,
rulebaseNames);
store = new OracleSailStore(op, m1, attachment, vmName);
OracleSailConnection conn = store.getConnection();
conn.clear();
conn.addStatement(
store.getValueFactory().createURI("http://a1"),
store.getValueFactory().createURI("http://p1"),
store.getValueFactory().createURI("http://b1"));
CloseableIteration res = conn.getStatements(null, null, null, false);
while (res.hasNext()) {
Statement stmt = (Statement) res.next();
System.out.println(stmt);
}
conn.close();
store.shutDown();
}
また、次の例のように、OracleSailStoreコンストラクタを使用して仮想モデルを作成することもできます。
OracleSailStore store = new OracleSailStore(oracle, modelName, attachment, true);
この例で、4つ目のパラメータ(true)は、指定されたmodelNameとattachmentのために仮想モデルを作成する必要があることを示しています。
Oracle Database接続プーリングは、RDF Semantic Graph support for OpenRDF SesameのOraclePoolクラスを介して提供されます。通常、OraclePoolはOraclePool (DataSource ods)を使用してDataSourceで初期化されています。この場合、OraclePoolはデータソースの接続プーリング機能を使用しながらDataSourceの拡張ラッパーとして動作します。OracleSailStoreオブジェクトを作成するときには、storeコンストラクタ内にOraclePoolオブジェクトを作成するだけで十分です。続けて、support for Sesameによりデータベース接続が自動的に制御されるようになります。
明示的にOracle接続オブジェクト(基本的にデータベース接続ラッパーである)を取得する必要がある場合は、OraclePool.getOracleメソッドを起動します。接続を終了した後は、OraclePool.returnOracleメソッドを起動して、接続プールにオブジェクトを戻します。
OraclePoolは、OracleConnectionオブジェクトで初期化することもできます。この場合、このOraclePoolを参照するときに単一のデータベース接続のみが使用されます。複数のSesame SailConnectionオブジェクトが同じデータベース接続を使用することになるため、異なるSailConnectionオブジェクトにわたるダーティな読取りが起こり得ることを認識しておく必要があります。
OraclePoolの使用方法の詳細は、RDF Semantic Graph support for OpenRDF SesameのAPIリファレンス情報(Javadoc)を参照してください。
次の例では、2つの初期接続によるOraclePoolクラスを使用してOracleSailStoreオブジェクトを設定します。
public void op(String jdbcUrl,
String user,
String password,
String model,
PrintStream psOut)
throws Exception
{
// test with connection properties
java.util.Properties prop = new java.util.Properties();
prop.setProperty("MinLimit", "2"); // the cache size is 2 at least
prop.setProperty("MaxLimit", "10");
prop.setProperty("InitialLimit", "2"); // create 2 connections at startup
prop.setProperty("InactivityTimeout", "1800"); // seconds
prop.setProperty("AbandonedConnectionTimeout", "900"); // seconds
prop.setProperty("MaxStatementsLimit", "10");
prop.setProperty("PropertyCheckInterval", "60"); // seconds
System.out.println("Creating Data Source");
OracleDataSource ods =
OraclePool.getOracleDataSource(jdbcUrl, user, password,
prop, "OracleSemConnPool");
System.out.println("Done creating Data Source");
OraclePool op = new OraclePool(ods);
// create an OracleSailStore with the OraclePool
OracleSailStore store = new OracleSailStore(op, model);
store.shutDown();
op.close();
ods.close();
}
support for Sesameを介して、複数のセマンティクPL/SQLサブプログラムを使用することができます。表8-1に、サブプログラムと、対応するJavaクラスおよびメソッドを示します。
表8-1 PL/SQLサブプログラムと対応するsupport for SesameのJavaクラスおよびメソッド
| PL/SQLサブプログラム | 対応するJavaクラスとメソッド |
|---|---|
OracleUtils.dropSemanticModel |
|
OracleUtils.mergeModels |
|
OracleUtils.swapNames |
|
OracleUtils.removeDuplicates |
|
OracleUtils.renameModels |
これらのPL/SQLユーティリティ・サブプログラムの詳細は、「SEM_APISパッケージのサブプログラム」のリファレンス情報を参照してください。対応するJavaクラスとメソッドの詳細は、RDF Semantic Graph support for OpenRDF SesameのAPIリファレンス・ドキュメント(Javadoc)を参照してください。
setInferenceOption(String options)プロシージャとOracleSailConnectionオブジェクトを使用して、伴意コールにオプションを追加することができます。次の例では、伴意を作成するときに増分推論を有効化し、並列度の値を4に指定します。
conn.setInferenceOption("INC=T,DOP=4");
推論の詳細は、「OWL推論の使用方法」を参照してください。
この項では、RDF Semantic Graph support for OpenRDF SesameがSesame SailConnectionおよびSail APIに提供する拡張機能について説明します。
Sesame 2.3.0における文の一意性は、コンテキスト・レベルで実施されます。同じトリプルを単一のコンテキストで2回使用することはできません。support for Sesameでは、そのような一意性がコンテキスト、述語、主語および目的語での一意の索引を介して適用されます。ただし、support for Sesameの文の一意性はデフォルトでは有効になっていません。OracleSailStoreオブジェクトを構築するとき、文の一意性のデフォルト値はDONTCAREで、一意の索引がまだ存在していない場合に作成されない設定になっています。
OracleSailStoreコンストラクタ、enableUniquenessConstraintメソッドおよびdisableUniquenessConstraintメソッドのいずれかを使用した文の一意性に対する要件は、明示的に有効化することも無効化することもできます。
OracleSailStoreオブジェクトに対してDML操作(特に削除)と名前付きグラフ問合せを実行する際は、アプリケーション表の索引がパフォーマンスを得るために重要です。新しくOracleSailStoreオブジェクトを作成するときに、デフォルトのCPSO索引が作成されます(C、P、S、Oは、コンテキスト、述語、主語および目的語の列を示します)。
RDF Semantic Graph support for OpenRDF SesameとRDF Semantic Graph support for Apache Jenaを使用して作成されるOracleセマンティク・モデルの間には、格納にいくつかの相違があります。たとえば、デフォルトのアプリケーション表索引がsupport for Apache Jenaでは異なります。RDF Semantic Graph support for Apache JenaモデルのデータにRDF Semantic Graph support for OpenRDF Sesameからアクセスするには(または逆の操作を行うには)、OracleUtils.migrateFromJenaメソッドとOracleUtils.migrateToJenaメソッドを使用します。これらのメソッドは、基礎となる記憶域構造に変更を行っている間、セマンティク・データを保持します。特に、RDF Semantic Graph support for OpenRDF SesameからRDF Semantic Graph support for Apache Jenaに移行すると、またはその逆に移行すると、すべてのトリプルはコンテキスト情報と一緒に保存されます。
例8-2に、RDF Semantic Graph support for OpenRDF SesameとRDF Semantic Graph support for Apache Jenaを使用して作成されたモデル間の移行を示します。
例8-2 RDF Semantic Graph support for Apache JenaモデルとRDF Semantic Graph support for OpenRDF Sesameモデルの間での移行
public void migrate(String jdbcUrl,
String user,
String password,
String model,
PrintStream psOut)
throws Exception
{
OraclePool oraclePool= new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(oraclePool, model);
OracleSailConnection conn = store.getConnection();
conn.clear();
// create a statement and add it to the store
URI subject =
store.getValueFactory().createURI("http://example.org/foo");
URI object = store.getValueFactory().createURI("http://example.org/bar");
URI ngURI = store.getValueFactory().createURI("http://example.org/bar");
conn.addStatement(subject, RDF.TYPE, object, ngURI);
conn.commit();
// convert it to a jena model
OracleUtils.migrateToJena(oraclePool, model);
Oracle newOra = oraclePool.getOracle();
oracle.spatial.rdf.client.jena.Oracle ora =
new oracle.spatial.rdf.client.jena.Oracle(newOra.getConnection());
GraphOracleSem graph = new GraphOracleSem(ora, model);
// check size of jena graph
System.out.print("GraphOracleSem size:" + graph.getSize());
store.shutDown();
// now convert it back to an Oracle sailstore.
OracleUtils.migrateFromJena(oraclePool, model);
conn = store.getConnection();
// check overall store size
System.out.println("Size of store :" +conn.size());
// check context size, should be 1
System.out.println("Size of context " + ngURI + ":" + conn.size(ngURI));
store.shutDown();
ora.dispose();
oraclePool.returnOracle(newOra);
}
OracleSailConnection.performInferenceメソッドを使用して推論を実行できます。このメソッドはストアを構築するときに添付ファイルで指定されていたモデルおよびルールベースで指定されるOracleSailStoreオブジェクトの伴意を構築します。
「伴意」の詳しい作成方法は、「伴意(ルール索引)」を参照してください。
大量のセマンティク・データをデータベースにロードした後、推論を実行する前に、アプリケーション表、セマンティク・モデルおよび推論されたグラフ(存在する場合)を分析することを強くお薦めします。分析操作を実行することで統計情報が収集され、問合せの応答時にOracleオプティマイザが効率的な実行計画を選択しやすくなります。
関連する統計を収集するには、OracleSailConnectionクラスおよびOracleSailStoreクラスで、次のメソッドを使用します。
OracleSailConnection.analyze
OracleSailConnection.analyzeApplicationTable
OracleSailConnection.analyzeInferredGraph
パラメータを含むこれらのメソッドの詳細は、RDF Semantic Graph support for OpenRDF Sesameのリファレンス情報(Javadoc)を参照してください。
OpenRDF.orgの説明のとおり、Sesame Consoleは、Sesameと対話するためのコマンドライン・アプリケーションです。現時点で、SYSTEMリポジトリにリポジトリを作成し、管理するための最適な方法は、Sesame Consoleを使用することです。Sesame Consoleに関する基本的な使用方法とリファレンス情報については、http://docs.rdf4j.org/のドキュメントを参照してください。
この項では、RDF Semantic Graph support for OpenRDF SesameでSesame Consoleを使用する方法について説明します。
Sesame Consoleコマンドライン・ツールを使用して、新たにSAILリポジトリ(OracleSailStoreオブジェクト)を作成するには、次のコマンドを使用します。
create oracle.
パラメータの入力を求められたら、次の項目を指定します。
リポジトリに対応するID文字列。例: myOracleRepos
リポジトリに対応するタイトル・文字列。例: My Oracle Repository
このリポジトリに対応するOracleセマンティク・モデルの名前。すべてのDML操作は、このモデルに対して実行されます。
このリポジトリに含める追加のセマンティク・モデルのカンマ区切りリスト。推論と問合せの操作にのみ使用される追加のモデル。
このリポジトリの伴意閉包を構築するときに考慮されるルールベースのカンマ区切りリスト。デフォルトではルールベースはなく、推論は実行されません。
問合せに応答する際に、仮想モデルを使用するかどうかを指定します。デフォルトはTRUEで、仮想モデルが使用されます。
Use Virtual ModelがTRUEの場合、リポジトリを所有するデータベース・ユーザーに、指定された仮想モデルでの読取り権限がある場合は、問合せの応答に使用される仮想モデルの名前を指定します。
コミット操作ごとに伴意閉包を更新する(UPDATE_WHEN_COMMIT)か、OracleSailConnection.performInferenceメソッドが起動されたときにのみにする(NO_UPDATE)かを指定します。デフォルトは、NO_UPDATEです。
追加のモデルがあるリポジトリを問い合せるときに、問合せのレスポンスに異なるモデルにわたる重複を含めることができるかどうかを指定します。デフォルトはTRUEで、重複を含めることを許可し、問合せのパフォーマンスを高速化します。
伴意が更新されない問合せを許可する(推論ステータスは無効)かどうかを指定します。デフォルト値はINVALIDで、問合せの際の伴意ステータスはINVALIDになる場合があります。
伴意ステータスが有効な場合にのみ問合せを許可するには、VALIDを指定します。伴意のステータスが有効または不完全な場合の問合せを許可するには、INCOMPLETEを指定します。
このリポジトリのアプリケーション表に作成されるカスタム索引を指定します。C (コンテキスト)、P (プロパティ)、S (述語)、O (目的語)のうち、4つまでの文字列を使用して含められる列(およびその順序)を指定できます。(これらの文字のみが使用可能で、二重に使用することはできません。)デフォルトはCPSOで、先行列としてコンテキストを持つ4つの列すべてで索引を作成します。
アプリケーション表索引に対するDOP(並列度)の値を指定します。マルチコアまたはマルチCPUのプロセッサで、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。デフォルトは1(並列度なし)です。
アプリケーション表の索引でキー圧縮を使用するかどうかを指定します。デフォルトは2で、最初の2列での圧縮を指定します。値が0 (ゼロ)の場合、圧縮は使用されません。
リポジトリ内の複数のコンテキストにわたって文の一意性を強制するかどうかを指定します。文の一意性は、アプリケーション表の一意の索引によって強制されることに注意してください。デフォルトは[] (値は指定されない)で、モデルが存在する場合は、一意性の設定がそのモデルから継承され、モデルが存在しない場合は、一意でない索引が作成されます。
FALSEを指定していて一意の索引が存在する場合、その索引は削除され、一意でない索引として再作成されます。
このリポジトリのOracleセマンティク・モデルとアプリケーション表にアクセスするためのデータベース接続設定を提供するJDBCデータソースの名前。デフォルトはOracleSemDSです。
例8-3に、Sesame Consoleを使用するシナリオの例を示します。
例8-3 Sesame Consoleの使用
> connect http://localhost:8080/openrdf-sesame. Disconnecting from default data directory Connected to http://localhost:8080/openrdf-sesame > create oracle. Please specify values for the following variables: Repository ID: model2Repos Repository title: Repository for Model 2 Model Name: model2 Additional Models (comma separated): Rulebases (comma separated): OWLPRIME -- OWLPRIME inference will be performed when this model is created Use Virtual Model (TRUE|FALSE) [TRUE]: TRUE Virtual Model Name: -- a new virtual model will be created if nonexistent Inference Maintenance Mode (UPDATE_WHEN_COMMIT|NO_UPDATE) [UPDATE_WHEN_COMMIT]: NO_UPDATE Allow duplicates in query (TRUE|FALSE) [TRUE]: TRUE Allow query with non-valid inference status (NONE|INCOMPLETE|INVALID) [NONE]: NONE – inference must be up to date before query Application Table Index [CPSO]: CPSO –- default, recommended index Index option: Degree of parallelism [1]: 1 Index option: Leading columns to compress [2]: 2 Enforce Uniqueness (|FALSE|TRUE) []: FALSE DataSource Name [OracleSemDS]: OracleSemDS Repository created > open model2Repos. Opened repository 'model2Repos' model2Repos> show c. --no contexts found-- model2Repos>
この項では、RDF Semantic Graph support for OpenRDF Sesameを使用した問合せの例を示します。それぞれの例は個々に完結しており、通常はOraclePoolオブジェクトから始めて、OracleSailStoreオブジェクトを作成し、文の追加および削除、推論を含む問合せの実行、結果の表示、OracleSailStoreオブジェクトの停止およびOraclePoolオブジェクトの終了を行います。
これらの例では、次のライブラリをCLASSPATH定義に含めておく必要があります。
sesame-console-2.3.1.jar sesame-http-client-2.3.1.jar sesame-http-protocol-2.3.1.jar sesame-http-server-spring-2.3.1.jar sesame-model-2.3.1.jar sesame-query-2.3.1.jar sesame-queryalgebra-evaluation-2.3.1.jar sesame-queryalgebra-model-2.3.1.jar sesame-queryparser-api-2.3.1.jar sesame-queryparser-serql-2.3.1.jar sesame-queryparser-sparql-2.3.1.jar sesame-queryresultio-api-2.3.1.jar sesame-queryresultio-binary-2.3.1.jar sesame-queryresultio-sparqljson-2.3.1.jar sesame-queryresultio-sparqlxml-2.3.1.jar sesame-queryresultio-text-2.3.1.jar sesame-repository-api-2.3.1.jar sesame-repository-contextaware-2.3.1.jar sesame-repository-dataset-2.3.1.jar sesame-repository-event-2.3.1.jar sesame-repository-http-2.3.1.jar sesame-repository-manager-2.3.1.jar sesame-repository-sail-2.3.1.jar sesame-rio-api-2.3.1.jar sesame-rio-n3-2.3.1.jar sesame-rio-ntriples-2.3.1.jar sesame-rio-rdfxml-2.3.1.jar sesame-rio-trig-2.3.1.jar sesame-rio-trix-2.3.1.jar sesame-rio-turtle-2.3.1.jar sesame-runtime-2.3.1.jar sesame-sail-api-2.3.1.jar sesame-sail-inferencer-2.3.1.jar sesame-sail-memory-2.3.1.jar sesame-sail-nativerdf-2.3.1.jar sesame-sail-rdbms-2.3.1.jar sdordf.jar sdordfsesame.jar ojdbc6.jar
例を簡略化するため、次のようにCPという環境変数が定義されています。
setenv CP ./:sesame-console-2.3.1.jar:sesame-http-client-2.3.1.jar:sesame-http-protocol-2.3.1.jar:sesame-http-server-spring-2.3.1.jar:sesame-model-2.3.1.jar:sesame-query-2.3.1.jar:sesame-queryalgebra-evaluation-2.3.1.jar:sesame-queryalgebra-model-2.3.1.jar:sesame-queryparser-api-2.3.1.jar:sesame-queryparser-serql-2.3.1.jar:sesame-queryparser-sparql-2.3.1.jar:sesame-queryresultio-api-2.3.1.jar:sesame-queryresultio-binary-2.3.1.jar:sesame-queryresultio-sparqljson-2.3.1.jar:sesame-queryresultio-sparqlxml-2.3.1.jar:sesame-queryresultio-text-2.3.1.jar:sesame-repository-api-2.3.1.jar:sesame-repository-contextaware-2.3.1.jar:sesame-repository-dataset-2.3.1.jar:sesame-repository-event-2.3.1.jar:sesame-repository-http-2.3.1.jar:sesame-repository-manager-2.3.1.jar:sesame-repository-sail-2.3.1.jar:sesame-rio-api-2.3.1.jar:sesame-rio-n3-2.3.1.jar:sesame-rio-ntriples-2.3.1.jar:sesame-rio-rdfxml-2.3.1.jar:sesame-rio-trig-2.3.1.jar:sesame-rio-trix-2.3.1.jar:sesame-rio-turtle-2.3.1.jar:sesame-runtime-2.3.1.jar:sesame-sail-api-2.3.1.jar:sesame-sail-inferencer-2.3.1.jar:sesame-sail-memory-2.3.1.jar:sesame-sail-nativerdf-2.3.1.jar:sesame-sail-rdbms-2.3.1.jar:sdordf.jar:sdordfsesame.jar:ojdbc6.jar
注意:
javacコマンドおよびjavaコマンドと同様、setenvコマンドは、1行のコマンドラインに入力します。
問合せを実行するには、次の手順を実行する必要があります。
コードをJavaソース・ファイルに含めます。この項で使用される例は、RDF Semantic Graph support for OpenRDF Sesameダウンロードのexamplesディレクトリのファイルで提供されています。
Javaソース・ファイルをコンパイルします。次に例を示します。
> javac -classpath $CP Example1.java
コンパイルされたファイルを実行します。次に例を示します。
> java -classpath $CP Test jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
例8-4は、Example1.javaファイルによるいくつかの基本操作の実行を示します。
例8-4 基本操作
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
public class Example1
{
public static void main(String[] args) throws SQLException, SailException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection conn = store.getConnection();
ValueFactory vf = store.getValueFactory();
URI p = vf.createURI("http://p");
URI cls = vf.createURI("http://cls");
URI a = vf.createURI("http://a");
URI b = vf.createURI("http://b");
URI ng1 = vf.createURI("http://ng1");
conn.clear();
conn.addStatement(p, RDFS.DOMAIN, cls);
conn.addStatement(a, p, b, ng1);
psOut.println("size of context " + ng1 + ":" + conn.size(ng1));
// returns OracleStatements
CloseableIteration<? extends Statement, SailException> it =
conn.getStatements(null, null, null, false);
while (it.hasNext()) {
Statement stmt = it.next();
psOut.println("getStatements: stmt: " + stmt.toString());
}
conn.removeStatements(null, null, null, ng1);
psOut.println("size of context " + ng1 + ":" + conn.size(ng1));
conn.removeAll();
psOut.println("size of store: " + conn.size());
conn.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
/usr/local/packages/jdk16/bin/javac -classpath $CP Example1.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example1 jdbc:oracle:thin:@localhost:1521:ORCL scott <password-for-scott> TestModel
javaコマンドの出力は、次のようになります。
size of context http://ng1:1 getStatements: stmt: O: (http://a, http://p, http://b) [http://ng1] getStatements: stmt: O: (http://p, http://www.w3.org/2000/01/rdf-schema#domain, http://cls) [null] size of context http://ng1:0 size of store: 0
例8-5に、TriG形式でデータ・ファイルを追加するExample2.javaファイルを示します。
例8-5 データ・ファイルの追加(TriG形式)
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
public class Example2
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
String trigFile = args[4];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
SailRepository sr = new SailRepository(store);
RepositoryConnection repConn = sr.getConnection();
repConn.setAutoCommit(false);
repConn.add(new File(trigFile), "http://my.com/", RDFFormat.TRIG);
repConn.commit();
psOut.println("size " + Long.toString(repConn.size()));
repConn.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example2.java
この例を実行するために、次のようなサンプルのTriGデータ・ファイルがtest.trigという名前で作成されているとします。
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix swp: <http://www.w3.org/2004/03/trix/swp-1/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix ex: <http://example.org/> .
@prefix : <http://example.org/> .
# default graph
{
<http://example.org/bob> dc:publisher "Bob Hacker" .
<http://example.org/alice> dc:publisher "Alice Hacker" .
}
:bob {
_:a foaf:mbox <mailto:bob@oldcorp.example.org> .
}
:alice {
_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example.org> .
}
:jack {
_:a foaf:name "Jack" .
_:a foaf:mbox <mailto:jack@oracle.example.org> .
}
test.trigデータ・ファイルを使用してこの例を実行するには、次のコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example2 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> TestModel ./test.trig
javaコマンドの出力は、次のようになります。
size 7
例8-6に、単純な問合せを実行するExample3.javaファイルを示します。
例8-6 単純な問合せ
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example3
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
SailRepository myRepository = new SailRepository(store);
ValueFactory f = myRepository.getValueFactory();
RepositoryConnection conn = myRepository.getConnection();
// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");
conn.clear(); // to start from scratch
conn.add(alice, RDF.TYPE, person);
conn.add(alice, name, alicesName);
conn.commit();
store.analyze();
store.analyzeApplicationTable();
try {
//run a query against the repository
String queryString = " SELECT * WHERE {?x ?p ?y} LIMIT 1 ";
TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();
try {
while (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("value of x: " + bindingSet.getValue("x"));
}
}
finally {
result.close();
}
}
finally {
conn.clear();
if (conn != null && conn.isOpen()) {
conn.close();
}
myRepository.shutDown();
op.close();
}
}
}
この例をコンパイルするには、次のコマンドを入力します。
/usr/local/packages/jdk16/bin/javac -classpath $CP Example3.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example3 jdbc:oracle:thin:@localhost:1521:ORCL scott <password-for-scott> TestModel
javaコマンドの出力は、次のようになります。
value of x: http://example.org/people/alice
例8-7に、単純なバルク・ロード操作を実行するExample4.javaファイルを示します。
例8-7 単純なバルク・ロード
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.Resource;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example4
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
String filename = args[4]; // N-TRIPLES file
OraclePool op = new OraclePool(OraclePool.getOracleDataSource(jdbcUrl, user, password));
psOut.println("testBulkLoad: start");
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
FileInputStream fis = new FileInputStream(filename);
long loadBegin = System.currentTimeMillis();
osc.getBulkUpdateHandler().addInBulk(
fis,
"http://abc", // baseURI
RDFFormat.NTRIPLES, // dataFormat
null, // tablespaceName
null, // flags
null, // StatusListener
(Resource[]) null // Resource... for contexts
);
long loadEnd = System.currentTimeMillis();
psOut.println("testBulkLoad: " + (loadEnd - loadBegin) + "ms.\n");
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example4.java
この例を実行するために、次のようなサンプルのntriplesデータ・ファイルがtest.ntriplesという名前で作成されているとします。
<http://example.org/bob> <http://purl.org/dc/elements/1.1/publisher> "Bob Hacker" . <http://example.org/alice> <http://purl.org/dc/elements/1.1/publisher> "Alice Hacker" .
test.ntriplesデータ・ファイルを使用してこの例を実行するには、次のコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example4 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> TestModel ./test.ntriples
javaコマンドの出力は、次のようになります。
testBulkLoad: start testBulkLoad: 756ms
例8-8に、アプリケーション表の索引を無効にし、RDFファイルからXML形式でバルク・ロード操作を実行した後に索引を再度有効にする、Example5.javaファイルを示します。
例8-8 RDF/XMLのバルク・ロードとアプリケーション表の索引のメンテナンス
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.Resource;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example5
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
String filename = args[4]; // RDF/XML
OraclePool op = new OraclePool(OraclePool.getOracleDataSource(jdbcUrl, user, password));
psOut.println("testBulkLoad: start");
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
// disable indexes on application table
store.disableAllAppTabIndexes();
// NOTE: can be a gzipped file!
FileInputStream fis = new FileInputStream(filename);
long loadBegin = System.currentTimeMillis();
osc.getBulkUpdateHandler().addInBulk(
fis,
"http://abc", // baseURI
RDFFormat.RDFXML, // dataFormat
null, // tablespaceName
null, // flags
null, // StatusListener
(Resource[]) null // Resource... for contexts
);
long loadEnd = System.currentTimeMillis();
psOut.println("testBulkLoad: " + (loadEnd - loadBegin) + "ms.\n");
// enable indexes on application table
// Note: one can also specify to rebuild indexes in parallel.
store.enableAllAppTabIndexes();
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example5.java
この例を実行するために、次のようなサンプル・ファイルがtest.rdfxmlという名前で作成されているとします。
<?xml version="1.0"?>
<!DOCTYPE owl [
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
]>
<rdf:RDF
xmlns = "http://a/b#" xml:base = "http://a/b#" xmlns:my = "http://a/b#"
xmlns:owl = "http://www.w3.org/2002/07/owl#"
xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs= "http://www.w3.org/2000/01/rdf-schema#"
xmlns:xsd = "http://www.w3.org/2001/XMLSchema#">
<owl:Class rdf:ID="Color">
<owl:oneOf rdf:parseType="Collection">
<owl:Thing rdf:ID="Red"/>
<owl:Thing rdf:ID="Blue"/>
</owl:oneOf>
</owl:Class>
</rdf:RDF>
test.rdfxmlファイルを使用してこの例を実行するには、次のコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example5 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX5 ./test.rdfxml
javaコマンドの出力は、次のようになります。
testBulkLoad: start testBulkLoad: 825ms
例8-9に、例8-7に示されるバルク・ロードと索引メンテナンス操作を実行し、またデータ・エラーの調査と報告を行うStatusListenerクラスを登録して実装するExample6.javaファイルを示します。
例8-9 不良データのあるロードを処理するためのStatusListenerによるバルク・ロード
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.Resource;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.model.Statement;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example6
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
String filename = args[4]; // RDF/XML
OraclePool op = new OraclePool(OraclePool.getOracleDataSource(jdbcUrl, user, password));
psOut.println("testBulkLoad: start");
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
// disable indexes on application table
store.disableAllAppTabIndexes();
// NOTE: can be a gzipped file!
FileInputStream fis = new FileInputStream(filename);
long loadBegin = System.currentTimeMillis();
osc.getBulkUpdateHandler().addInBulk(
fis,
"http://abc", // baseURI
RDFFormat.NTRIPLES, // dataFormat
null, // tablespaceName
null, // flags
new MyListener(psOut), // register a StatusListener
(Resource[]) null // Resource... for contexts
);
long loadEnd = System.currentTimeMillis();
psOut.println("testBulkLoad: " + (loadEnd - loadBegin) + "ms.\n");
// enable indexes on application table
// Note: one can also specify to rebuild indexes in parallel.
store.enableAllAppTabIndexes();
osc.close();
store.shutDown();
op.close();
}
static class MyListener implements StatusListener {
PrintStream m_ps = null;
public MyListener(PrintStream ps) { m_ps = ps; }
public void statusChanged(long count)
{
m_ps.println("process to " + Long.toString(count));
}
public int illegalStmtEncountered(Statement statement, long count)
{
m_ps.println("hit illegal statement with object " + statement.getObject().toString());
return 0; // skip it
}
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example6.java
この例を実行するため、次のようなサンプルのN-TRIPLESファイルがtest-include-badtriple.ntriplesという名前で作成されているとします。このファイルの最初と最後のトリプルには、オブジェクトに対して違法なタイプのリテラル値があります。
<http://example.org/x> <http://my.com/#age> "123.3456"^^<http://www.w3.org/2001/XMLSchema#integer> . <http://example.org/bob> <http://purl.org/dc/elements/1.1/publisher> "Bob Hacker" . <http://example.org/alice> <http://purl.org/dc/elements/1.1/publisher> "Alice Hacker" . <http://example.org/y> <http://my.com/#age> "hello"^^<http://www.w3.org/2001/XMLSchema#float> .
test-include-badtriple.ntriplesファイルを使用してこの例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example6 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX6 ./test-include-badtriple.ntriples
javaコマンドの出力は、次のようになります。
testBulkLoad: start hit illegal statement with object "123.3456"^^<http://www.w3.org/2001/XMLSchema#integer> process to 2 process to 3 hit illegal statement with object "hello"^^<http://www.w3.org/2001/XMLSchema#float> testBulkLoad: 725ms.
例8-10に、アプリケーション表の索引を無効にし、XML形式のRDFファイルをインメモリーSesameストアにロードして、そのデータをOracle Databaseにロードし、索引を再度有効にするExample7.javaファイルを示します。
例8-10 SesameストアからOracle Databaseへのデータのロード
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.Resource;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.sail.memory.MemoryStore;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.model.Statement;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example7
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
String filename = args[4]; // RDF/XML
OraclePool op = new OraclePool(OraclePool.getOracleDataSource(jdbcUrl, user, password));
psOut.println("testBulkLoad: start");
SailRepository srInMem = null;
RepositoryConnection repConnInMem = null;
{ // build an in memory Sesame store for testing purpose
srInMem = new SailRepository(new MemoryStore());
srInMem.initialize();
repConnInMem = srInMem.getConnection();
File file = new File(filename);
repConnInMem.setAutoCommit(false);
repConnInMem.add(file, "http://my.com", RDFFormat.RDFXML);
repConnInMem.commit();
}
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
// disable indexes on application table
store.disableAllAppTabIndexes();
long loadBegin = System.currentTimeMillis();
// load all statements from in memory store to Oracle
osc.getBulkUpdateHandler().addInBulk(
repConnInMem.getStatements(null, null, null, false),
null // tablespaceName
);
long loadEnd = System.currentTimeMillis();
psOut.println("testBulkLoad: " + (loadEnd - loadBegin) + "ms.\n");
// enable indexes on application table
// Note: one can also specify to rebuild indexes in parallel.
store.enableAllAppTabIndexes();
repConnInMem.close();
srInMem.shutDown();
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example7.java
この例を実行するために、「Example5.java: RDF/XMLのバルク・ロードとアプリケーション表索引のメンテナンス」の説明のとおり、同じ形式と内容で(メモリーにロードされる)ファイルが作成されているとします。
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example7 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX7 ./test.rdfxml
javaコマンドの出力は、次のようになります。
testBulkLoad: start testBulkLoad: 720ms
例8-11に、SPARQL ASK問合せを実行するExample8.javaファイルを示します。
例8-11 SPARQL ASK問合せ
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example8
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
SailRepository sr = new SailRepository(store);
RepositoryConnection repConn = sr.getConnection();
ValueFactory vf = sr.getValueFactory();
URI p = vf.createURI("http://p");
URI cls = vf.createURI("http://cls");
repConn.clear();
repConn.add(p, RDFS.DOMAIN, cls);
repConn.commit();
store.analyze(); // analyze the semantic model
store.analyzeApplicationTable(); // and then the application table
BooleanQuery tq = null;
tq = repConn.prepareBooleanQuery(QueryLanguage.SPARQL, "ASK { ?x ?p <http://cls> }" );
boolean b = tq.evaluate();
psOut.print("\nAnswer is " + Boolean.toString(b));
repConn.close();
sr.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example8.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example4 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX8
javaコマンドの出力は、次のようになります。
Answer is true
例8-12に、SPARQL CONSTRUCT問合せとSPARQL DESCRIBE問合せを実行するExample9.javaファイルを示します。
例8-12 SPARQL CONSTRUCTおよびSPARQL DESCRIBE
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example9
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
SailRepository sr = new SailRepository(store);
RepositoryConnection repConn = sr.getConnection();
ValueFactory vf = sr.getValueFactory();
URI p = vf.createURI("http://p");
URI cls = vf.createURI("http://cls");
repConn.clear();
repConn.add(p, RDFS.DOMAIN, cls);
repConn.commit();
store.analyze(); // analyze the semantic model
store.analyzeApplicationTable(); // and then the application table
GraphQuery tq = null;
tq = repConn.prepareGraphQuery(QueryLanguage.SPARQL,
"CONSTRUCT {?x <http://new_eq_p> ?o } WHERE { ?x ?p ?o }" );
{
psOut.println("Start construct query");
GraphQueryResult result = tq.evaluate();
while (result.hasNext()) {
Statement stmt = (Statement) result.next();
psOut.println(stmt.toString());
// do something interesting with the values here...
}
result.close();
}
tq = repConn.prepareGraphQuery(QueryLanguage.SPARQL,
"DESCRIBE <http://p> ");
{
psOut.println("Start describe query");
GraphQueryResult result = tq.evaluate();
while (result.hasNext()) {
Statement stmt = (Statement) result.next();
psOut.println(stmt.toString());
// do something interesting with the values here...
}
result.close();
}
repConn.close();
sr.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example9.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example9 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX9
javaコマンドの出力は、次のようになります。
Start construct query (http://p, http://new_eq_p, http://cls) Start describe query (http://p, http://www.w3.org/2000/01/rdf-schema#domain, http://cls)
例8-13に、増分オプション(INC)と並列度(DOP)オプションを使用してOWLPrime推論を実行するExample10.javaファイルを示します。
例8-13 推論
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example10
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
String[] rulebaseNames = new String[1];
rulebaseNames[0] = "owlprime";
Attachment attachment = Attachment.createInstance(
Attachment.NO_ADDITIONAL_MODELS, rulebaseNames,
InferenceMaintenanceMode.NO_UPDATE,
QueryOptions.DEFAULT);
OracleSailStore store = new OracleSailStore(op, model, attachment);
OracleSailConnection osc = store.getConnection();
ValueFactory vf = osc.getValueFactory();
URI sub, pred, obj;
{
sub = vf.createURI("http://C1");
pred = vf.createURI("http://www.w3.org/2000/01/rdf-schema#subClassOf");
obj = vf.createURI("http://C2");
osc.addStatement(sub, pred, obj);
sub = vf.createURI("http://C2");
pred = vf.createURI("http://www.w3.org/2000/01/rdf-schema#subClassOf");
obj = vf.createURI("http://C3");
osc.addStatement(sub, pred, obj);
}
osc.commit();
osc.analyze(); // analyze the semantic model
osc.analyzeApplicationTable(); // and then the application table
// parallel inference is certainly an overkill for this ontology
osc.setInferenceOption("INC=T,DOP=4,RAW8=T");
osc.performInference();
osc.analyzeInferredGraph();
TupleQuery tq = null;
RepositoryConnection repConn = osc.asRepositoryConnection();
tq = repConn.prepareTupleQuery(QueryLanguage.SPARQL,
"SELECT ?s ?p ?o WHERE {?s ?p ?o } ");
{
TupleQueryResult result = tq.evaluate();
int idx = 0;
try {
psOut.print("\nStart printing solution\n");
while (result.hasNext()) {
idx++;
BindingSet bindingSet = result.next();
}
}
finally {
psOut.println("\ntotal # of solution " + Integer.toString(idx));
result.close();
}
}
{
sub = vf.createURI("http://C3");
pred = vf.createURI("http://www.w3.org/2000/01/rdf-schema#subClassOf");
obj = vf.createURI("http://C4");
osc.addStatement(sub, pred, obj);
}
// make a small change and then perform inference again
osc.commit();
osc.analyze(); // analyze the semantic model
osc.analyzeApplicationTable(); // and then the application table
osc.performInference();
osc.analyzeInferredGraph();
{
TupleQueryResult result = tq.evaluate();
int idx = 0;
try {
psOut.print("\nStart printing solution\n");
while (result.hasNext()) {
idx++;
BindingSet bindingSet = result.next();
}
}
finally {
psOut.println("\ntotal # of solution " + Integer.toString(idx));
result.close();
}
}
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example10.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example10 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX10
javaコマンドの出力は、次のようになります。
Start printing solution total # of solution 3 Start printing solution total # of solution 6
例8-14に、名前付きグラフ問合せを実行するExample9.javaファイルを示します。
例8-14 名前付きグラフ問合せ
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example11
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
String trigFile = args[4];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
RepositoryConnection repConn = osc.asRepositoryConnection();
repConn.setAutoCommit(false);
// load the data incrementally since it is very small file
repConn.add(new File(trigFile), "http://my.com/", RDFFormat.TRIG);
osc.commit();
osc.analyze(); // analyze the semantic model
osc.analyzeApplicationTable(); // and then the application table
TupleQuery tq = null;
tq = repConn.prepareTupleQuery(QueryLanguage.SPARQL,
"SELECT ?g ?s ?p ?o WHERE {?g <http://purl.org/dc/elements/1.1/publisher> ?o1 . GRAPH ?g {?s ?p ?o}}");
{
TupleQueryResult result = tq.evaluate();
int idx = 0;
try {
while (result.hasNext()) {
idx++;
BindingSet bindingSet = result.next();
psOut.print("\nsolution " + bindingSet.toString());
}
}
finally {
psOut.println("\ntotal # of solution " + Integer.toString(idx));
result.close();
}
}
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example9.java
この例を実行するために、「Example2.java: データ・ファイルの追加(TriG形式)」の説明のとおりtest.trigファイルが作成されているとします。
test.trigデータ・ファイルを使用してこの例を実行するには、次のコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example11 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX11 ./test.trig
javaコマンドの出力は、次のようになります。
solution [g=http://example.org/alice;s=_:node14r2238h1x1;p=http://xmlns.com/foaf/0.1/mbox;o=mailto:alice@work.example.org] solution [g=http://example.org/alice;s=_:node14r2238h1x1;p=http://xmlns.com/foaf/0.1/name;o="Alice"] solution [g=http://example.org/bob;s=_:node14r2238h1x1;p=http://xmlns.com/foaf/0.1/mbox;o=mailto:bob@oldcorp.example.org] total # of solution 3
例8-15に、アプリケーション表で索引を作成する高度な例のExample12.javaファイルを示します。
例8-15 アプリケーション表の索引[高度]
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example12
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
// create an index with compress 2, parallel 4
store.createAppTabIndex("spoc", 2, 4);
// create another index w/o parallel or compression
store.createAppTabIndex("cspo", 0, 1);
// will print out the default index (cpso) as well
psOut.println("index signatures before dropping indexes:");
for (String sig : store.getAppTabIndexSignatures()) {
psOut.println("index signature:" + sig);
}
store.dropAllAppTabIndexes();
psOut.println("index signatures after dropping indexes...");
for (String sig : store.getAppTabIndexSignatures()) {
psOut.println("index signature:" + sig);
}
store.shutDown();
// clean up oracle tables and models
OracleUtils.dropSemanticModelAndTables(op, model);
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example12.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example12 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX12
javaコマンドの出力は、次のようになります。
index signatures before dropping indexes: index signature:spoc index signature:cpso index signature:cspo index signatures after dropping indexes...
例8-16に、アプリケーション表で一意性制約を有効にしたり無効にする高度な例のExample13.javaファイルに示します。
例8-16 アプリケーション表の一意性制約[高度]
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.BooleanQuery;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.GraphQuery;
import org.openrdf.query.GraphQueryResult;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example13
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
store.enableUniquenessConstraint(); ValueFactory f = store.getValueFactory();
OracleSailConnection osc = store.getConnection();
// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
osc.addStatement(alice, name, person);
osc.addStatement(alice, name, person);
psOut.println("size of store after adding duplicate triple with uniqueness ON :" + osc.size());
osc.clear();
store.disableUniquenessConstraint(); osc.addStatement(alice, name, person);
osc.addStatement(alice, name, person);
psOut.println("size of store after adding duplicate triple with uniqueness OFF:" + osc.size());
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example13.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example13 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX13
javaコマンドの出力は、次のようになります。
size of store after adding duplicate triple with uniqueness ON :1 size of store after adding duplicate triple with uniqueness OFF:2
例8-17に、問合せタイムアウトとパラレル実行(TIMEOUTとDOPオプション)を指定する高度な例のExample14.javaファイルを示します。
例8-17 問合せタイムアウトとパラレル実行[高度]
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example14
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();
// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");
osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();
osc.analyze();
osc.analyzeApplicationTable();
// Run a query while specifying parallel execution (through DOP=2)
// and max query execution time (through tmieout=3)
String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#dop=2,timeout=3> " +
" SELECT * WHERE {?x ?p ?y} ";
TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();
try {
while (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("value of x: " + bindingSet.getValue("x"));
}
}
finally {
result.close();
}
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example14.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example14 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX14
javaコマンドの出力は、次のようになります。
value of x: http://example.org/people/alice value of x: http://example.org/people/alice
例8-18に、一致の合計(COUNT)数(および一致したもののみ)を戻す高度な例のExample15.javaファイルを示します。
例8-18 一致件数の取得[高度]
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example15
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();
// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");
osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();
osc.analyze();
osc.analyzeApplicationTable();
// Run a query and only return the number of matches (the count!)
String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#count_only> " +
" SELECT ?totalCount WHERE {?s ?p ?y} ";
TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();
try {
if (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("number of matches: " + bindingSet.getValue("totalCount"));
}
}
finally {
result.close();
}
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example15.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example15 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX15
javaコマンドの出力は、次のようになります。
number of matches: "2"^^<http://www.w3.org/2001/XMLSchema#integer>
例8-19に、SPARQL問合せパターンの定数に対してバインド変数を指定する高度な例のExample16.javaファイルを示します。
例8-19 問合せパターンの定数に対するバインド変数の指定[高度]
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example16
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();
// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");
osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();
osc.analyze();
osc.analyzeApplicationTable();
String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#use_bind_var(1)> " +
" SELECT ?p WHERE { <http://example.org/people/alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?p} ";
TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();
try {
if (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("solution " + bindingSet.toString());
}
}
finally {
result.close();
}
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example16.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example16 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX16
javaコマンドの出力は、次のようになります。
solution [p=http://example.org/ontology/Person]
例8-20に、Example16.java (例8-19)のSPARQL問合せパターンと異なる位置の定数に対するバインド変数を指定する高度な例のExample17.javaファイルを示します。
例8-20 問合せパターンの異なる位置の定数に対するバインド変数の指定[高度]
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example17
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();
// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");
osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();
osc.analyze();
osc.analyzeApplicationTable();
String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#use_bind_var(2)> " +
" SELECT ?s WHERE { ?s <http://example.org/ontology/name> \"Alice\" } ";
TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();
try {
if (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("solution " + bindingSet.toString());
}
}
finally {
result.close();
}
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example17.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example17 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX17
javaコマンドの出力は、次のようになります。
solution [s=http://example.org/people/alice]
例8-21に、内部の数値IDからURIを構築する高度な例のExample18.javaファイルを示します。
例8-21 内部の数値IDからのURIの構築[高度]
import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import info.aduna.iteration.CloseableIteration;
import java.io.*;
import java.sql.SQLException;
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
public class Example18
{
public static void main(String[] args) throws SQLException, SailException,
RepositoryException, IOException, RDFParseException, QueryEvaluationException,
MalformedQueryException
{
PrintStream psOut = System.out;
String jdbcUrl = args[0];
String user = args[1];
String password = args[2];
String model = args[3];
OraclePool op = new OraclePool(
OraclePool.getOracleDataSource(jdbcUrl, user, password));
OracleSailStore store = new OracleSailStore(op, model);
OracleSailConnection osc = store.getConnection();
ValueFactory f = osc.getValueFactory();
// create some resources and literals to make statements out of
URI alice = f.createURI("http://example.org/people/alice");
URI name = f.createURI("http://example.org/ontology/name");
URI person = f.createURI("http://example.org/ontology/Person");
Literal alicesName = f.createLiteral("Alice");
osc.addStatement(alice, RDF.TYPE, person);
osc.addStatement(alice, name, alicesName);
osc.commit();
osc.analyze();
osc.analyzeApplicationTable();
String queryString =
" PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#build-uri-for-id(?p)> " +
" SELECT ?p WHERE { <http://example.org/people/alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?p} ";
TupleQuery tupleQuery = osc.asRepositoryConnection().prepareTupleQuery(
QueryLanguage.SPARQL, queryString);
TupleQueryResult result = tupleQuery.evaluate();
try {
if (result.hasNext()) {
BindingSet bindingSet = result.next();
psOut.println("solution " + bindingSet.toString());
}
}
finally {
result.close();
}
osc.close();
store.shutDown();
op.close();
}
}
この例をコンパイルするには、次のコマンドを入力します。
usr/local/packages/jdk16/bin/javac -classpath $CP Example18.java
この例を実行するには、次の形式でコマンドを入力します。
/usr/local/packages/jdk16/bin/java -classpath $CP Example18 jdbc:oracle:thin:@localhost:1521:ORCL scott <password> EX18
javaコマンドの出力は、次のようになります。
solution [p=rdfvid:428072448720587401]