8.3 Oracle RDF Graph Adapter for Eclipse RDF4Jを使用するための設定および構成

Oracle RDF Graph Adapter for Eclipse RDF4Jを使用するには、最初にシステム環境を設定および構成する必要があります。

アダプタは、次の3つの環境で使用できます。

  • Javaコードを使用したプログラムで
  • SPARQLサービスとしてHTTPを介したアクセスで
  • Eclipse RDF4J Workbench環境内で使用

次の項では、前述の環境でEclipse RDF4J用のアダプタを使用するためのアクションについて説明します。

8.3.1 Javaで使用するためのOracle RDF Graph Adapter for Eclipse RDF4Jの設定

Javaコードを介してプログラムでOracle RDF Graph Adapter for Eclipse RDF4Jを使用するには、「Oracle RDF Graph Adapter for Eclipse RDF4Jを使用するための前提条件」の説明に従って、システム環境がすべての前提条件を満たしていることを最初に確認する必要があります。

アダプタを使用してRDFグラフの格納、管理および問合せをOracleデータベースで開始する前に、RDFネットワークを作成する必要があります。RDFネットワークは、データベース・ユーザーが作成した複数のRDFグラフを保持できるフォルダのように機能します。RDFネットワークは、ユーザー・スキーマ(スキーマプライベート・ネットワークと呼ばれます)で作成できます。

ネットワークを作成するには、次のコマンドを実行します。

sem_apis.create_RDF_network(<tablespace_name>, network_owner=><network_owner>, network_name=><network_name>)

詳細は、「RDFネットワーク」を参照してください。

スキーマプライベートRDFネットワークの作成

スキーマプライベートRDFネットワークを作成するには、SQL Developer、SQLPLUSなどのSQLベースのインタフェースから、またはJDBCを使用したJavaプログラムから次のアクションを実行します。
  1. DBA権限があるSYSTEMユーザー(またはAutonomous Database ServerlessではADMINユーザー)としてOracle Databaseに接続します。
    CONNECT system/<password-for-system-user>
  2. ユーザー・データを格納するための表領域を作成します。適切なオペレーティング・システム・フォルダおよびファイル名を使用します。

    Autonomous Database Serverlessを使用している場合は、事前作成されたDATA表領域を使用します。

    CREATE TABLESPACE usertbs 
      DATAFILE 'usertbs.dat'
      SIZE 128M REUSE 
      AUTOEXTEND ON NEXT 64M
      MAXSIZE UNLIMITED 
      SEGMENT SPACE MANAGEMENT AUTO;
  3. データベース・ユーザーを作成して、RDFネットワークを作成および所有します。このユーザーは、このスキーマ・プライベート・ネットワーク内でアダプタを使用して、RDFグラフを作成または使用するか、あるいはその両方を実行できます。
    CREATE USER rdfuser 
      IDENTIFIED BY <password-for-rdfuser>
      DEFAULT TABLESPACE usertbs
      QUOTA 5G ON usertbs;
  4. 必要な権限を新しいデータベース・ユーザーに付与します。
    GRANT CONNECT, RESOURCE, CREATE VIEW TO rdfuser;
  5. rdfuserとしてOracle Databaseに接続します。
    CONNECT rdfuser/<password-for-rdf-user>
  6. NET1という名前のスキーマ・プライベート・RDFネットワークを作成します。
    EXECUTE SEM_APIS.CREATE_RDF_NETWORK(tablespace_name =>'usertbs', network_owner=>'RDFUSER', network_name=>'NET1');
  7. スキーマプライベートRDFネットワークが正常に作成されていることを確認します。
    SELECT table_name 
      FROM sys.all_tables 
      WHERE table_name = 'NET1#RDF_VALUE$' AND owner='RDFUSER';

    ネットワーク所有者のスキーマに<NETWORK_NAME>#RDF_VALUE$表が存在することは、スキーマ・プライベートRDFネットワークが正常に作成されていることを示しています。

    TABLE_NAME
    -----------
    NET1#RDF_VALUE$

これで、次のアクションを実行して、Javaコードで使用するOracle RDF Graph Adapter for Eclipse RDF4Jを設定できます。

  1. RDF4Jのダウンロード・ページからEclipse RDF4Jリリース4.3.14をダウンロードし構成します。
  2. Oracle Software Delivery Cloudから、Eclipse RDF4J (Oracle Adapter for Eclipse RDF4J)用のアダプタをダウンロードします。
  3. ダウンロードしたキット(V1047295-01.zip)を、Linuxシステム上の、/tmp/oracle_adapterなどの一時ディレクトリに解凍します。この一時ディレクトリがまだ作成されていない場合は、解凍操作の前に作成します。
  4. このキットの/jarディレクトリにあるOracle Adapter for Eclipse RDF4J jarファイルをCLASSPATHに含めます。
    • oracle-rdf4j-adapter-4.3.14-20250106.jar
    • sdordf-23.6.0-20241122.jar
    • sdordf-client-23.6.0-20241122.jar
    • sdoutl-23.6.0-20241122.jar
  5. IDEを介してJavaコードを実行するために、次のサポート・ライブラリをCLASSPATHに含めます:
    • eclipse-rdf4j-4.3.14-onejar.jar: このEclipse RDF4J jarライブラリを、RDF4Jのダウンロード・ページからダウンロードします。
    • ojdbc8.jar: 使用しているデータベース・バージョンに対応したこのJDBC Thinドライバを、JDBCダウンロード・ページからダウンロードします。
    • ucp.jar: 使用しているデータベース・バージョンに対応したこのユニバーサル接続プールjarファイルを、JDBCダウンロード・ページからダウンロードします。
    • log4j-api-2.24.2.jarlog4j-core-2.24.2.jarlog4j-slf4j-impl-2.24.2.jarslf4j-api-1.7.36.jarおよびcommons-io-2.14.0.jar: Apache Software Foundationからダウンロードします。
  6. JSON-LDサポートを使用する必要がある場合は、CLASSPATHにさらに次のライブラリを含めます:
    • httpclient-4.5.14.jarhttpclient-cache-4.5.14.jarhttpclient-osgi-4.5.13.jar: Apache Software Foundationからダウンロードします。
    • httpcore-4.4.16.jarhttpcore-nio-4.4.14.jarhttpcore-osgi-4.4.14.jar: Apache Software Foundationからダウンロードします。
    • jackson-annotations-2.13.5.jarjackson-core-2.13.5.jarjackson-databind-2.13.5.jar: GitHubからダウンロードします
    • jsonld-java-0.13.4.jar: GitHubからダウンロードします
    • rdf4j-rio-jsonld-4.3.14.jarrdf4j-rio-rdfjson-4.3.14.jar: RDF4Jのダウンロードからダウンロードします
  7. JDK 11がまだインストールされていない場合はインストールします。
  8. JAVA_HOME環境変数を、JDK 11のインストールを参照するように設定します。次のコマンドを実行して、設定を定義および確認します。
    echo $JAVA_HOME

8.3.2 RDF4J ServerおよびWorkbenchで使用するためのOracle RDF Graph Adapter for Eclipse RDF4Jの設定

この項では、RDF4J ServerおよびRDF4J WorkbenchでのOracle RDF Graph Adapter for Eclipse RDF4Jのインストールおよび構成について説明します。

RDF4J Serverは、RDF4JリポジトリへのHTTPアクセスを提供し、SPARQLエンドポイントとして公開するデータベース管理アプリケーションです。RDF4J Workbenchには、RDF4J Serverのリポジトリを作成、問合せ、更新および検索するためのWebインタフェースが用意されています。

前提条件

次の前提条件が、RDF4J ServerおよびWorkbenchでEclipse RDF4J用のアダプタを使用するように構成されていることを確認します。

  1. Java 11 Runtime Environment
  2. 含めるサポート・ライブラリとして説明したサポート・ライブラリをダウンロードします。
  3. Java Servlet API 4.0およびJava Server Pages (JSP) 2.3以上をサポートするJavaサーブレット・コンテナ。

    ノート:

    この章の例はすべて、最新の安定バージョンのApache Tomcat (9.0.97)で実行されます。
  4. RDF4J Server、RDF4J WorkbenchおよびRDF4J Consoleの標準インストール。詳細は、RDF4J Server and Workbench InstallationおよびRDF4J Console installationを参照してください。
  5. 次の図8-1のドロップダウンに、Oracleがデフォルトのリポジトリとして表示されていないことを確認します。

    図8-1 RDF4J Workbenchのデータ・ソース・リポジトリ

    図8-1の説明が続きます
    「図8-1 RDF4J Workbenchのデータ・ソース・リポジトリ」の説明

    ノート:

    Oracleデータ・ソース・リポジトリがRDF4J Workbenchリポジトリにすでに設定されている場合は、上のドロップダウン・リストに表示されます。

RDF4J WorkbenchでのOracleデータ・ソース・リポジトリの追加

RDF4J WorkbenchでOracleデータ・ソース・リポジトリを追加するには、次のステップを実行する必要があります。

  1. 強調表示されている次のフィールドを更新して、Tomcatメイン$CATALINA_HOME/conf/context.xmlディレクトリのcontext.xmlデータ・ソースを追加します。

    - Using JDBC driver
        <Resource name="jdbc/OracleSemDS" auth="Container"
           driverClassName="oracle.jdbc.OracleDriver"
           factory="oracle.jdbc.pool.OracleDataSourceFactory"
           scope="Shareable"
           type="oracle.jdbc.pool.OracleDataSource"
           user="<<username>>" 
           password="<<pwd>>" 
           url="jdbc:oracle:thin:@<< host:port:sid >>"
           maxActive="100"
           minIdle="15"
           maxIdel="15"
           initialSize="15"
           removeAbandonedTimeout="30"
           validationQuery="select 1 from dual"
        />
    
    - Using UCP
       <Resource name="jdbc/OracleSemDS" auth="Container"
           factory="oracle.ucp.jdbc.PoolDataSourceImpl" 
           type="oracle.ucp.jdbc.PoolDataSource"
           connectionFactoryClassName="oracle.jdbc.pool.OracleDataSource"  
           minPoolSize="15"
           maxPoolSize="100"
           inactiveConnectionTimeout="60"
           abandonedConnectionTimeout="30"
           initialPoolSize="15"
           user="<<username>>" 
           password="<<pwd>>"
           url="jdbc:oracle:thin:@<< host:port:sid >>"   
        />
    
  2. Oracle jdbcおよびucpドライバをTomcatのlibフォルダにコピーします。
    cp -f ojdbc8.jar $CATALINA_HOME/lib
    cp -f ucp.jar $CATALINA_HOME/lib
  3. oracle-rdf4j-adapter-4.3.14-20250106.jarsdordf-23.6.0-20241122.jarsdordf-client-23.6.0-20241122.jarsdoutl-23.6.0-20241122.jarをRDF4J Serverのlibフォルダにコピーします。
    cp -f oracle-rdf4j-adapter-4.3.14-20250106.jar $CATALINA_HOME/webapps/rdf4j-server/WEB-INF/lib
    cp -f sdordf-23.6.0-20241122.jar $CATALINA_HOME/webapps/rdf4j-server/WEB-INF/lib
    cp -f sdordf-client-23.6.0-20241122.jar $CATALINA_HOME/webapps/rdf4j-server/WEB-INF/lib
    cp -f sdoutl-23.6.0-20241122.jar $CATALINA_HOME/webapps/rdf4j-server/WEB-INF/lib
  4. oracle-rdf4j-adapter-4.3.14-20250106.jarsdordf-23.6.0-20241122.jarsdordf-client-23.6.0-20241122.jarsdoutl-23.6.0-20241122.jarをRDF4J Workbenchのlibフォルダにコピーします。
    cp -f oracle-rdf4j-adapter-4.3.14-20250106.jar $CATALINA_HOME/webapps/rdf4j-workbench/WEB-INF/lib
    cp -f sdordf-23.6.0-20241122.jar $CATALINA_HOME/webapps/rdf4j-workbench/WEB-INF/lib
    cp -f sdordf-client-23.6.0-20241122.jar $CATALINA_HOME/webapps/rdf4j-workbench/WEB-INF/lib
    cp -f sdoutl-23.6.0-20241122.jar $CATALINA_HOME/webapps/rdf4j-workbench/WEB-INF/lib
  5. Tomcatの$CATALINA_HOME/webapps/rdf4j-workbench/transformationsフォルダ内に構成ファイルcreate-oracle.xslを作成します。
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:sparql="http://www.w3.org/2005/sparql-results#" 
      xmlns="http://www.w3.org/1999/xhtml">
      <xsl:include href="../locale/messages.xsl" />
      <xsl:variable name="title">
      <xsl:value-of select="$repository-create.title" />
      </xsl:variable>
      <xsl:include href="template.xsl" />
      <xsl:template match="sparql:sparql">
    
        <form action="create" method="post">
          <table class="dataentry">
            <tbody>
              <tr>
                <th>
                  <xsl:value-of select="$repository-type.label" />
                </th>
                <td>
                  <select id="type" name="type">
                    <option value="oracle"> Oracle Sail Store </option>
                  </select>
                </td>
                <td></td>
              </tr>
              <tr>
                <th>
                  <xsl:value-of select="$repository-id.label" />
                </th>
                <td>
                  <input type="text" id="id" name="Repository ID" 
                    size="16" value="native" />
                </td>
                <td></td>
              </tr>
              <tr>
                <th>
                  <xsl:value-of select="$repository-title.label" />
                </th>
                <td>
                  <input type="text" id="title" name="Repository title" size="50"
                    value="Native store" />
                </td>
                <td></td>
              </tr>
              <tr>
                <th> Model Name <strong style="color:Red">*</strong> </th>
                <td>
                  <input type="text" id="oracleSemModelName" name="Model Name" size="50" value="" />
                </td>
                <td></td>
              </tr>
              <tr>
                <th> Network Owner </th>
                <td>
                  <input type="text" id="oracleSemNetworkOwner" name="Network Owner" size="50" value="" />
                </td>
                <td></td>
              </tr>
              <tr>
                <th> Network Name </th>
                <td>
                  <input type="text" id="oracleSemNetworkName" name="Network Name" size="50" value="" />
                </td>
                <td></td>
              </tr>
              <tr>
                <th> DataSource Name </th>
                <td>
                  <input type="text" id="oracleSemDataSourceName" name="DataSource Name" size="30" value="OracleSemDS" />
                </td>
                <td></td>
              </tr>
              <tr>
                <td></td>
                <td>
                  <input type="button" value="{$cancel.label}"
                      style="float:right" data-href="repositories"
                      onclick="document.location.href=this.getAttribute('data-href')" />
                  <input id="create" type="button" value="{$create.label}"
                      onclick="checkOverwrite()" />
                </td>
              </tr>
            </tbody>
          </table>
        </form>
      <script src="../../scripts/create.js" type="text/javascript"></script>
      </xsl:template>
    </xsl:stylesheet>
  6. Tomcatの$CATALINA_HOME/webapps/rdf4j-workbench/transformations変換フォルダ内の構成ファイルcreate.xslを置き換えます。
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [
       <!ENTITY xsd  "http://www.w3.org/2001/XMLSchema#" >
     ]>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:sparql="http://www.w3.org/2005/sparql-results#"
      xmlns="http://www.w3.org/1999/xhtml">
    
      <xsl:include href="../locale/messages.xsl" />
    
      <xsl:variable name="title">
        <xsl:value-of select="$repository-create.title" />
      </xsl:variable>
    
      <xsl:include href="template.xsl" />
    
      <xsl:template match="sparql:sparql">
        <form action="create">
          <table class="dataentry">
            <tbody>
              <tr>
                <th>
                  <xsl:value-of select="$repository-type.label" />
                </th>
                <td>
                  <select id="type" name="type">
                    <option value="memory">
                      Memory Store
                    </option>
                    <option value="memory-lucene">
                      Memory Store + Lucene
                    </option>
                    <option value="memory-rdfs">
                      Memory Store + RDFS
                    </option>
                    <option value="memory-rdfs-dt">
                      Memory Store + RDFS and Direct Type
                    </option>
                    <option value="memory-rdfs-lucene">
                      Memory Store + RDFS and Lucene
                    </option>
                    <option value="memory-customrule">
                      Memory Store + Custom Graph Query Inference
                    </option>
                    <option value="memory-shacl">
                      Memory Store + SHACL
                    </option>
                    <option value="native">
                      Native Store
                    </option>
                    <option value="native-lucene">
                      Native Store + Lucene
                    </option>
                    <option value="native-rdfs">
                      Native Store + RDFS
                    </option>
                    <option value="native-rdfs-dt">
                      Native Store + RDFS and Direct Type
                    </option>
                    <option value="memory-rdfs-lucene">
                      Native Store + RDFS and Lucene
                    </option>
                    <option value="native-customrule">
                      Native Store + Custom Graph Query Inference
                    </option>
                    <option value="native-shacl">
                      Native Store + SHACL
                    </option>
                    <option value="remote">
                      Remote RDF Store
                    </option>
                    <option value="sparql">
                      SPARQL endpoint proxy
                    </option>
                    <option value="federate">Federation</option>
                    <option value="lmdb">LMDB Store</option>
                    <option value="oracle">Oracle</option>
                  </select>
                </td>
                <td></td>
              </tr>
              <tr>
                <th>
                  <xsl:value-of select="$repository-id.label" />
                </th>
                <td>
                  <input type="text" id="id" name="id" size="16" />
                </td>
                <td></td>
              </tr>
              <tr>
                <th>
                  <xsl:value-of select="$repository-title.label" />
                </th>
                <td>
                  <input type="text" id="title" name="title" size="48" />
                </td>
                <td></td>
              </tr>
              <tr>
                <td></td>
                <td>
                  <input type="button" value="{$cancel.label}" style="float:right"
                    data-href="repositories"
                    onclick="document.location.href=this.getAttribute('data-href')" />
                  <input type="submit" name="next" value="{$next.label}" />
                </td>
              </tr>
            </tbody>
          </table>
        </form>
      </xsl:template>
    
    </xsl:stylesheet>
  7. Tomcatを再起動し、https://localhost:8080/rdf4j-workbenchに移動します。

ノート:

構成ファイルcreate-oracle.xslおよびcreate.xslには、「Oracle」という語が含まれています。これは、図8-2のドロップダウンに示されています。

Oracle」は、RDF4J Workbenchのドロップダウン・リストにオプションとして表示されます。

図8-2 RDF4J Workbenchリポジトリ

図8-2の説明が続きます
「図8-2 RDF4J Workbenchリポジトリ」の説明

8.3.2.1 RDF4J Workbenchを介したAdapter for Eclipse RFD4Jの使用

リポジトリの作成および問合せには、RDF4J Workbenchを使用できます。

RDF4J Workbenchには、RDF4J Serverのリポジトリを作成、問合せ、更新および検索するためのWebインタフェースが用意されています。

RDF4J Workbenchを使用した新規リポジトリの作成

  1. ブラウザにURL https://localhost:8080/rdf4j-workbenchを入力して、RDF4J Workbenchを起動します。
  2. サイドバー・メニューで「新規リポジトリ」をクリックし、新規リポジトリの「タイプ」として「Oracle」を選択します。
  3. 次の図に示すように、新しいリポジトリの「ID」「タイトル」を入力し、「次」をクリックします。

    図8-3 RDF4J Workbenchの新規リポジトリ



  4. モデル(RDFグラフ)の詳細を入力し、「作成」をクリックして新規リポジトリを作成します。

    図8-4 RDF4J Workbenchでの新規リポジトリの作成



    新しく作成されたリポジトリのサマリーが次のように表示されます。

    図8-5 RDF4J Workbenchの新規リポジトリのサマリー



    新しく作成したリポジトリは、RDF4J Workbenchのリポジトリのリスト・ページで表示することもできます。

    図8-6 リポジトリのリスト



8.3.3 SPARQLサービスとして使用するためのOracle RDF Graph Adapter for Eclipse RDF4Jの設定

RDF4J Workbenchを介してSPARQLサービスを使用するには、RDF4J ServerおよびWorkbenchで使用するためのOracle RDF Graph Adapter for Eclipse RDF4Jの設定の説明に従って、Eclipse RDF4Jサーバーがインストールされ、Oracleデータ・ソース・リポジトリが構成されていることを確認します。

Eclipse RDF4Jサーバー・インストールで提供されるREST APIは、HTTPプロトコルを使用し、SPARQL 1.1プロトコルのW3C勧告に完全準拠した実装をカバーします。これにより、RDF4Jサーバーは標準に完全準拠したSPARQLエンドポイントとして機能します。この機能の詳細は、The RDF4J REST APIを参照してください。

次の項では、使用例を示します。

8.3.3.1 Eclipse RDF4J WorkbenchでのAdapter Over SPARQLエンドポイントの使用

この項では、Eclipse RDF4J Workbenchで提供されるSPARQLエンドポイントを介してEclipse RDF4J用のアダプタを使用する例をいくつか説明します。

例8-2 SPARQL更新を実行するリクエスト

次の例では、HTTP POSTを使用していくつかの単純なトリプルを挿入します。ファイルsparql_update.rqの内容は次のようになっているとします。

PREFIX ex: <http://example.oracle.com/>
INSERT DATA {
  ex:a ex:value "A" .
  ex:b ex:value "B" .
}

その後、次のようにcurlコマンドライン・ツールを使用して、前述のSPARQL更新を実行できます。

curl -X POST --data-binary "@sparql_update.rq" \
-H "Content-Type: application/sparql-update" \
"http://localhost:8080/rdf4j-server/repositories/MyRDFRepo/statements"

例8-3 HTTP GETを使用したSPARQL問合せの実行リクエスト

このcurlの例は、HTTP GETを使用してSPARQL問合せを実行します。

curl -X GET -H "Accept: application/sparql-results+json" \
"http://localhost:8080/rdf4j-server/repositories/MyRDFRepo?query=SELECT%20%3Fs%20%3Fp%20%3Fo%0AWHERE%20%7B%20%3Fs%20%3Fp%20%3Fo%20%7D%0ALIMIT%2010"

前のSPARQL更新の例が空のリポジトリで実行された場合、このRESTリクエストは次のレスポンスを返すはずです。

{
  "head" : {
    "vars" : [
      "s",
      "p",
      "o"
    ]
  },
  "results" : {
    "bindings" : [
      {
        "p" : {
          "type" : "uri",
          "value" : "http://example.oracle.com/value"
        },
        "s" : {
          "type" : "uri",
          "value" : "http://example.oracle.com/b"
        },
        "o" : {
          "type" : "literal",
          "value" : "B"
        }
      },
      {
        "p" : {
          "type" : "uri",
          "value" : "http://example.oracle.com/value"
        },
        "s" : {
          "type" : "uri",
          "value" : "http://example.oracle.com/a"
        },
        "o" : {
          "type" : "literal",
          "value" : "A"
        }
      }
    ]
  }
}