プライマリ・コンテンツに移動
Oracle® Spatial and Graph RDFセマンティック・グラフ開発者ガイド
12cリリース1 (12.1)
B72469-07
目次へ移動
目次
索引へ移動
索引

前
次

8 RDF Semantic Graph support for OpenRDF Sesame

注意:

この機能は、以前はSesame Adapter for Oracle DatabaseまたはSesame Adapterと呼ばれていました。

RDF Semantic Graph support for OpenRDF Sesame (以降、support for Sesameとも記載)は、一般的なSesame Java APIをOracle Spatial and Graph RDF Semantic Graphサポートに統合します。Sesameは「RDFデータの処理とハンドリングのための強力なJavaフレームワークで、これには、これらのデータの作成、解析、保存、推論、問合せが含まれます。」(http://rdf4j.orgを参照)。

「RDFセマンティク・グラフの概要」「OWLの概要」で説明されている主要な概念について十分に理解していることが前提です。また、Sasame Javeフレームワークの全般的な機能と使用法を十分に理解していることも前提となります。詳細は、http://rdf4j.orgの文書リンクをクリックしてください。

RDF Semantic Graph support for OpenRDF Sesameは、Oracle Database RDF/OWLのセマンティク・データ管理機能を拡張します。

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

8.1 RDF Semantic Graph Support for OpenRDF Sesameの概要

RDF Semantic Graph support for Apache Jena (「RDF Semantic Graph Support for Apache Jena」を参照)と同じように、support for Sesameは、オープン・ソース・フレームワークと関連ツールを通じてOracleセマンティク・データに対するJavaベースのインタフェースを提供します。ただし、RDF Semantic Graph support for OpenRDF Sesameでは、データにコンテキストのサポートが追加されています。

  • Jena文では、トリプル(主語、述語、目的語)を処理します。

  • Sesame文では、トリプルとコンテキストを処理します(Sesame文は、トリプルとコンテキストで構成されるクワッドです)。たとえば、病院の患者データの場合、コンテキストには患者のURIが含まれます。

RDF Semantic Graph support for OpenRDF Sesameには、Oracle Databaseに格納されたセマンティク・データと対話するためのJava APIが用意されています。また、次のとおりSesameツールを包括的に提供します。

  • Sesame Server (HTTP SPARQLエンドポイントを提供します)。

  • Sesame Console (リポジトリの作成と管理を行うためのコマンドライン・ツールです)。使用可能なコマンドには次のものがあります。

    connect  Connects to a (local or remote) set of repositories
    disconnect  Disconnects from the current set of repositories
    create  Creates a new repository
    drop  Drops a repository
    open  Opens a repository to work on, takes a repository ID as argument
    close  Closes the current repository
    show  Displays an overview of various resources
    load  Loads a data file into a repository, takes a file path or URL as argument
    verify  Verifies the syntax of an RDF data file, takes a file path or URL as argument
    clear  Removes data from a repository
    serql  Evaluates the SeRQL query, takes a query as argument
    sparql  Evaluates the SPARQL query, takes a query as argument
    set  Allows various console parameters to be set
    exit, quit  Exits the console
    
  • OpenRDF Workbench (Sesame Serverへのグラフィカル・ユーザー・インタフェースです)。

support for Sesameによって提供される機能を次に示します。

  • (コンテキスト付きおよびコンテキストなしの)文のロード(バルクおよび増分)、エクスポートおよび削除

  • (コンテキスト付きおよびコンテキストなしの)データの問合せ

  • 推論。推論データは(includeInferred=true場合)問合せ実行中に考慮され、推論トリプルのコンテキストはNULLです。

  • 名前空間の管理

RDF Semantic Graph support for OpenRDF Sesameは、Sesame Storage and Inference Layer (SAIL) APIの様々なインタフェースを実装しています。たとえばクラスOracleSailConnectionは、Sesame SailConnectionインタフェースのOracle実装で、クラスOracleSailStoreはSesame SailインタフェースのOracle実装です。

support for Sesameの一般的な使用フローを、例8-1に抜粋して示します。

例8-1 RDF Semantic Graph support for OpenRDF Sesameの使用フロー例

String query =
" PREFIX foaf: <http://xmlns.com/foaf/0.1/> "
" PREFIX dc: <http://purl.org/dc/elements/1.1/> "
" select ?s ?p ?o ?name WHERE {?s ?p ?o . OPTIONAL {?o foaf:name ?name .} } ";

SailRepository sr = new SailRepository(
   new OracleSailStore(oracle, modelName,…attachmentForInference));
RepositoryConnection repConn = sr.getConnection();
// Data loading can happen here.
repConn.add(alice, friendOf, bob, context1);
 
TupleQuery tq = repConn.prepareTupleQuery(QueryLanguage.SPARQL, query);
TupleQueryResult tqr = tq.evaluate();
while(tqr.hasNext()) {
    psOut.print((tqr.next().toString()));
};
tqr.close()
repConn.close();
sr.shutDown();

8.2 RDF Semantic Graph support for OpenRDF Sesameの設定と構成

support for Sesameを設定および構成するには、次の手順を実行します。

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

  2. SPARQLサービスの設定

  3. RDFセマンティク・グラフ環境の設定

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

support for Sesameを使用するには、システム環境に必要なソフトウェア(Oracle Database 11gリリース2以上に加えて、Spatial、GraphおよびPartitioningのオプション、RDFセマンティク・グラフのサポート、Sesameバージョン2.3.1、RDF Semantic Graph support for OpenRDF SesameおよびJDK 6以上)があることを、最初に確認しておく必要があります。次の手順を実行することによって、ソフトウェア環境を設定できます。

  1. Oracle Database Enterprise Editionと、Oracle Spatial and GraphオプションおよびOracle Partitioningオプションをインストールします。
  2. 「RDFセマンティク・グラフ・サポートの有効化」の説明に従い、RDFセマンティク・グラフ・サポートを有効にします。
  3. ユーザー・ガイドの「Sesameライブラリを使用するための設定」の章で説明しているように、Sesame 2.3.1 onejarライブラリをダウンロードし、クラスパスに含めます。
  4. ユーザー・ガイドの「サーバー・ソフトウェアのインストール」の章の説明に従って、Sesame 2.3.1 Serverをインストールします。
  5. RDFセマンティク・グラフ・ページ(http://www.oracle.com/technetwork/database/options/semantic-tech/「Downloads」をクリック)からRDF Semantic Graph support for OpenRDF Sesameをダウンロードして、(Linuxシステムの)/tmp/sesame_adapterなどの一時ディレクトリに解凍します。(この一時ディレクトリがまだ作成されていない場合は、解凍操作の前に作成します。)

    RDF Semantic Graph support for OpenRDF Sesameのディレクトリとファイルの構造は、次のとおりです。

     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サービスが設定されていない場合は、「SPARQLサービスの設定」の説明のとおりに準備します。

ソフトウェア環境を設定した後、「 RDFセマンティク・グラフ環境の設定」の説明にあるとおり、RDFセマンティク・グラフ環境でsupport for Sesameを使用して問合せを実行できることを確認します。

8.2.2 SPARQLサービスの設定

support for Sesameを使用して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)をダウンロードしてインストールします。

  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. 「ソフトウェア環境の設定」の説明にあるとおり、RDF Semantic Graph support for OpenRDF Sesameがダウンロードされ解凍されていることを確認します。

  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のホーム・ディレクトリを指しているとします。)

    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問合せの実行対象になる関連セマンティク・データを含むデータベース・スキーマのユーザーとパスワードを指定できます。

    このデータ・ソースの作成に関する情報は、「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レスポンスに、support for Sesame問合せ管理サーブレットによる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データ・ソースの作成」パネルで、次の値を入力または選択します。

    名前: OracleSemDSOracleSemDS

    JNDI名: OracleSemDS

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

    データベース・ドライバ: Oracleのドライバ(Thin)・バージョン: 9.0.1,9.2.0,10,11

  7. 「次へ」を2回クリックします。
  8. 「接続プロパティ」パネルで、「データベース名」「ホスト名」「ポート」「データベース・ユーザー名」(セマンティク・データを含むスキーマ)、「パスワード」のフィールドに適切な値を入力します。
  9. 「次へ」をクリックします。
  10. このOracleSemDSデータソースをデプロイするターゲット・サーバーまたはサーバーを選択します。
  11. 「終了」をクリックします。

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

8.2.2.2 SPARQLサービスの構成

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

セマンティク・モデルがOracle Databaseに格納された後、Sesame Console (「RDF Semantic Graph support for OpenRDF SesameによるSesame Consoleの使用」参照)を使用してSesame Serverに接続し、Oracleのセマンティク・モデル・ベースのリポジトリを作成することができます。たとえば、リポジトリIDmyOracleReposのリポジトリを作成し、これにはLUBMという名前のセマンティク・モデルとOWLPRIMEルールベースを使用するとします。

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

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

一部のアプリケーションでは長時間にわたるSPARQL問合せを終了できるようにする必要があるため、RDF Semantic Graph support for OpenRDF SesameとSesame Serverの設定で強制終了のフレームワークが導入されています。基本的に、実行に時間がかかりそうな問合せに対しては、各々に一意の問合せID (qid)値を指定する必要があります。

たとえば、次のSPARQL問合せでは、すべてのトリプルの主語を選択します。リクエストに応じてこの問合せを終了できるように、問合せID (qid)が設定されます。

PREFIX ORACLE_SEM_FS_NS:  <http://example.com/semtech#qid=8761>
SELECT ?subject WHERE {?subject ?property ?object }

qid属性値は、長整数型です。qidの値は、独自のアプリケーション・ニーズに基づき、特定の問合せに合わせて選択することができます。

qid値とともに送信されたSPARQL問合せを終了するには、アプリケーションから次の形式で強制終了リクエストをサーブレットに送信し、一致するQID値を指定します。

http://<hostname>:7001/openrdf-sesame/querymgt?abortqid=8761

8.2.3 RDFセマンティク・グラフ環境の設定

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

  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. (セマンティク・ネットワークとsupport for Sesameを使用するデータベースに接続するための)データベース・ユーザーを作成します。たとえば、次のようにします。
    CREATE USER rdfusr IDENTIFIED BY <password-for-udfusr>
                       DEFAULT TABLESPACE rdf_users;
    
  5. このデータベース・ユーザーに必要な権限を付与します。たとえば、次のようにします。
    GRANT connect, resource TO rdfusr;
    
  6. 自身のセマンティク・データとともにsupport for Sesameを使用するには、「セマンティク・データの使用に関するクイック・スタート」の説明のとおり、適切な手順を実行してデータを格納し、モデルとデータベース索引を作成します。その後に、Javaコードをコンパイルして実行することで問合せを実行します。問合せの例については、「RDF Semantic Graph support for OpenRDF Sesameを使用する問合せ例」を参照してください。

    support for Sesameと提供されたサンプル・データの使用については、「RDF Semantic Graph support for OpenRDF Sesameを使用する問合せ例」を参照してください。

8.3 SEM_MATCHおよびRDF Semantic Graph support for OpenRDF Sesameの問合せの比較

Oracle Databaseに格納されているセマンティク・データを問い合せる方法は2つあります。SEM_MATCHベースのSQL文とRDF Semantic Graph support for OpenRDF Sesameを介したSPARQL問合せです。それぞれの方法での問合せは、表面的には類似していますが、動作には重要な違いがあります。アプリケーションの動作を一貫性のあるものにするには、SEM_MATCH問合せとSPARQL問合せの違いを理解し、その問合せ結果を処理する際に注意が必要です。

2つの方法を次の簡単な例で示します。

問合せ1 (SEM_MATCHベース)

select s, p, o
    from table(sem_match('{?s ?p ?o}', sem_models('Test_Model'), ....))

問合せ2 (RDF Semantic Graph support for OpenRDF Sesameを介したSPARQL問合せ)

select ?s ?p ?o
where {?s ?p ?o}

これらの2つの問合せは、同じ種類の機能を実行しますが、いくつか重要な違いがあります。問合せ1 (SEM_MATCHベース)は次のようになります。

  • Test_Modelからすべてのトリプルを読み取ります。

  • URI、bNode、プレーン・リテラルおよび型付きリテラルを区別せず、長いリテラルを処理しません。

  • 特定の文字('\n'など)はエスケープ解除しません。

問合せ2 (RDF Semantic Graph support for OpenRDF Sesameを介して実行されるSPARQL問合せ)もTest_Modelからすべてのトリプルを読み取ります(同じ基礎となるTest_Modelを参照しているModelOracleSemに対してコールを実行したと想定します)。ただし、問合せ2は次のようになります。

  • (SEM_MATCH表関数による、spおよびo列のみではなく)追加の列を読み取り、URI、bNodes、プレーン・リテラル、型付きリテラルおよび長いリテラルを区別します。これによって、Sesame Nodeオブジェクトを適切に作成できるようになります。

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

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

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

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

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

8.4 SPARQL問合せ処理の最適化

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

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

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

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

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

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

  • アプリケーション表での追加の結合の数を減らすため、SPARQL問合せのGRAPH句には、関連するトリプル・パターンのみを記述します。(説明は、「文の格納とRDF Semantic Graph Support for OpenRDF Sesameの問合せ文への影響」を参照)

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

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

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

8.5.1 文の格納とRDF Semantic Graph Support for OpenRDF Sesame問合せへの影響

MDSYS.SEMM_model-nameビュー(「モデルのメタデータ」表1-2を参照)には、グラフ名または各モデルのコンテキストの列がないため、これらの2つの情報は、そのOracleセマンティク・モデル内に格納されません。この情報は、ユーザーのアプリケーション表のCONTEXT列に保持されます。

セマンティク・ネットワーク内に存在しないモデル名を使用したOracleSailStoreオブジェクトが初めて作成されると、自動的に新しいアプリケーション表が作成されて、次の列が格納されます。

  • TRIPLE(タイプSDO_RDF_TRIPLE_S)

  • CONTEXT(タイプVARCHAR2)

その後、指定されたモデル名を持つセマンティク・モデルが作成されます。名前付きグラフ問合せと文指向操作のパフォーマンスを強化するため、デフォルトの索引がアプリケーション表に作成され、この索引が、TRIPLE列のトリプルの主語、述語および目的語のフィールドの3つの数値ID属性と同様にCONTEXT列(先行列)も処理します。

SPARQL問合せがセマンティク・モデルに対して実行されたとき、問合せが名前付きグラフを使用しない(GRAPH句を含まない)場合、生成されたSQL文はそのモデルのアプリケーション表を使用しません。ただし、その問合せにGRAPH句がある場合、生成されたSQL文は、SEM_MATCHベースの副問合せとそのモデルのアプリケーション表を結合し、関連するコンテキストまたは名前付きグラフまで結果を調べます。アプリケーション表との結合の数は、GRAPH句にあるトリプル・パターンの数によって異なるため、アプリケーション表との追加の結合の数を減らすには、関連するトリプル・パターンのみをGRAPH句に記述することをお薦めします。

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

RDF Semantic Graph support for OpenRDF Sesameでは、ヒントと追加の問合せオプションを渡すことができます。問合せオプションを含む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ヒントの使用に関する詳細は、「SEM_MATCH表関数を使用したセマンティク・データの問合せ」を、特にoptions属性でのHINT0キーワードに関する資料を参照してください。

8.6.2 追加のWHERE句述語

SEM_MATCH filter属性に、WHEREキーワードのないWHERE句の形式の文字列として、追加の選択基準を指定することができます。次の形式の1行を含めることで、追加のWHERE句述語をSEM_MATCH問合せに渡すことができます。

PREFIX ORACLE_SEM_AP_NS: <http://oracle.com/semtech#pred>

predは、問合せに追加されるWHERE句の内容を反映します。次に例を示します。

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ORACLE_SEM_AP_NS:<http://www.oracle.com/semtech#label$RDFLANG='fr'>  
SELECT DISTINCT ?inst ?label
  WHERE { ?inst a <http://someCLass>. ?inst rdfs:label ?label . }
  ORDER BY (?label) LIMIT 20

この例では、ラベル変数の言語形式が'fr'である必要がある問合せに、制限事項が追加されます。

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のサポート

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

8.7.1 仮想モデルのサポート

仮想モデル(「仮想モデル」を参照)は、OracleSailStoreコンストラクタで指定され、透過的に処理されます。仮想モデルがモデルとルールベースの組合せのために存在している場合には、問合せの応答に使用されます。そのような仮想モデルが存在しない場合には、データベースに作成されます。

注意:

RDF Semantic Graph support for OpenRDF Sesameを介した仮想モデルのサポートは、Oracle Databaseリリース11.2以上でのみ使用可能です。

次の例では、既存の仮想モデルを再利用します。

public void vm(String jdbcUrl, 
                        String user, 
                        String password, 
                        String model,                              
                        PrintStream psOut) 
{
String m1 = "TEST_1";
String m2 = "TEST_2";
OraclePool op = new OraclePool(
    OraclePool.getOracleDataSource(jdbcUrl, user, password));
    	
// create the attachment semantic model in case it doesn't exist 
// (constructor handles it)
OracleSailStore store = new OracleSailStore(op, m1);
store.shutDown();
		
store= new OracleSailStore(op, m2);
store.shutDown();
 
String vmName = "VM_" + m1;
 
// create a virtual model with name vmName that will be used in the 
// OracleSailStore
Oracle oracle = op.getOracle();
oracle.executeCall(
"begin sem_apis.create_virtual_model(?,sem_models(?,?), null); end;", 
 vmName, m1, m2);
op.returnOracle(oracle);
 
 String[] modelNames = {m2};
 String[] rulebaseNames = {};
 
 Attachment attachment = Attachment.createInstance(modelNames,
 rulebaseNames); 
 
    store = new OracleSailStore(op, m1, attachment, vmName);
 
OracleSailConnection conn = store.getConnection();
conn.clear();
conn.addStatement(
        store.getValueFactory().createURI("http://a1"), 
        store.getValueFactory().createURI("http://p1"), 
        store.getValueFactory().createURI("http://b1"));
   
CloseableIteration res = conn.getStatements(null, null, null, false);
while (res.hasNext()) {
  Statement stmt = (Statement) res.next();
  System.out.println(stmt);
}    
conn.close();
store.shutDown();
}

また、次の例のように、OracleSailStoreコンストラクタを使用して仮想モデルを作成することもできます。

OracleSailStore store = new OracleSailStore(oracle, modelName, attachment, true);

この例で、4つ目のパラメータ(true)は、指定されたmodelNameattachmentのために仮想モデルを作成する必要があることを示しています。

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

Oracle Database接続プーリングは、RDF Semantic Graph support for OpenRDF SesameのOraclePoolクラスを介して提供されます。通常、OraclePoolはOraclePool (DataSource ods)を使用してDataSourceで初期化されています。この場合、OraclePoolはデータソースの接続プーリング機能を使用しながらDataSourceの拡張ラッパーとして動作します。OracleSailStoreオブジェクトを作成するときには、storeコンストラクタ内にOraclePoolオブジェクトを作成するだけで十分です。続けて、support for Sesameによりデータベース接続が自動的に制御されるようになります。

明示的にOracle接続オブジェクト(基本的にデータベース接続ラッパーである)を取得する必要がある場合は、OraclePool.getOracleメソッドを起動します。接続を終了した後は、OraclePool.returnOracleメソッドを起動して、接続プールにオブジェクトを戻します。

OraclePoolは、OracleConnectionオブジェクトで初期化することもできます。この場合、このOraclePoolを参照するときに単一のデータベース接続のみが使用されます。複数のSesame SailConnectionオブジェクトが同じデータベース接続を使用することになるため、異なるSailConnectionオブジェクトにわたるダーティな読取りが起こり得ることを認識しておく必要があります。

OraclePoolの使用方法の詳細は、RDF Semantic Graph support for OpenRDF SesameのAPIリファレンス情報(Javadoc)を参照してください。

次の例では、2つの初期接続によるOraclePoolクラスを使用してOracleSailStoreオブジェクトを設定します。

public void op(String jdbcUrl, 
                 String user, 
                 String password, 
                 String model,                              
                 PrintStream psOut)
  throws Exception
  {          
    // test with connection properties 
    java.util.Properties prop = new java.util.Properties();
    prop.setProperty("MinLimit", "2");     // the cache size is 2 at least 
    prop.setProperty("MaxLimit", "10");
    prop.setProperty("InitialLimit", "2"); // create 2 connections at startup
    prop.setProperty("InactivityTimeout", "1800");    //  seconds
    prop.setProperty("AbandonedConnectionTimeout", "900");  //  seconds
    prop.setProperty("MaxStatementsLimit", "10");
    prop.setProperty("PropertyCheckInterval", "60"); // seconds
 
    System.out.println("Creating Data Source");
    OracleDataSource ods = 
OraclePool.getOracleDataSource(jdbcUrl, user, password,
        prop, "OracleSemConnPool");
    System.out.println("Done creating Data Source");
    
    OraclePool op = new OraclePool(ods);
 
    // create an OracleSailStore with the OraclePool
    OracleSailStore store = new OracleSailStore(op, model);
    store.shutDown();
    op.close();
    ods.close();
  }

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

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

表8-1 PL/SQLサブプログラムと対応するsupport for Sesameの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ユーティリティ・サブプログラムの詳細は、「SEM_APISパッケージのサブプログラム」のリファレンス情報を参照してください。対応するJavaクラスとメソッドの詳細は、RDF Semantic Graph support for OpenRDF SesameのAPIリファレンス・ドキュメント(Javadoc)を参照してください。

8.7.4 推論オプション

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

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

推論の詳細は、「OWL推論の使用方法」を参照してください。

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

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

8.8.1 文の一意性

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

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

8.8.2 RDF Semantic Graph Support for Apache Jenaでの索引と相互運用性

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

RDF Semantic Graph support for OpenRDF SesameとRDF Semantic Graph support for Apache Jenaを使用して作成されるOracleセマンティク・モデルの間には、格納にいくつかの相違があります。たとえば、デフォルトのアプリケーション表索引がsupport for Apache Jenaでは異なります。RDF Semantic Graph support for Apache JenaモデルのデータにRDF Semantic Graph support for OpenRDF Sesameからアクセスするには(または逆の操作を行うには)、OracleUtils.migrateFromJenaメソッドとOracleUtils.migrateToJenaメソッドを使用します。これらのメソッドは、基礎となる記憶域構造に変更を行っている間、セマンティク・データを保持します。特に、RDF Semantic Graph support for OpenRDF SesameからRDF Semantic Graph support for Apache Jenaに移行すると、またはその逆に移行すると、すべてのトリプルはコンテキスト情報と一緒に保存されます。

例8-2に、RDF Semantic Graph support for OpenRDF SesameとRDF Semantic Graph support for Apache Jenaを使用して作成されたモデル間の移行を示します。

例8-2 RDF Semantic Graph support for Apache JenaモデルとRDF Semantic Graph support for OpenRDF Sesameモデルの間での移行

public void migrate(String jdbcUrl, 
                         String user, 
                         String password, 
                         String model,                                
                         PrintStream psOut)
  throws Exception
  {
    OraclePool oraclePool= new OraclePool(
        OraclePool.getOracleDataSource(jdbcUrl, user, password));
       
    OracleSailStore store = new OracleSailStore(oraclePool, model);
    
    OracleSailConnection conn = store.getConnection();
    conn.clear();
    
    // create a statement and add it to the store
    URI subject = 
store.getValueFactory().createURI("http://example.org/foo");
    URI object = store.getValueFactory().createURI("http://example.org/bar");
    URI ngURI = store.getValueFactory().createURI("http://example.org/bar");
  
    conn.addStatement(subject, RDF.TYPE, object, ngURI);
    conn.commit();    
    
    // convert it to a jena model    
    OracleUtils.migrateToJena(oraclePool, model);    
 
    Oracle newOra = oraclePool.getOracle();
    oracle.spatial.rdf.client.jena.Oracle ora =
      new oracle.spatial.rdf.client.jena.Oracle(newOra.getConnection());
    
    GraphOracleSem graph = new GraphOracleSem(ora, model);
   
    // check size of jena graph
    System.out.print("GraphOracleSem size:" + graph.getSize());
    
    store.shutDown();
    
    // now convert it back to an Oracle sailstore.
    OracleUtils.migrateFromJena(oraclePool, model);
    conn = store.getConnection();   
 
    // check overall store size
    System.out.println("Size of store :" +conn.size());
    // check context size, should be 1
    System.out.println("Size of context " + ngURI + ":" + conn.size(ngURI));
    store.shutDown();
    ora.dispose();
    oraclePool.returnOracle(newOra);
  }

8.8.3 推論

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

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

8.8.4 分析操作の実行

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

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

  • OracleSailConnection.analyze

  • OracleSailConnection.analyzeApplicationTable

  • OracleSailConnection.analyzeInferredGraph

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

8.9 RDF Semantic Graph support for OpenRDF SesameによるSesame Consoleの使用

OpenRDF.orgの説明のとおり、Sesame Consoleは、Sesameと対話するためのコマンドライン・アプリケーションです。現時点で、SYSTEMリポジトリにリポジトリを作成し、管理するための最適な方法は、Sesame Consoleを使用することです。Sesame Consoleに関する基本的な使用方法とリファレンス情報については、http://docs.rdf4j.org/のドキュメントを参照してください。

この項では、RDF Semantic Graph support for OpenRDF SesameでSesame Consoleを使用する方法について説明します。

Sesame Consoleコマンドライン・ツールを使用して、新たにSAILリポジトリ(OracleSailStoreオブジェクト)を作成するには、次のコマンドを使用します。

create oracle.

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

リポジトリID

リポジトリに対応するID文字列。例: myOracleRepos

リポジトリタイトル

リポジトリに対応するタイトル・文字列。例: My Oracle Repository

モデル名

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

追加のモデル

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

ルールベース

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

仮想モデルの使用(TRUE|FALSE) [TRUE]

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

仮想モデル名

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

推論メンテナンスモード(NO_UPDATE|UPDATE_WHEN_COMMIT) [NO_UPDATE]

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

問合せの重複を許可+(TRUE|FALSE) [TRUE]

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

無効な推論ステータスでの問合せを許可(INVALID|VALID|INCOMPLETE) [INVALID]

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

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

アプリケーション表索引[CPSO]

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

索引オプション: 並列度[1]

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

索引オプション: 圧縮する接頭辞長[2]

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

一意性を強制(FALSE|TRUE) []

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

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

データソース名[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 RDF Semantic Graph support for OpenRDF Sesameを使用する問合せ例

この項では、RDF Semantic Graph support for OpenRDF Sesameを使用した問合せの例を示します。それぞれの例は個々に完結しており、通常はOraclePoolオブジェクトから始めて、OracleSailStoreオブジェクトを作成し、文の追加および削除、推論を含む問合せの実行、結果の表示、OracleSailStoreオブジェクトの停止およびOraclePoolオブジェクトの終了を行います。

これらの例では、次のライブラリをCLASSPATH定義に含めておく必要があります。

sesame-console-2.3.1.jar
sesame-http-client-2.3.1.jar
sesame-http-protocol-2.3.1.jar
sesame-http-server-spring-2.3.1.jar
sesame-model-2.3.1.jar
sesame-query-2.3.1.jar
sesame-queryalgebra-evaluation-2.3.1.jar
sesame-queryalgebra-model-2.3.1.jar
sesame-queryparser-api-2.3.1.jar
sesame-queryparser-serql-2.3.1.jar
sesame-queryparser-sparql-2.3.1.jar
sesame-queryresultio-api-2.3.1.jar
sesame-queryresultio-binary-2.3.1.jar
sesame-queryresultio-sparqljson-2.3.1.jar
sesame-queryresultio-sparqlxml-2.3.1.jar
sesame-queryresultio-text-2.3.1.jar
sesame-repository-api-2.3.1.jar
sesame-repository-contextaware-2.3.1.jar
sesame-repository-dataset-2.3.1.jar
sesame-repository-event-2.3.1.jar
sesame-repository-http-2.3.1.jar
sesame-repository-manager-2.3.1.jar
sesame-repository-sail-2.3.1.jar
sesame-rio-api-2.3.1.jar
sesame-rio-n3-2.3.1.jar
sesame-rio-ntriples-2.3.1.jar
sesame-rio-rdfxml-2.3.1.jar
sesame-rio-trig-2.3.1.jar
sesame-rio-trix-2.3.1.jar
sesame-rio-turtle-2.3.1.jar
sesame-runtime-2.3.1.jar
sesame-sail-api-2.3.1.jar
sesame-sail-inferencer-2.3.1.jar
sesame-sail-memory-2.3.1.jar
sesame-sail-nativerdf-2.3.1.jar
sesame-sail-rdbms-2.3.1.jar
sdordf.jar
sdordfsesame.jar
ojdbc6.jar

例を簡略化するため、次のようにCPという環境変数が定義されています。

setenv CP ./:sesame-console-2.3.1.jar:sesame-http-client-2.3.1.jar:sesame-http-protocol-2.3.1.jar:sesame-http-server-spring-2.3.1.jar:sesame-model-2.3.1.jar:sesame-query-2.3.1.jar:sesame-queryalgebra-evaluation-2.3.1.jar:sesame-queryalgebra-model-2.3.1.jar:sesame-queryparser-api-2.3.1.jar:sesame-queryparser-serql-2.3.1.jar:sesame-queryparser-sparql-2.3.1.jar:sesame-queryresultio-api-2.3.1.jar:sesame-queryresultio-binary-2.3.1.jar:sesame-queryresultio-sparqljson-2.3.1.jar:sesame-queryresultio-sparqlxml-2.3.1.jar:sesame-queryresultio-text-2.3.1.jar:sesame-repository-api-2.3.1.jar:sesame-repository-contextaware-2.3.1.jar:sesame-repository-dataset-2.3.1.jar:sesame-repository-event-2.3.1.jar:sesame-repository-http-2.3.1.jar:sesame-repository-manager-2.3.1.jar:sesame-repository-sail-2.3.1.jar:sesame-rio-api-2.3.1.jar:sesame-rio-n3-2.3.1.jar:sesame-rio-ntriples-2.3.1.jar:sesame-rio-rdfxml-2.3.1.jar:sesame-rio-trig-2.3.1.jar:sesame-rio-trix-2.3.1.jar:sesame-rio-turtle-2.3.1.jar:sesame-runtime-2.3.1.jar:sesame-sail-api-2.3.1.jar:sesame-sail-inferencer-2.3.1.jar:sesame-sail-memory-2.3.1.jar:sesame-sail-nativerdf-2.3.1.jar:sesame-sail-rdbms-2.3.1.jar:sdordf.jar:sdordfsesame.jar:ojdbc6.jar

注意:

javacコマンドおよびjavaコマンドと同様、setenvコマンドは、1行のコマンドラインに入力します。

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

  1. コードをJavaソース・ファイルに含めます。この項で使用される例は、RDF Semantic Graph support for OpenRDF Sesameダウンロードの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に、アプリケーション表の索引を無効にし、RDFファイルからXML形式でバルク・ロード操作を実行した後に索引を再度有効にする、Example5.javaファイルを示します。

例8-8 RDF/XMLのバルク・ロードとアプリケーション表の索引のメンテナンス

import org.openrdf.model.Statement;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.model.Resource;
import info.aduna.iteration.CloseableIteration;
 
import java.io.*;
import java.sql.SQLException;
 
import oracle.spatial.rdf.client.sesame.*;
import org.openrdf.rio.RDFFormat;
import org.openrdf.sail.SailConnection;
import org.openrdf.sail.SailException;
import org.openrdf.model.vocabulary.RDFS;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.repository.RepositoryException;
import org.openrdf.rio.RDFParseException;
import org.openrdf.model.Literal;
import org.openrdf.query.BindingSet;
import org.openrdf.query.QueryLanguage;
import org.openrdf.query.TupleQuery;
import org.openrdf.query.TupleQueryResult;
import org.openrdf.model.vocabulary.RDF;
import org.openrdf.query.QueryEvaluationException;
import org.openrdf.query.MalformedQueryException;
 
public class Example5
{
  public static void main(String[] args) throws SQLException, SailException,
    RepositoryException, IOException, RDFParseException, QueryEvaluationException,
    MalformedQueryException
  {
    PrintStream psOut = System.out;
    String jdbcUrl  = args[0];
    String user     = args[1];
    String password = args[2];
    String model    = args[3];
    String filename = args[4]; // RDF/XML
 
    OraclePool op = new OraclePool(OraclePool.getOracleDataSource(jdbcUrl, user, password));
 
    psOut.println("testBulkLoad: start");
 
    OracleSailStore store = new OracleSailStore(op, model);
    OracleSailConnection osc = store.getConnection();
 
    // disable indexes on application table
    store.disableAllAppTabIndexes();
 
    // NOTE: can be a gzipped file!
    FileInputStream fis = new FileInputStream(filename);
   
    long loadBegin = System.currentTimeMillis();
    osc.getBulkUpdateHandler().addInBulk(
        fis,
        "http://abc",                // baseURI
        RDFFormat.RDFXML,            // dataFormat
        null,                        // tablespaceName
        null,                        // flags
        null,                        // StatusListener
        (Resource[]) null            // Resource... for contexts
        );
 
    long loadEnd = System.currentTimeMillis();
    psOut.println("testBulkLoad: " + (loadEnd - loadBegin) + "ms.\n");
   
    // enable indexes on application table
    // Note: one can also specify to rebuild indexes in parallel.
    store.enableAllAppTabIndexes();
 
    osc.close();
    store.shutDown();
    op.close();
  }
}

この例をコンパイルするには、次のコマンドを入力します。

usr/local/packages/jdk16/bin/javac -classpath $CP Example5.java

この例を実行するために、次のようなサンプル・ファイルがtest.rdfxmlという名前で作成されているとします。

<?xml version="1.0"?>
<!DOCTYPE owl [
     <!ENTITY owl  "http://www.w3.org/2002/07/owl#" >
     <!ENTITY xsd  "http://www.w3.org/2001/XMLSchema#" >
   ]>
 
<rdf:RDF
  xmlns     = "http://a/b#" xml:base  = "http://a/b#" xmlns:my  = "http://a/b#"
  xmlns:owl = "http://www.w3.org/2002/07/owl#"
  xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:rdfs= "http://www.w3.org/2000/01/rdf-schema#"
  xmlns:xsd = "http://www.w3.org/2001/XMLSchema#">
  <owl:Class rdf:ID="Color">
    <owl:oneOf rdf:parseType="Collection">
      <owl:Thing rdf:ID="Red"/>
      <owl:Thing rdf:ID="Blue"/>
    </owl:oneOf>
  </owl:Class>
</rdf:RDF>

test.rdfxmlファイルを使用してこの例を実行するには、次のコマンドを入力します。

/usr/local/packages/jdk16/bin/java -classpath $CP Example5 jdbc:oracle:thin:@localhost:1521:ORCL scott  <password>  EX5 ./test.rdfxml

javaコマンドの出力は、次のようになります。

testBulkLoad: start
testBulkLoad: 825ms

8.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

この例を実行するために、「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と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

この例を実行するために、「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に、問合せタイムアウトとパラレル実行(TIMEOUTDOPオプション)を指定する高度な例の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]