Sesame Adapter for Oracle Database (以降、Sesame Adapter)は、一般的なSesame Java APIをOracleセマンティク・テクノロジ・サポートに統合します。OpenRDF (http://www.openrdf.org/
)によって作成されたSesameは、RDFデータの格納、推論および問合せのためのオープン・ソース・フレームワークです。
この章では、第1章「Oracle Databaseセマンティク・テクノロジの概要」および第2章「OWLの概念」で説明されている主要な概念について十分に理解していることが前提です。Sesame Javaフレームワークの全体的な機能および使用についても十分に理解していることを前提とします。Sesameフレームワークの詳細は、http://www.openrdf.org/documentation.jsp
のSesameドキュメントのページを参照してください。
Sesame Adapterは、Oracle Databaseリリース11.2のRDFおよびOWLのセマンティク・データ管理機能を拡張します。
この章には次の主要なトピックがあります。
Jena Adapter (第7章を参照)と同様、Sesame Adapterは、オープン・ソース・フレームワークおよび関連ツールを使用した、Oracleセマンティク・データへのJavaベースのインタフェースを提供します。ただし、Sesame Adapterでは、データにコンテキストのサポートが追加されています。
Jena文では、トリプル(主語、述語、目的語)を処理します。
Sesame文では、トリプルとコンテキストを処理します(Sesame文は、トリプルとコンテキストで構成されるクワッドです)。たとえば、病院の患者データの場合、コンテキストには患者のURIが含まれます。
Sesame Adapterは、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へのグラフィカル・ユーザー・インタフェースです)。
Sesame Adapterによって提供される機能を次に示します。
(コンテキスト付きおよびコンテキストなしの)文のロード(バルクおよび増分)、エクスポートおよび削除
(コンテキスト付きおよびコンテキストなしの)データの問合せ
推論(推論データは(includeInferred=true
の場合)問合せ実行中に考慮され、推論トリプルのコンテキストはNULLです)
名前空間の管理
Sesame Adapter for Oracle Databaseは、Sesame Storage and Inference Layer (SAIL) APIの様々なインタフェースを実装しています。たとえば、クラスOracleSailConnection
は、Sesame SailConnection
インタフェースのOracle実装で、クラスOracleSailStore
は、Sesame Sail
インタフェースのOracle実装です。
Sesame Adapterの一般的な使用フローを、例8-1に抜粋して示します。
例8-1 Sesame Adapterの使用フローの例
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();
Sesame Adapter for Oracle Databaseの設定と構成には、次のアクションが含まれます。
Sesame Adapterを使用するには、システム環境に必要なソフトウェア(Oracle Database 11gリリース2 (SpatialオプションおよびPartitioningオプションを含み、セマンティク・テクノロジ・サポートが有効になっている)、Sesameバージョン2.3.1、Sesame AdapterおよびJDK 6)があることを最初に確認する必要があります。次のアクションを実行することによって、ソフトウェア環境を設定できます。
Oracle Databaseリリース11.2 Enterprise Editionと、Oracle SpatialオプションおよびOracle Partitioningオプションをインストールします。
A.1項の説明のとおり、セマンティク・テクノロジのサポートを有効にします。
Sesame 2.2のユーザー・ガイドのSesameライブラリを使用するための設定に関する説明のとおり、Sesame 2.3.1 onejar
ライブラリをダウンロードし、クラスパスに含めます。(http://openrdf.callimachus.net/sesame/2.7/docs/users.docbook?view
、または使用可能な場合はより新しいバージョンを参照してください。)
Sesame 2.2のユーザー・ガイドのサーバー・ソフトウェアのインストールに関する説明のとおり、Sesame 2.3.1 Serverをインストールします。(http://openrdf.callimachus.net/sesame/2.7/docs/users.docbook?view
、または使用可能な場合はより新しいバージョンを参照してください。)
Oracle Databaseセマンティク・テクノロジのページ(http://www.oracle.com/technetwork/database/options/semantic-tech/
で「Downloads」をクリック)からSesame Adapter (sesame_adapter_for_release11.2.zip
)をダウンロードして、(Linuxシステムの)/tmp/sesame_adapter
などの一時ディレクトリに解凍します。(この一時ディレクトリがまだ存在していない場合は、解凍操作の前に作成します。)
Sesame Adapterのディレクトリとファイルの構造は、次のとおりです。
examples/ examples/Example1.java examples/Example2.java . . . lib/ lib/sdordfsesame.jar web/ web/web.xml javadoc/ javadoc/javadoc.zip
ojdbc6.jar
を<Sesame_DIR>/lib
(Linux)または<Sesame_DIR>\lib
(Windows)にコピーします。(ojdbc6.jar
は、$ORACLE_HOME/jdbc/lib
または%ORACLE_HOME%\jdbc\lib
にあります。)
sdordf.jar
を<Sesame_DIR>/lib
(Linux)または<Sesame_DIR>\lib
(Windows)にコピーします。(sdordf.jar
は、$ORACLE_HOME/md/jlib
または%ORACLE_HOME%\md\jlib
にあります。)
JDK 6がまだインストールされていない場合は、インストールします。
JAVA_HOME環境変数にJDK 6インストールが指定されていない場合は、適切に定義します。次に例を示します。
setenv JAVA_HOME /usr/local/packages/jdk16/
SPARQLプロトコルをサポートするためのSPARQLサービスが設定されていない場合は、8.2.2項の説明のとおりに設定します。
ソフトウェア環境を設定した後、8.2.3項の説明にあるとおり、セマンティク・テクノロジ環境でSesame Adapterを使用して問合せを実行できることを確認します。
Sesame Adapterを使用して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)をダウンロードしてインストールします。詳細は、http://www.oracle.com/technology/products/weblogic/
を参照してください。
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
8.2.1項の説明にあるとおり、Sesame Adapter for Oracle Databaseがダウンロードされ解凍されていることを確認します。
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リリース11.2のホーム・ディレクトリを指しているとします。)
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問合せの実行対象になる関連セマンティク・データを含むデータベース・スキーマのユーザーとパスワードを指定できます。
このデータ・ソースの作成に関する情報は、8.2.2.1項「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レスポンスに、Sesame Adapter問合せ管理サーブレットによる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データ・ソースを作成するには、次の手順に従います。
http://
<hostname>
:7001/console
にログインします。
「ドメイン構造」パネルで、「サービス」をクリックします。
「JDBC」をクリックします。
「データ・ソース」をクリックします。
「JDBCデータ・ソースのサマリー」パネルで、「データ・ソース」表の下の「新規」をクリックします。
「新しいJDBCデータ・ソースの作成」パネルで、次の値を入力または選択します。
名前: OracleSemDS
JNDI名: OracleSemDS
データベースのタイプ: Oracle
データベース・ドライバ: Oracle's Driver (Thin) Versions: 9.0.1,9.2.0,10,11
「次」を2回クリックします。
「接続プロパティ」パネルで、「データベース名」、「ホスト名」、「ポート」、「データベース・ユーザー名」(セマンティク・データを含むスキーマ)、「パスワード」のフィールドに適切な値を入力します。
「次」をクリックします。
このOracleSemDS
データ・ソースをデプロイするターゲット・サーバー(1つまたは複数)を選択します。
「終了」をクリックします。
すべての変更がアクティブ化されており、再起動は必要ないというメッセージが表示されます。
OracleSailStore
APIおよびその他の関連APIを使用してセマンティク・モデルを作成し、データを(増分またはバルク)ロードして論理推論を実行できます。
セマンティク・モデルがOracle Databaseに格納された後、Sesame Console (8.9項を参照)を使用してSesame Serverに接続し、Oracleのセマンティク・モデルベースのリポジトリを作成できます。たとえば、LUBM
という名前のセマンティク・モデルとOWLPRIME
ルールベースを使用する、リポジトリIDがmyOracleRepos
のリポジトリを作成できます。
この新しく作成されたリポジトリは、Sesame Server上の新しいサービス・エンドポイントを提供します。
一部のアプリケーションでは長時間にわたるSPARQL問合せを終了できるようにする必要があるため、Sesame Adapterと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
Sesame Adapterを使用して問合せを実行するには、(適切な権限を持つ)任意のユーザーで接続し、セマンティク・ネットワークで任意のモデルを使用します。セマンティク・テクノロジ環境が要件をすでに満たしている場合は、Sesame Adapterを使用するJavaコードを直接コンパイルして実行できます。Sesame Adapterを使用できるようにセマンティク・テクノロジ環境を設定していない場合は、次の例のような手順を実行します。
SYSDBAロールを持つSYSとして接続します。
sqlplus sys/<password-for-sys> as sysdba
システム表の表領域を作成します。次に例を示します。
CREATE TABLESPACE rdf_users datafile 'rdf_users01.dbf' size 128M reuse autoextend on next 64M maxsize unlimited segment space management auto;
セマンティク・ネットワークを作成します。次に例を示します。
EXECUTE sem_apis.create_sem_network('RDF_USERS');
(セマンティク・ネットワークとSesame Adapterを使用するデータベースに接続するための)データベース・ユーザーを作成します。次に例を示します。
CREATE USER rdfusr IDENTIFIED BY <password-for-udfusr> DEFAULT TABLESPACE rdf_users;
このデータベース・ユーザーに必要な権限を付与します。次に例を示します。
GRANT connect, resource TO rdfusr;
自身のセマンティク・データとともにSesame Adapterを使用するには、1.10項「セマンティク・データを使用するためのクイック・スタート」の説明のとおり、適切な手順を実行してデータを格納し、モデルを作成して、データベース索引を作成します。その後、Javaコードをコンパイルして実行することで問合せを実行します(問合せの例については、8.10項を参照してください)。
Sesame Adapterと提供されたサンプル・データを使用する場合は、8.10項を参照してください。
Oracle Databaseに格納されているセマンティク・データを問い合せるには、SEM_MATCHベースのSQL文と、Sesame Adapterを介したSPARQL問合せの2つの方法があります。それぞれの方法での問合せは、表面的には類似していますが、動作には重要な違いがあります。アプリケーションの動作を一貫性のあるものにするには、SEM_MATCH問合せとSPARQL問合せの違いを理解し、その問合せ結果を処理する際に注意を払う必要があります。
2つの方法を次の簡単な例で示します。
問合せ1 (SEM_MATCHベース)
select s, p, o from table(sem_match('{?s ?p ?o}', sem_models('Test_Model'), ....))
問合せ2 (Sesame Adapterを介したSPARQL問合せ)
select ?s ?p ?o where {?s ?p ?o}
これらの2つの問合せは、同じ種類の機能を実行しますが、いくつか重要な違いがあります。問合せ1 (SEM_MATCHベース)は次のようになります。
Test_Model
からすべてのトリプルを読み取ります。
URI、bNode、プレーン・リテラルおよび型付きリテラルを区別せず、長いリテラルを処理しません。
特定の文字('\n'
など)はエスケープ解除しません。
問合せ2 (Sesame Adapterを介して実行されるSPARQL問合せ)もTest_Model
からすべてのトリプルを読み取ります(同じ基礎となるTest_Model
を参照しているModelOracleSem
に対してコールを実行したと想定します)。ただし、問合せ2は次のようになります。
(SEM_MATCHテーブル・ファンクションにおけるs
、p
およびo
列のみではなく)追加の列を読み取り、URI、bNodes、プレーン・リテラル、型付きリテラルおよび長いリテラルを区別します。これによって、Sesame Nodeオブジェクトを適切に作成できるようになります。
Oracle Databaseに格納される際にエスケープされる文字をエスケープ解除します。
2つの方法でのもう1つの違いは、空白ノード処理です。
SEM_MATCHベースの問合せにおいて、空白ノードは常に定数とみなされます。
SPARQL問合せにおいて、<
と>
で囲まれていない空白ノードは、問合せがSesame Adapterを介して実行されるときに変数とみなされます。これは、SPARQL標準セマンティクと一致します。ただし、<
と>
で囲まれた空白ノードは、問合せが実行されるときに定数とみなされ、空白ノード・ラベルには、基礎となるデータのモデル化で必要とされる適切な接頭辞が、Sesame Adapterによって追加されます。
Sesame Adapter APIを使用して作成されるセマンティク・モデルの名前の最大長は、22文字です。
この項では、SPARQL問合せ処理を強化できる、Sesame Adapterのいくつかのパフォーマンス関連機能について説明します。これらの機能は、デフォルトでは自動的に実行されます。
DISTINCT、OPTIONAL、GRAPH、FILTER、UNION、ORDER BYおよびLIMITを含むSPARQL問合せは、SEM_MATCHテーブル・ファンクションに基づく単一のSQL問合せに変換されます。SPARQLのASK、DESCRIBEおよびCONSTRUCT問合せの場合、Sesame Adapterでは、追加の問合せ変換ロジックと中間層処理が使用されます。
SEM_MATCHに基づくSQL問合せの実行が失敗した場合、Sesame AdapterではSesameの評価戦略を使用してその問合せを実行します。
Sesame Adapterを使用した問合せのパフォーマンスを改善するための推奨事項は次のとおりです。
アプリケーション表での追加の結合の数を減らすため、SPARQL問合せのGRAPH句には、関連するトリプル・パターンのみを記述します。(詳細は、8.5.1項を参照してください。)
名前付きグラフ問合せのGRAPH句内のトリプル・パターンに、NULLバインディングによる変数は使用しません。NULLバインディングは関連するアプリケーション表との結合でいずれの行も一致しないため、このバインディングは削除されます。
前述の理由により、GRAPH句内にOPTIONAL句、またはOPTIONAL句内にGRAPH句は記述しません。
アプリケーション表のCONTEXT列(8.5.1項を参照)には、空白ノードを使用しません(これは、2つの異なるセマンティク・モデルの名前付きグラフの空白ノードが同じラベルを持つ場合、これらが同じリソースとみなされてしまうためです)。これは、トリプル内の空白ノードには該当しません(異なるモデルのものは別々に格納されます)。
MDSYS.SEMM_model-nameビュー(1.3.1項の表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句に記述することをお薦めします。
Sesame Adapterにより、ヒントや追加の問合せオプションを渡すことができます。問合せオプションを含む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ヒントの使用の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」、特にoptions
属性でのHINT0
キーワードに関する資料を参照してください。
SEM_MATCH filter
属性は、WHEREキーワードのないWHERE句の形式の文字列として、追加の選択基準を指定できます。追加の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句内の定数に適用しないでください。)
この項では、Sesame Adapterによって使用可能になるOracle Databaseのセマンティク・テクノロジ機能の一部について説明します。使用可能な機能をサポートするAPIコールの包括的なドキュメントについては、Sesame Adapterのリファレンス情報(Javadoc)を参照してください。Sesame Adapterによって使用可能になるサーバー側機能の詳細は、このマニュアルの関連する章を参照してください。
仮想モデル(1.3.8項を参照)は、OracleSailStore
コンストラクタで指定され、透過的に処理されます。仮想モデルがモデルとルールベースの組合せのために存在している場合には、問合せの応答に使用されます(そのような仮想モデルが存在しない場合には、データベースに作成されます)。
注意: Sesame Adapterを介した仮想モデルのサポートは、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の接続プーリングは、Sesame AdapterのOraclePoolクラスを介して提供されます。通常、OraclePoolは、OraclePool (DataSource ods)
コンストラクタを使用してDataSource
で初期化されます。この場合、OraclePool
はデータ・ソースの接続プーリング機能を使用しながら、DataSource
の拡張ラッパーとして動作します。OracleSailStore
オブジェクトを作成するときには、store
コンストラクタ内にOraclePool
オブジェクトを指定するのみで十分です(Sesame Adapterによりデータベース接続が自動的に管理されるようになります)。
Oracle接続オブジェクト(基本的にデータベース接続ラッパーである)を明示的に取得する必要がある場合は、OraclePool.getOracle
メソッドを起動します。接続を終了した後は、OraclePool.returnOracle
メソッドを起動して、接続プールにオブジェクトを戻します。
OraclePool
は、OracleConnection
オブジェクトを使用して初期化することもできます。この場合、このOraclePool
を参照するときに単一のデータベース接続のみが使用されます(複数のSesame SailConnection
オブジェクトが同じデータベース接続を使用することになるため、異なるSailConnection
オブジェクト間でダーティな読取りが起こり得ることを認識しておく必要があります)。
OraclePool
の使用の詳細は、Sesame Adapterの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(); }
Sesame Adapterを介して、複数のセマンティクPL/SQLサブプログラムを使用できます。表8-1に、サブプログラムと、対応するJavaクラスおよびメソッドを示します。
表8-1 PL/SQLサブプログラムと、対応するSesame AdapterのJavaクラスおよびメソッド
PL/SQLサブプログラム | 対応するJavaクラスとメソッド |
---|---|
|
OracleUtils.dropSemanticModel |
|
OracleUtils.mergeModels |
|
OracleUtils.swapNames |
|
OracleUtils.removeDuplicates |
|
OracleUtils.renameModels |
これらのPL/SQLユーティリティ・サブプログラムの詳細は、第9章のリファレンス情報を参照してください。対応するJavaクラスおよびメソッドの詳細は、Sesame AdapterのAPIリファレンス・ドキュメント(Javadoc)を参照してください。
setInferenceOption(String options)
プロシージャとOracleSailConnection
オブジェクトを使用して、伴意コールにオプションを追加できます。次の例では、伴意を作成するときに増分推論を有効化し、並列度の値を4に指定します。
conn.setInferenceOption("INC=T,DOP=4");
推論の詳細は、2.2項を参照してください。
この項では、Sesame Adapter for Oracle DatabaseがSesame SailConnection
およびSail APIに提供する拡張機能について説明します。
Sesame 2.3.0における文の一意性は、コンテキスト・レベルで強制されます(同じトリプルを単一のコンテキストで2回は使用できません)。Oracle Sesame Adapterでは、そのような一意性がコンテキスト、述語、主語および目的語での一意の索引を介して強制されます。ただし、Sesame Adapterにおける文の一意性は、デフォルトでは有効になっていません。OracleSailStore
オブジェクトを構築するとき、文の一意性のデフォルト値はDONTCARE
で、一意の索引がまだ存在していない場合に作成されないことを意味します。
OracleSailStore
コンストラクタ、またはenableUniquenessConstraint
メソッドおよびdisableUniquenessConstraint
メソッドのいずれかを使用した文の一意性に対する要件は、明示的に有効化することも無効化することもできます。
OracleSailStore
オブジェクトに対してDML操作(特に削除)と名前付きグラフ問合せを実行する際に、パフォーマンスを改善するには、アプリケーション表の索引が重要です。新しいOracleSailStore
オブジェクトの作成時に、デフォルトのCPSO
索引が作成されます(C
、P
、S
、O
は、コンテキスト、述語、主語および目的語の列を表します)。
Sesame AdapterとJena Adapterを使用して作成されるOracleセマンティク・モデルの間には、格納にいくつかの相違があります。たとえば、デフォルトのアプリケーション表の索引は、Jena Adapterでは異なります。Sesame AdapterからJena Adapterモデルのデータにアクセスするには(逆も同様)、OracleUtils.migrateFromJena
メソッドとOracleUtils.migrateToJena
メソッドを使用します。これらのメソッドは、基礎となる記憶域構造の変更中に、セマンティク・データを保持します。特に、Sesame AdapterからJena Adapterへの移行、またその逆への移行の際、すべてのトリプルがそのコンテキスト情報とともに保持されます。
例8-2は、Sesame AdapterとJena Adapterを使用して作成されるモデル間の移行を示しています。
例8-2 Jena AdapterモデルとSesame Adapterモデル間の移行
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
オブジェクトの伴意を作成します。
伴意の作成の詳細は、1.3.7項「伴意(ルール索引)」を参照してください。
大量のセマンティク・データをデータベースにロードした後、推論を実行する前に、アプリケーション表、セマンティク・モデルおよび推論されたグラフ(存在する場合)を分析することを強くお薦めします。分析操作を実行することで統計情報が収集され、問合せの応答時にOracleオプティマイザが効率的な実行計画を選択しやすくなります。
関連する統計情報を収集するには、OracleSailConnection
クラスおよびOracleSailStore
クラスで、次のメソッドを使用します。
OracleSailConnection.analyze
OracleSailConnection.analyzeApplicationTable
OracleSailConnection.analyzeInferredGraph
パラメータを含むこれらのメソッドの詳細は、Sesame Adapterのリファレンス情報(Javadoc)を参照してください。
OpenRDF.orgの説明のとおり、Sesame Consoleは、Sesameと対話するためのコマンドライン・アプリケーションです。現時点で、SYSTEMリポジトリにリポジトリを作成し管理するための最適な方法は、Sesame Consoleを使用することです。Sesame Consoleに関する基本的な使用方法とリファレンス情報については、http://openrdf.callimachus.net/sesame/2.7/docs/users.docbook?view
のドキュメントを参照してください。
この項では、Sesame Adapter for Oracle Databaseで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>
この項では、Sesame Adapterを使用した問合せの例を示します。各例は自己完結型で、通常は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ソース・ファイルに含めます。この項で使用される例は、Sesame Adapterダウンロードの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は、アプリケーション表の索引を無効にし、XML形式のRDFファイルからバルク・ロード操作を実行した後、索引を再度有効にする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
この例を実行するため、8.10.5項「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
この例を実行するため、8.10.2項「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]