Autonomous Database単体ではSPARQLの実行ができないため、Oracle RDF Graph Serverを導入してみました。マーケットプレースからOracle RDF Graph Serverを導入する方法は、こちらに紹介されています。本記事ではWebサーバーとしてJettyを使いたかったので、マーケットプレースからは導入しませんでした。
Oracle DatabaseのRDFグラフの機能に興味がある方がOracle Cloud Infrastructureに詳しいとは限らないため、基本的な環境の準備方法から紹介します。
Autonomous Databaseの作成
RDFグラフのデータを保持するデータベースを作成します。無料で利用可能なAlways Free枠を使います。
OCIのコンソールより、Autonomous Databaseを開きます。作成済みのAutonomous Databaseの一覧画面より、Autonomous Databaseの作成をクリックします。コンパートメントはルートを選択しています。無料利用枠のアカウントであれば利用できるサービスは限定されているため、コンパートメントを新設してサービスを割り振る必要性はあまりないでしょう。
Autonomous Databaseの作成画面が開きます。
コンパートメントはルート、表示名はAPEXDEV、データベース名もAPEXDEVとしています。表示名やデータベース名は作業に合わせて変更して構いませんが、この後に出てくるAPEXDEVという文字列は、変更した名前に書き直す必要があります。ワークロード・タイプの選択としてデータ・ウェアハウスもしくはトランザクション処理のどちらかを選択できます。JSONおよびAPEXではOracle RDF Graph Serverを使うことはできません。今回はトランザクション処理を選んでいます。Always Free枠を使用するため、デプロイメント・タイプの選択は共有インフラストラクチャになります。
作業用スキーマの作成
VCNの作成
コンピュート・インスタンスの作成
JettyとOracle RDF Graph Serverの準備
jetty-distribution-9.4.44.v20210927.zip、oracle-graph-webapps-21.4.0.zip(ダウンロードする時期によってバージョンの部分は変わります)といったファイルがダウンロードされます。oracle-graph-webapps-21.4.0.zipについてはZIPファイルを展開し、Oracle RDF Graph Serverの実装であるorardf-21.4.0.warを取り出します。
% sftp -i ssh-key-2021-12-07.key opc@150.***.***.168
The authenticity of host '150.***.***.168 (150.***.***.168)' can't be established.
ED25519 key fingerprint is SHA256:P5quBXUaQ+dtv6JtisHrE78wirGmvyu78zl99NHiGzI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '150.***.***.168' (ED25519) to the list of known hosts.
Connected to 150.***.***.168.
sftp> put jetty-distribution-9.4.44.v20210927.zip
Uploading jetty-distribution-9.4.44.v20210927.zip to /home/opc/jetty-distribution-9.4.44.v20210927.zip
jetty-distribution-9.4.44.v20210927.zip 100% 18MB 814.7KB/s 00:23
sftp> put orardf-21.4.0.war
Uploading orardf-21.4.0.war to /home/opc/orardf-21.4.0.war
orardf-21.4.0.war 100% 35MB 1.1MB/s 00:32
sftp> exit
%
Oracle RDF Graph Serverの構成
[opc@rdfgs ~]$ sudo dnf install jdk1.8
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:08:32 ago on Tue Dec 7 04:22:20 2021.
Dependencies resolved.
========================================================================================================================================
Package Architecture Version Repository Size
========================================================================================================================================
Installing:
jdk1.8 x86_64 2000:1.8.0_301-fcs ol8_oci_included 109 M
Transaction Summary
========================================================================================================================================
Install 1 Package
Total download size: 109 M
Installed size: 253 M
Is this ok [y/N]: y
Downloading Packages:
jdk-8u301-linux-x64.rpm 32 MB/s | 109 MB 00:03
----------------------------------------------------------------------------------------------------------------------------------------
Total 32 MB/s | 109 MB 00:03
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : jdk1.8-2000:1.8.0_301-fcs.x86_64 1/1
Running scriptlet: jdk1.8-2000:1.8.0_301-fcs.x86_64 1/1
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
Verifying : jdk1.8-2000:1.8.0_301-fcs.x86_64 1/1
Installed:
jdk1.8-2000:1.8.0_301-fcs.x86_64
Complete!
[opc@rdfgs ~]$
[opc@rdfgs ~]$ cp orardf-21.4.0.war jetty-distribution-9.4.44.v20210927/webapps/orardf.war
[opc@rdfgs ~]$ java -cp jetty-distribution-9.4.44.v20210927/lib/jetty-util-9.4.44.v20210927.jar org.eclipse.jetty.util.security.Password admin admin
2021-12-07 05:23:48.755:INFO::main: Logging initialized @608ms to org.eclipse.jetty.util.log.StdErrLog
admin
OBF:1u2a1toa1w8v1tok1u30
MD5:21232f297a57a5a743894a0e4a801fc3
CRYPT:adpexzg3FUZAk
[opc@rdfgs ~]$
[opc@rdfgs ~]$ mkdir /home/opc/workspace
[opc@rdfgs ~]$ export JAVA_OPTIONS="-Doracle.rdf.workspace.dir=/home/opc/workspace -Dfile.encoding=UTF-8"
[opc@rdfgs ~]$ cd /home/opc/jetty-distribution-9.4.44.v20210927/bin
[opc@rdfgs bin]$ ./jetty.sh start
Starting Jetty: 2021-12-07 04:58:56.615:INFO::main: Logging initialized @2003ms to org.eclipse.jetty.util.log.StdErrLog
2021-12-07 04:58:57.922:WARN:oejs.HomeBaseWarning:main: This instance of Jetty is not running from a separate {jetty.base} directory, this is not recommended. See documentation at https://www.eclipse.org/jetty/documentation/current/startup.html
2021-12-07 04:58:58.217:INFO:oejs.Server:main: jetty-9.4.44.v20210927; built: 2021-09-27T23:02:44.612Z; git: 8da83308eeca865e495e53ef315a249d63ba9332; jvm 1.8.0_301-b09
2021-12-07 04:58:58.325:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:///home/opc/jetty-distribution-9.4.44.v20210927/webapps/] at interval 1
. . . 2021-12-07 04:59:07.421:INFO:oeja.AnnotationConfiguration:main: Scanning elapsed time=3999ms
2021-12-07 04:59:08.614:INFO:oejs.session:main: DefaultSessionIdManager workerName=node0
2021-12-07 04:59:08.614:INFO:oejs.session:main: No SessionScavenger set, using defaults
2021-12-07 04:59:08.615:INFO:oejs.session:main: node0 Scavenging every 600000ms
Dec 07, 2021 4:59:08 AM oracle.graph.rdf.rest.csrf.CSRFTokenUtils setCSRFCookiePath
INFO: Cookie path for CSRF Token set to: /orardf
Dec 07, 2021 4:59:08 AM oracle.graph.rdf.server.ServerInitListener recordWorkspaceInfo
INFO: Configuration folder: /tmp/jetty-0_0_0_0-8080-orardf_war-_orardf-any-2442688635705643790/webapp/WEB-INF/workspace/config
Dec 07, 2021 4:59:08 AM oracle.graph.rdf.server.ServerInitListener recordWorkspaceInfo
INFO: Private folder: /tmp/jetty-0_0_0_0-8080-orardf_war-_orardf-any-2442688635705643790/webapp/WEB-INF/workspace/
Dec 07, 2021 4:59:08 AM oracle.graph.rdf.dataloader.TempFileManager <init>
INFO: Setting temp file manager folder to: /tmp/jetty-0_0_0_0-8080-orardf_war-_orardf-any-2442688635705643790/webapp/WEB-INF/workspace/temp/_uploads
Dec 07, 2021 4:59:08 AM oracle.graph.rdf.server.ServerInitListener getLogManagerConfigurationAsStream
INFO: =======> RDF server log files will be written to: /tmp/jetty-0_0_0_0-8080-orardf_war-_orardf-any-2442688635705643790/webapp/WEB-INF/workspace/logs/RDFserver__C_69e1dd28_rdfgs_sub12070254260_myrdfvcn_oraclevcn_com/
Dec 07, 2021 4:59:09 AM oracle.graph.rdf.server.ServerInitListener initializeLoggingFramework
INFO: ====> RDF server global logging has been initiliazed.
Dec 07, 2021 4:59:09 AM oracle.graph.rdf.server.ServerInitListener contextInitialized
INFO: Application Server: jetty/9.4.44.v20210927
Dec 07, 2021 4:59:09 AM oracle.graph.rdf.server.ServerInitListener contextInitialized
INFO: RDF server workspace directory: /tmp/jetty-0_0_0_0-8080-orardf_war-_orardf-any-2442688635705643790/webapp/WEB-INF/workspace
Dec 07, 2021 4:59:09 AM oracle.graph.rdf.server.ServerInitListener contextInitialized
INFO: RDF server has been initialized
Dec 07, 2021 4:59:10 AM oracle.graph.rdf.rest.RdfApplication initialize
INFO: Initializing the RDF web application ...
. Dec 07, 2021 4:59:11 AM oracle.graph.rdf.rest.RdfApplication initialize
INFO: RDF web application initialization done.
2021-12-07 04:59:14.227:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@5bcea91b{/orardf,file:///tmp/jetty-0_0_0_0-8080-orardf_war-_orardf-any-2442688635705643790/webapp/,AVAILABLE}{/home/opc/jetty-distribution-9.4.44.v20210927/webapps/orardf.war}
2021-12-07 04:59:14.315:INFO:oejs.AbstractConnector:main: Started ServerConnector@1ec7d8b3{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2021-12-07 04:59:14.319:INFO:oejs.Server:main: Started @19708ms
OK Tue Dec 7 04:59:15 GMT 2021
[opc@rdfgs bin]$
ファイアウォールとイングレス・ルールの設定
[opc@rdfgs ~]$ sudo firewall-cmd --add-port=8080/tcp
success
[opc@rdfgs ~]$
[opc@rdfgs ~]$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens3
sources:
services: ssh
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[opc@rdfgs ~]$
[opc@rdfgs ~]$ sudo firewall-cmd --runtime-to-permanent
success
[opc@rdfgs ~]$
次にネットワークの設定として、8080番を宛先とした通信を許可します。
Data Sourceの作成
$ORACLE_HOME/jdkとしてバンドルされているJavaを使用することが前提なので、Javaのバージョンは1.8を使用します。
[opc@rdfgs ~]$ mkdir wallet
[opc@rdfgs ~]$ unzip -d wallet Wallet_APEXDEV.zip
Archive: Wallet_APEXDEV.zip
inflating: wallet/README
inflating: wallet/cwallet.sso
inflating: wallet/tnsnames.ora
inflating: wallet/truststore.jks
inflating: wallet/ojdbc.properties
inflating: wallet/sqlnet.ora
inflating: wallet/ewallet.p12
inflating: wallet/keystore.jks
[opc@rdfgs ~]$ java -cp oraclepki.jar:osdt_cert.jar:osdt_core.jar:cryptoj.jar oracle.security.pki.OracleSecretStoreTextUI -wrl /home/opc/wallet -createCredential apexdev_low APEXDEV **************
Oracle Secret Store Tool Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
Enter wallet password: ********** (ウォレットをダウンロードしたときに指定したパスワード)
[opc@rdfgs ~]$ cd wallet
[opc@rdfgs wallet]$ zip ../wallet.zip *
adding: cwallet.sso (stored 0%)
adding: cwallet.sso.lck (stored 0%)
adding: ewallet.p12 (stored 0%)
adding: ewallet.p12.lck (stored 0%)
adding: keystore.jks (deflated 13%)
adding: ojdbc.properties (deflated 49%)
adding: README (deflated 57%)
adding: sqlnet.ora (deflated 9%)
adding: tnsnames.ora (deflated 84%)
adding: truststore.jks (deflated 27%)
[opc@rdfgs wallet]$