ヘッダーをスキップ
Oracle® Databaseセマンティク・テクノロジ開発者ガイド
11gリリース2 (11.2)
E52974-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

8 Sesame Adapter for Oracle Database

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のセマンティク・データ管理機能を拡張します。

この章には次の主要なトピックがあります。

8.1 Sesame Adapterの概要

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();

8.2 Sesame Adapterの設定と構成

Sesame Adapter for Oracle Databaseの設定と構成には、次のアクションが含まれます。

  1. ソフトウェア環境の設定

  2. SPARQLサービスの設定

  3. セマンティク・テクノロジ環境の設定

8.2.1 ソフトウェア環境の設定

Sesame Adapterを使用するには、システム環境に必要なソフトウェア(Oracle Database 11gリリース2 (SpatialオプションおよびPartitioningオプションを含み、セマンティク・テクノロジ・サポートが有効になっている)、Sesameバージョン2.3.1、Sesame AdapterおよびJDK 6)があることを最初に確認する必要があります。次のアクションを実行することによって、ソフトウェア環境を設定できます。

  1. Oracle Databaseリリース11.2 Enterprise Editionと、Oracle SpatialオプションおよびOracle Partitioningオプションをインストールします。

  2. A.1項の説明のとおり、セマンティク・テクノロジのサポートを有効にします。

  3. Sesame 2.2のユーザー・ガイドのSesameライブラリを使用するための設定に関する説明のとおり、Sesame 2.3.1 onejarライブラリをダウンロードし、クラスパスに含めます。(http://openrdf.callimachus.net/sesame/2.7/docs/users.docbook?view、または使用可能な場合はより新しいバージョンを参照してください。)

  4. Sesame 2.2のユーザー・ガイドのサーバー・ソフトウェアのインストールに関する説明のとおり、Sesame 2.3.1 Serverをインストールします。(http://openrdf.callimachus.net/sesame/2.7/docs/users.docbook?view、または使用可能な場合はより新しいバージョンを参照してください。)

  5. 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
    
  6. ojdbc6.jar<Sesame_DIR>/lib (Linux)または<Sesame_DIR>\lib (Windows)にコピーします。(ojdbc6.jarは、$ORACLE_HOME/jdbc/libまたは%ORACLE_HOME%\jdbc\libにあります。)

  7. sdordf.jar<Sesame_DIR>/lib (Linux)または<Sesame_DIR>\lib (Windows)にコピーします。(sdordf.jarは、$ORACLE_HOME/md/jlibまたは%ORACLE_HOME%\md\jlibにあります。)

  8. JDK 6がまだインストールされていない場合は、インストールします。

  9. JAVA_HOME環境変数にJDK 6インストールが指定されていない場合は、適切に定義します。次に例を示します。

    setenv JAVA_HOME /usr/local/packages/jdk16/
    
  10. SPARQLプロトコルをサポートするためのSPARQLサービスが設定されていない場合は、8.2.2項の説明のとおりに設定します。

ソフトウェア環境を設定した後、8.2.3項の説明にあるとおり、セマンティク・テクノロジ環境でSesame Adapterを使用して問合せを実行できることを確認します。

8.2.2 SPARQLサービスの設定

Sesame Adapterを使用してSPARQLエンドポイントを設定するには、クライアント・アプリケーションがHTTPプロトコル経由で通信できるSesame Serverのダウンロードが必要です。Sesame Server (およびOpenRDF Workbench)は、Sesame 2.3.1リリース・パッケージにバンドルされています。この項では、WebLogic Serverにデプロイされるサーブレットを使用して、SPARQLサービスを設定する方法について説明します。Oracleではすべての依存するサードパーティ・ライブラリを.warまたは.earファイルにバンドルすることが許可されていないため、手順が多く複雑になっています。

  1. Oracle WebLogic Server 11gリリース1 (10.3.1)をダウンロードしてインストールします。詳細は、http://www.oracle.com/technology/products/weblogic/を参照してください。

  2. Sesameで必要なため、Java 6がインストールされていることを確認します。

  3. http://sourceforge.net/projects/sesame/files/Sesame%202/からSesame 2.3.1リリース・パッケージ(.zip形式)をダウンロードします。

  4. 一時ディレクトリに.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
    
  5. 8.2.1項の説明にあるとおり、Sesame Adapter for Oracle Databaseがダウンロードされ解凍されていることを確認します。

  6. Sesame_adapterディレクトリと同じレベルにopenrdf-sesame.warという名前のディレクトリを作成し、そのディレクトリに移動します。次に例を示します。

    /tmp/openrdf-sesame.war
    cd /tmp/openrdf-sesame.war
    
  7. 前述の手順で作成したディレクトリに必要なファイルを解凍します。

    cd /tmp/openrdf-sesame.war
    unzip /tmp/sesame/openrdf-sesame-2.3.1/war/openrdf-sesame.war
    
  8. 次のように、必要なファイルをコピーします。(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
    
  9. WebLogic Server管理コンソールを使用し、OracleSemDSという名前のJ2EEデータ・ソースを作成します。データ・ソースの作成中に、SPARQL問合せの実行対象になる関連セマンティク・データを含むデータベース・スキーマのユーザーとパスワードを指定できます。

    このデータ・ソースの作成に関する情報は、8.2.2.1項「WebLogic Serverを使用した必要なデータ・ソースの作成」を参照してください。

  10. 次のように、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つの異なるモード(開発とプロダクション)で実行することはできますが、自動デプロイメント機能を使用できるのは開発モードのみであることに注意してください。

  11. 次の例のとおり、ファイルとディレクトリの構造を確認します。

    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
    
  12. WebLogic Serverを起動または再起動します。

  13. 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つの手順をあらかじめ実行しておく必要があります(その後で、次の手順を行います)。

  1. 次のように、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ドメインの名前です。

  2. 次の例のとおり、ファイルとディレクトリの構造を確認します。

    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
    
  3. WebLogic Serverを起動または再起動します。

  4. Webブラウザを使用して、書式http://<hostname>:7001/openrdf-workbenchのURL (Webアプリケーションはポート7001でデプロイされているとします)に接続し、デプロイメントを確認します。

    OpenRDF WorkbenchロゴのあるWebページが表示されます。左側にある「Repositories」リンクをクリックすると、リポジトリのリストが表示されます。

8.2.2.1 WebLogic Serverを使用した必要なデータ・ソースの作成

WebLogic Server管理コンソールを使用して必要なJ2EEデータ・ソースを作成するには、次の手順に従います。

  1. http://<hostname>:7001/consoleにログインします。

  2. 「ドメイン構造」パネルで、「サービス」をクリックします。

  3. 「JDBC」をクリックします。

  4. 「データ・ソース」をクリックします。

  5. 「JDBCデータ・ソースのサマリー」パネルで、「データ・ソース」表の下の「新規」をクリックします。

  6. 「新しいJDBCデータ・ソースの作成」パネルで、次の値を入力または選択します。

    名前: OracleSemDS

    JNDI名: OracleSemDS

    データベースのタイプ: Oracle

    データベース・ドライバ: Oracle's Driver (Thin) Versions: 9.0.1,9.2.0,10,11

  7. 「次」を2回クリックします。

  8. 「接続プロパティ」パネルで、「データベース名」「ホスト名」「ポート」「データベース・ユーザー名」(セマンティク・データを含むスキーマ)、「パスワード」のフィールドに適切な値を入力します。

  9. 「次」をクリックします。

  10. このOracleSemDSデータ・ソースをデプロイするターゲット・サーバー(1つまたは複数)を選択します。

  11. 「終了」をクリックします。

    すべての変更がアクティブ化されており、再起動は必要ないというメッセージが表示されます。

8.2.2.2 SPARQLサービスの構成

OracleSailStore APIおよびその他の関連APIを使用してセマンティク・モデルを作成し、データを(増分またはバルク)ロードして論理推論を実行できます。

セマンティク・モデルがOracle Databaseに格納された後、Sesame Console (8.9項を参照)を使用してSesame Serverに接続し、Oracleのセマンティク・モデルベースのリポジトリを作成できます。たとえば、LUBMという名前のセマンティク・モデルとOWLPRIMEルールベースを使用する、リポジトリIDがmyOracleReposのリポジトリを作成できます。

この新しく作成されたリポジトリは、Sesame Server上の新しいサービス・エンドポイントを提供します。

8.2.2.3 長時間にわたるSPARQL問合せの終了

一部のアプリケーションでは長時間にわたる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

8.2.3 セマンティク・テクノロジ環境の設定

Sesame Adapterを使用して問合せを実行するには、(適切な権限を持つ)任意のユーザーで接続し、セマンティク・ネットワークで任意のモデルを使用します。セマンティク・テクノロジ環境が要件をすでに満たしている場合は、Sesame Adapterを使用するJavaコードを直接コンパイルして実行できます。Sesame Adapterを使用できるようにセマンティク・テクノロジ環境を設定していない場合は、次の例のような手順を実行します。

  1. SYSDBAロールを持つSYSとして接続します。

    sqlplus sys/<password-for-sys> as sysdba
    
  2. システム表の表領域を作成します。次に例を示します。

    CREATE TABLESPACE rdf_users datafile 'rdf_users01.dbf' 
        size 128M reuse autoextend on next 64M 
        maxsize unlimited segment space management auto;
    
  3. セマンティク・ネットワークを作成します。次に例を示します。

    EXECUTE sem_apis.create_sem_network('RDF_USERS');
    
  4. (セマンティク・ネットワークとSesame Adapterを使用するデータベースに接続するための)データベース・ユーザーを作成します。次に例を示します。

    CREATE USER rdfusr IDENTIFIED BY <password-for-udfusr>
                       DEFAULT TABLESPACE rdf_users;
    
  5. このデータベース・ユーザーに必要な権限を付与します。次に例を示します。

    GRANT connect, resource TO rdfusr;
    
  6. 自身のセマンティク・データとともにSesame Adapterを使用するには、1.10項「セマンティク・データを使用するためのクイック・スタート」の説明のとおり、適切な手順を実行してデータを格納し、モデルを作成して、データベース索引を作成します。その後、Javaコードをコンパイルして実行することで問合せを実行します(問合せの例については、8.10項を参照してください)。

    Sesame Adapterと提供されたサンプル・データを使用する場合は、8.10項を参照してください。

8.3 SEM_MATCHとSesame Adapter問合せの比較

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テーブル・ファンクションにおけるspおよびo列のみではなく)追加の列を読み取り、URI、bNodes、プレーン・リテラル、型付きリテラルおよび長いリテラルを区別します。これによって、Sesame Nodeオブジェクトを適切に作成できるようになります。

  • Oracle Databaseに格納される際にエスケープされる文字をエスケープ解除します。

2つの方法でのもう1つの違いは、空白ノード処理です。

  • SEM_MATCHベースの問合せにおいて、空白ノードは常に定数とみなされます。

  • SPARQL問合せにおいて、<>で囲まれていない空白ノードは、問合せがSesame Adapterを介して実行されるときに変数とみなされます。これは、SPARQL標準セマンティクと一致します。ただし、<>囲まれた空白ノードは、問合せが実行されるときに定数とみなされ、空白ノード・ラベルには、基礎となるデータのモデル化で必要とされる適切な接頭辞が、Sesame Adapterによって追加されます。

Sesame Adapter APIを使用して作成されるセマンティク・モデルの名前の最大長は、22文字です。

8.4 SPARQL問合せ処理の最適化

この項では、SPARQL問合せ処理を強化できる、Sesame Adapterのいくつかのパフォーマンス関連機能について説明します。これらの機能は、デフォルトでは自動的に実行されます。

8.4.1 単一のSEM_MATCHコールへのSPARQL問合せのコンパイル

DISTINCT、OPTIONAL、GRAPH、FILTER、UNION、ORDER BYおよびLIMITを含むSPARQL問合せは、SEM_MATCHテーブル・ファンクションに基づく単一のSQL問合せに変換されます。SPARQLのASK、DESCRIBEおよびCONSTRUCT問合せの場合、Sesame Adapterでは、追加の問合せ変換ロジックと中間層処理が使用されます。

SEM_MATCHに基づくSQL問合せの実行が失敗した場合、Sesame AdapterではSesameの評価戦略を使用してその問合せを実行します。

8.5 最適なパフォーマンスのための推奨事項

Sesame Adapterを使用した問合せのパフォーマンスを改善するための推奨事項は次のとおりです。

  • アプリケーション表での追加の結合の数を減らすため、SPARQL問合せのGRAPH句には、関連するトリプル・パターンのみを記述します。(詳細は、8.5.1項を参照してください。)

  • 名前付きグラフ問合せのGRAPH句内のトリプル・パターンに、NULLバインディングによる変数は使用しません。NULLバインディングは関連するアプリケーション表との結合でいずれの行も一致しないため、このバインディングは削除されます。

  • 前述の理由により、GRAPH句内にOPTIONAL句、またはOPTIONAL句内にGRAPH句は記述しません。

  • アプリケーション表のCONTEXT列(8.5.1項を参照)には、空白ノードを使用しません(これは、2つの異なるセマンティク・モデルの名前付きグラフの空白ノードが同じラベルを持つ場合、これらが同じリソースとみなされてしまうためです)。これは、トリプル内の空白ノードには該当しません(異なるモデルのものは別々に格納されます)。

8.5.1 文の格納とSesame Adapter問合せに対する影響

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句に記述することをお薦めします。

8.6 他の機能をサポートするためのSPARQL構文への追加

Sesame Adapterにより、ヒントや追加の問合せオプションを渡すことができます。問合せオプションを含むOracle固有の名前空間を使用してSPARQL名前空間接頭辞の構文をオーバーロードすることで、これらの機能を実装できます。名前空間の形式はPREFIX ORACLE_SEM_xx_NSであり、xxの部分に機能のタイプ(ヒントならHTAPなら追加の述語など)が表されています。

8.6.1 SQLヒント

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と比較すると、ヒントの指定に若干違いがあることに注意してください。名前空間の値の構文の制限により、t0t1 (または他のヒント・コンポーネント)を区切るには、空白ではなく、カンマ(,)を使用する必要があります。

SQLヒントの使用の詳細は、1.6項「SEM_MATCHテーブル・ファンクションを使用したセマンティク・データの問合せ」、特にoptions属性でのHINT0キーワードに関する資料を参照してください。

8.6.2 追加のWHERE句述語

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'である必要がある問合せに、制限事項が追加されます。

8.6.3 追加の問合せオプション

追加の問合せオプションは、次の形式の行を含む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句内の定数に適用しないでください。)

8.7 サーバー側APIのサポート

この項では、Sesame Adapterによって使用可能になるOracle Databaseのセマンティク・テクノロジ機能の一部について説明します。使用可能な機能をサポートするAPIコールの包括的なドキュメントについては、Sesame Adapterのリファレンス情報(Javadoc)を参照してください。Sesame Adapterによって使用可能になるサーバー側機能の詳細は、このマニュアルの関連する章を参照してください。

8.7.1 仮想モデルのサポート

仮想モデル(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)は、指定されたmodelNameattachmentのために仮想モデルを作成する必要があることを示しています。

8.7.2 接続プーリングのサポート

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();
  }

8.7.3 セマンティク・モデルのPL/SQLインタフェース

Sesame Adapterを介して、複数のセマンティクPL/SQLサブプログラムを使用できます。表8-1に、サブプログラムと、対応するJavaクラスおよびメソッドを示します。

表8-1 PL/SQLサブプログラムと、対応するSesame AdapterのJavaクラスおよびメソッド

PL/SQLサブプログラム 対応するJavaクラスとメソッド

SEM_APIS.DROP_SEM_MODEL


OracleUtils.dropSemanticModel

SEM_APIS.MERGE_MODELS


OracleUtils.mergeModels

SEM_APIS.SWAP_NAMES


OracleUtils.swapNames

SEM_APIS.REMOVE_DUPLICATES


OracleUtils.removeDuplicates

SEM_APIS.RENAME_MODEL


OracleUtils.renameModels


これらのPL/SQLユーティリティ・サブプログラムの詳細は、第9章のリファレンス情報を参照してください。対応するJavaクラスおよびメソッドの詳細は、Sesame AdapterのAPIリファレンス・ドキュメント(Javadoc)を参照してください。

8.7.4 推論オプション

setInferenceOption(String options)プロシージャとOracleSailConnectionオブジェクトを使用して、伴意コールにオプションを追加できます。次の例では、伴意を作成するときに増分推論を有効化し、並列度の値を4に指定します。

conn.setInferenceOption("INC=T,DOP=4");

推論の詳細は、2.2項を参照してください。

8.8 Sesame APIに対するOracle固有の拡張機能

この項では、Sesame Adapter for Oracle DatabaseがSesame SailConnectionおよびSail APIに提供する拡張機能について説明します。

8.8.1 文の一意性

Sesame 2.3.0における文の一意性は、コンテキスト・レベルで強制されます(同じトリプルを単一のコンテキストで2回は使用できません)。Oracle Sesame Adapterでは、そのような一意性がコンテキスト、述語、主語および目的語での一意の索引を介して強制されます。ただし、Sesame Adapterにおける文の一意性は、デフォルトでは有効になっていません。OracleSailStoreオブジェクトを構築するとき、文の一意性のデフォルト値はDONTCAREで、一意の索引がまだ存在していない場合に作成されないことを意味します。

OracleSailStoreコンストラクタ、またはenableUniquenessConstraintメソッドおよびdisableUniquenessConstraintメソッドのいずれかを使用した文の一意性に対する要件は、明示的に有効化することも無効化することもできます。

8.8.2 索引とJena Adapterとの相互運用性

OracleSailStoreオブジェクトに対してDML操作(特に削除)と名前付きグラフ問合せを実行する際に、パフォーマンスを改善するには、アプリケーション表の索引が重要です。新しいOracleSailStoreオブジェクトの作成時に、デフォルトのCPSO索引が作成されます(CPSOは、コンテキスト、述語、主語および目的語の列を表します)。

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);
  }

8.8.3 推論

OracleSailConnection.performInferenceメソッドを使用して推論を実行できます。このメソッドは、ストアを構築するときに添付ファイルで指定されていたモデルおよびルールベースを指定して、OracleSailStoreオブジェクトの伴意を作成します。

伴意の作成の詳細は、1.3.7項「伴意(ルール索引)」を参照してください。

8.8.4 分析操作の実行

大量のセマンティク・データをデータベースにロードした後、推論を実行する前に、アプリケーション表、セマンティク・モデルおよび推論されたグラフ(存在する場合)を分析することを強くお薦めします。分析操作を実行することで統計情報が収集され、問合せの応答時にOracleオプティマイザが効率的な実行計画を選択しやすくなります。

関連する統計情報を収集するには、OracleSailConnectionクラスおよびOracleSailStoreクラスで、次のメソッドを使用します。

  • OracleSailConnection.analyze

  • OracleSailConnection.analyzeApplicationTable

  • OracleSailConnection.analyzeInferredGraph

パラメータを含むこれらのメソッドの詳細は、Sesame Adapterのリファレンス情報(Javadoc)を参照してください。

8.9 Sesame AdapterでのSesame Consoleの使用

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.

パラメータの入力を求められたら、次の項目を指定します。

Repository ID

リポジトリに関連付けられているID文字列。例: myOracleRepos

Repository Title

リポジトリに関連付けられているタイトル文字列。例: My Oracle Repository

Model Name

このリポジトリに対応するOracleセマンティク・モデルの名前。すべてのDML操作は、このモデルに対して実行されます。

Additional Models

このリポジトリに含める追加のセマンティク・モデルのカンマ区切りリスト。推論と問合せの操作にのみ使用される追加のモデル。

Rulebases

このリポジトリの伴意閉包を構築するときに考慮されるルールベースのカンマ区切りリスト。デフォルトではルールベースはなく、推論は実行されません。

Use Virtual Model (TRUE|FALSE) [TRUE]

問合せに応答する際に、仮想モデルを使用するかどうかを指定します。デフォルトはTRUEで、仮想モデルが使用されます。

Virtual Model Name

Use Virtual ModelTRUEの場合、リポジトリを所有するデータベース・ユーザーに、指定された仮想モデルでの読取り権限がある場合は、問合せの応答に使用される仮想モデルの名前を指定します。

Inference Maintenance Mode (NO_UPDATE|UPDATE_WHEN_COMMIT) [NO_UPDATE]

コミット操作ごとに伴意閉包を更新する(UPDATE_WHEN_COMMIT)か、OracleSailConnection.performInferenceメソッドが起動されたときにのみ更新する(NO_UPDATE)かを指定します。デフォルトはNO_UPDATEです。

Allow Duplicates in Query (TRUE|FALSE) [TRUE]

追加のモデルがあるリポジトリを問い合せるときに、問合せのレスポンスに異なるモデルにわたって重複を含めることができるかどうかを指定します。デフォルトはTRUEで、重複を含めることを許可し、問合せのパフォーマンスを高速化します。

Allow Query with Non-Valid Inference status (INVALID|VALID|INCOMPLETE) [INVALID]

伴意が更新されない(つまり、推論ステータスが無効である)場合に問合せを許可するかどうかを指定します。デフォルト値はINVALIDで、この場合、問合せの際の伴意ステータスはINVALIDです。

伴意ステータスが有効な場合にのみ問合せを許可するには、VALIDを指定します。伴意ステータスが有効または不完全な場合に問合せを許可するには、INCOMPLETEを指定します。

Application Table Indexes [CPSO]

このリポジトリのアプリケーション表に作成されるカスタム索引を指定します。C (コンテキスト)、P (プロパティ)、S (主語)、O (目的語)のうち最大4つの文字列を使用して、含める列(およびその順序)を指定できます。(これらの文字のみが使用可能で、どの文字も繰り返して使用できません。)デフォルトはCPSOで、先行列としてコンテキストを持つ4つの列すべてで索引を作成します。

Index Option: Degree of Parallelism [1]

アプリケーション表の索引に対するDOP (並列度)の値を指定します。マルチコアまたはマルチCPUのプロセッサでは、異なるDOP値(4または8など)を試すと、パフォーマンスが向上する場合があります。デフォルトは1 (並列度なし)です。

Index Option: Prefix Length to Compress [2]

アプリケーション表の索引でキー圧縮を使用するかどうかを指定します。デフォルトは2で、最初の2列での圧縮を指定します。値が0 (ゼロ)の場合、圧縮は使用されません。

Enforce Uniqueness (FALSE|TRUE) []

リポジトリ内の複数のコンテキストにわたって文の一意性を強制するかどうかを指定します。文の一意性は、アプリケーション表の一意の索引によって強制されることに注意してください。デフォルトは[] (値は指定されない)で、モデルが存在する場合は、一意性の設定がそのモデルから継承され、モデルが存在しない場合は、一意でない索引が作成されます。

FALSEを指定していて一意の索引が存在する場合、その索引は削除され、一意でない索引として再作成されます。

Data Source Name [OracleSemDS]

このリポジトリの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>

8.10 Sesame Adapterを使用した問合せ例

この項では、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行のコマンドラインに入力します。

問合せを実行するには、次の手順を実行する必要があります。

  1. コードをJavaソース・ファイルに含めます。この項で使用される例は、Sesame Adapterダウンロードのexamplesディレクトリのファイルで提供されています。

  2. Javaソース・ファイルをコンパイルします。次に例を示します。

    > javac -classpath $CP Example1.java
    
  3. コンパイルされたファイルを実行します。次に例を示します。

    > java -classpath $CP Test jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1
    

8.10.1 Example1.java: 基本操作

例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.10.2 Example2.java: データ・ファイルの追加(TriG形式)

例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.10.3 Example3.java: 単純な問合せ

例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.10.4 Example4.java: 単純なバルク・ロード

例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.10.5 Example5.java: RDF/XMLのバルク・ロードとアプリケーション表の索引のメンテナンス

例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.10.6 Example6.java: 不良データのあるロードを処理するためのStatusListenerによるバルク・ロード

例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.7 Example7.java: SesameストアからOracle Databaseへのデータのロード

例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.10.8 Example8.java: SPARQL ASK問合せ

例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.10.9 Example9.java: SPARQL CONSTRUCTおよびSPARQL DESCRIBE

例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.10.10 Example10.java: 推論

例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.10.11 Example11.java: 名前付きグラフ問合せ

例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.10.12 Example12.java: アプリケーション表の索引[高度]

例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.10.13 Example13.java: アプリケーション表の一意性制約[高度]

例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.10.14 Example14.java: 問合せタイムアウトとパラレル実行[高度]

例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.10.15 Example15.java: 一致件数の取得[高度]

例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.10.16 Example16.java: 問合せパターンの定数に対するバインド変数の指定[高度]

例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.10.17 Example17.java: 問合せパターンの異なる位置の定数に対するバインド変数の指定[高度]

例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.10.18 Example18.java: 内部の数値IDからのURIの構築[高度]

例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]