7.16 RDF Graph Support for Apache Jenaを使用する問合せの例
この項では、support for Apache Jenaを使用した問合せの例を示します。それぞれの例は個々に完結しており、通常はモデルの作成、トリプルの作成、推論を含む可能性のある問合せの実行、結果の表示およびRDFグラフの削除を行います。
問合せの例では、次を実行します。
- URLによるオントロジの参照、およびローカル・ファイルからオントロジをバルク・ロードする方法の両方によって、universityオントロジの例で表明されたトリプルと表明に加えて推論されたトリプルをカウントします。
- familyオントロジを使用して複数のSPARQL問合せを実行します(LIMIT、OFFSET、TIMEOUT、DOP (並列度)、ASK、DESCRIBE、CONSTRUCT、GRAPH、ALLOW_DUP (複数のモデルによる重複トリプル)、SPARUL (データの挿入)などの機能が含まれます)。
- ARQ組込み関数を使用します。
- SELECTキャスト問合せを使用します。
- OracleConnectionを使用してOracle Databaseをインスタンス化します。
- Oracle Database接続プーリングを使用します。
問合せを実行するには、次の手順を実行する必要があります。
-
コードをJavaソース・ファイルに含めます。この項で使用される例は、support for Apache Jenaダウンロードの
examples
ディレクトリのファイルで提供されています。 -
Javaソース・ファイルをコンパイルします。たとえば、次のようにします。
> javac -classpath ../jar/'*' Test.java
ノート:
javac
コマンドとjava
コマンドは、それぞれ1行のコマンドである必要があります。 -
コンパイルされたファイルを実行します。たとえば、次のようにします。
java -classpath ./:../jar/'*' Test jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> TestModel NET1
- 家族関係の問合せ
- OWLオントロジをロードし、OWLPrime推論を実行する
- OWLオントロジをバルク・ロードし、OWLPrime推論を実行する
- SPARQL OPTIONAL問合せ
- SPARQL問合せでのLIMITおよびOFFSETの使用
- SPARQL問合せでのTIMEOUTおよびDOPの使用
- 名前付きグラフを含む問合せ
- SPARQL ASK問合せ
- SPARQL DESCRIBE問合せ
- SPARQL CONSTRUCT問合せ
- 複数のモデルを問い合せて「重複の許可」を指定する
- SPARQLの更新
- SPARQL問合せでのARQ組込み関数の使用
- SELECTキャスト問合せ
- OracleConnectionを使用したOracle Databaseのインスタンス化
- Oracle Database接続プーリング
7.16.1 家族関係の問合せ
例7-17 家族関係を問い合せる
次の例は、JohnがMaryの父であることを指定し、次に、各fatherOf
関係で主語と目的語を選択して表示します。
import oracle.spatial.rdf.client.jena.*;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.graph.*;
import org.apache.jena.query.*;
public class Test_privnet {
public static void main(String[] args) throws Exception
{
String szJdbcURL = args[0];
String szUser = args[1];
String szPasswd = args[2];
String szModelName = args[3];
String szNetworkName = args[4];
Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd);
Model model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName);
model.getGraph().add(Triple.create(
NodeFactory.createURI("http://example.com/John"),
NodeFactory.createURI("http://example.com/fatherOf"),
NodeFactory.createURI("http://example.com/Mary")));
Query query = QueryFactory.create(
"select ?f ?k WHERE {?f <http://example.com/fatherOf> ?k .}");
QueryExecution qexec = QueryExecutionFactory.create(query, model);
ResultSet results = qexec.execSelect();
ResultSetFormatter.out(System.out, results, query);
model.close();
oracle.dispose();
}
}
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test_privnet.java
java -classpath ./:../jar/'*' Test_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
---------------------------------------------------------
| f | k |
=========================================================
| <http://example.com/John> | <http://example.com/Mary> |
---------------------------------------------------------
7.16.2 OWLオントロジのロードとOWLPrime推論の実行
次の例は、OWLオントロジをロードして、OWLPrime推論を実行します。OWLオントロジがRDF/XML形式であり、Oracleにロードされた後にN-triple形式でシリアライズされることに注意してください。また、表明および推論されたトリプルの数を問い合せます。
この例のオントロジはhttp://swat.cse.lehigh.edu/onto/univ-bench.owl
から入手することができます。そこには、ロール、リソースおよび大学環境での関係が記述されています。
例7-18 OWLオントロジをロードし、OWLPrime推論を実行する
import java.io.*; import org.apache.jena.query.*; import org.apache.jena.rdf.model.Model; import org.apache.jena.util.FileManager; import oracle.spatial.rdf.client.jena.*; public class Test6_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); Model model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); // load UNIV ontology InputStream in = FileManager.get().open("./univ-bench.owl" ); model.read(in, null); OutputStream os = new FileOutputStream("./univ-bench.nt"); model.write(os, "N-TRIPLE"); os.close(); String queryString = " SELECT ?subject ?prop ?object WHERE { ?subject ?prop ?object } "; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; try { int iTriplesCount = 0; ResultSet results = qexec.execSelect() ; for ( ; results.hasNext() ; ) { QuerySolution soln = results.nextSolution() ; iTriplesCount++; } System.out.println("Asserted triples count: " + iTriplesCount); } finally { qexec.close() ; } Attachment attachment = Attachment.createInstance( new String[] {}, "OWLPRIME", InferenceMaintenanceMode.NO_UPDATE, QueryOptions.DEFAULT); GraphOracleSem graph = new GraphOracleSem(oracle, szModelName, attachment, szUser, szNetworkName); graph.analyze(); graph.performInference(); query = QueryFactory.create(queryString) ; qexec = QueryExecutionFactory.create(query,new ModelOracleSem(graph)) ; try { int iTriplesCount = 0; ResultSet results = qexec.execSelect() ; for ( ; results.hasNext() ; ) { QuerySolution soln = results.nextSolution() ; iTriplesCount++; } System.out.println("Asserted + Infered triples count: " + iTriplesCount); } finally { qexec.close() ; } OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test6_privnet.java
java -classpath ./:../jar/'*' Test6_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
Asserted triples count: 293
Asserted + Infered triples count: 340
この出力には、以前のバージョンのLUBMオントロジが反映されていることに注意してください。最新バージョンのオントロジには、より多くのトリプルがあります。
7.16.3 OWLオントロジのバルク・ロードとOWLPrime推論の実行
次の例では、例7-18と同じOWLオントロジがロードされますが、バルク・ローダーの使用によりローカル・ファイルに保存されます。オントロジは増分およびバッチ・ローダーを使用してロードすることもでき、例にはこれらの2つの方法も示されています。
例7-19 OWLオントロジをバルク・ロードし、OWLPrime推論を実行する
import java.io.*; import org.apache.jena.query.*; import org.apache.jena.graph.*; import org.apache.jena.rdf.model.*; import org.apache.jena.util.*; import oracle.spatial.rdf.client.jena.*; public class Test7_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; // in memory Jena Model Model model = ModelFactory.createDefaultModel(); InputStream is = FileManager.get().open("./univ-bench.owl"); model.read(is, "", "RDF/XML"); is.close(); Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem modelDest = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = modelDest.getGraph(); g.dropApplicationTableIndex(); int method = 2; // try bulk loader String tbs = "SYSAUX"; // can be customized if (method == 0) { System.out.println("start incremental"); modelDest.add(model); System.out.println("end size " + modelDest.size()); } else if (method == 1) { System.out.println("start batch load"); g.getBulkUpdateHandler().addInBatch( GraphUtil.findAll(model.getGraph()), tbs); System.out.println("end size " + modelDest.size()); } else { System.out.println("start bulk load"); g.getBulkUpdateHandler().addInBulk( GraphUtil.findAll(model.getGraph()), tbs); System.out.println("end size " + modelDest.size()); } g.rebuildApplicationTableIndex(); long lCount = g.getCount(Triple.ANY); System.out.println("Asserted triples count: " + lCount); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test7_privnet.java
java -classpath ./:../jar/'*' Test7_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
start bulk load
end size 293
Asserted triples count: 293
この出力には、以前のバージョンのLUBMオントロジが反映されていることに注意してください。最新バージョンのオントロジには、より多くのトリプルがあります。
7.16.4 SPARQL OPTIONAL問合せ
次の例は、SPARQL OPTIONAL問合せを示しています。次の条件を持つトリプルを挿入します。
- Johnは、Maryの親です。
- Johnは、Jackの親です。
- Maryは、Jillの親です。
次に親子関係を見つけ、必要に応じて孫(gkid)の関係も含めます。
例7-20 SPARQLのOPTIONAL問合せ
import java.io.*; import org.apache.jena.query.*; import org.apache.jena.rdf.model.Model; import org.apache.jena.util.FileManager; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.graph.*; public class Test8_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String networkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, networkName); GraphOracleSem g = model.getGraph(); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Mary"))); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); g.add(Triple.create( NodeFactory.createURI("u:Mary"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jill"))); String queryString = " SELECT ?s ?o ?gkid WHERE { ?s <u:parentOf> ?o . OPTIONAL {?o <u:parentOf> ?gkid }} "; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; try { ResultSet results = qexec.execSelect() ; ResultSetFormatter.out(System.out, results, query); } finally { qexec.close() ; } OracleUtils.dropSemanticModel(oracle, szModelName, szUser, networkName); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test8_privnet.java
java -classpath ./:../jar/'*' Test8_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
----------------------------------
| s | o | gkid |
==================================
| <u:John> | <u:Mary> | <u:Jill> |
| <u:Mary> | <u:Jill> | |
| <u:John> | <u:Jack> | |
----------------------------------
7.16.5 SPARQL問合せでのLIMITおよびOFFSETの使用
次の例は、SPARQL問合せでのLIMITおよびOFFSETの使用を示しています。次の条件を持つトリプルを挿入します。
- Johnは、Maryの親です。
- Johnは、Jackの親です。
- Maryは、Jillの親です。
次に1つの親子関係(LIMIT 1)を検出し、出現した最初の2つの親子関係をスキップ(OFFSET 2)し、必要に応じて、検出された孫(gkid)の関係を含めます。
例7-21 SPARQL問合せでのLIMITおよびOFFSETの使用
import java.io.*; import org.apache.jena.query.*; import org.apache.jena.rdf.model.Model; import org.apache.jena.util.FileManager; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.graph.*; public class Test9_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = model.getGraph(); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Mary"))); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); g.add(Triple.create( NodeFactory.createURI("u:Mary"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jill"))); String queryString = " SELECT ?s ?o ?gkid WHERE { ?s <u:parentOf> ?o . OPTIONAL {?o <u:parentOf> ?gkid }} " + " LIMIT 1 OFFSET 2"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; try { ResultSet results = qexec.execSelect() ; ResultSetFormatter.out(System.out, results, query); } finally { qexec.close() ; } OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test9_privnet.java
java -classpath ./:../jar/'*' Test9_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
------------------------------
| s | o | gkid |
==============================
| <u:John> | <u:Jack> | |
------------------------------
7.16.6 SPARQL問合せでのTIMEOUTおよびDOPの使用
次の例は、例7-21のSPARQL問合せに、タイムアウト設定(TIMEOUT=1、秒)およびパラレル実行設定(DOP=4)などの機能を追加した例を示しています。
例7-22 SPARQL問合せでのTIMEOUTおよびDOPの使用
import org.apache.jena.query.*; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.graph.*; public class Test10_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = model.getGraph(); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Mary"))); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); g.add(Triple.create( NodeFactory.createURI("u:Mary"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jill"))); String queryString = " PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#dop=4,timeout=1> " + " SELECT ?s ?o ?gkid WHERE { ?s <u:parentOf> ?o . OPTIONAL {?o <u:parentOf> ?gkid }} " + " LIMIT 1 OFFSET 2"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; try { ResultSet results = qexec.execSelect() ; ResultSetFormatter.out(System.out, results, query); } finally { qexec.close() ; } OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test10_privnet.java
java -classpath ./:../jar/'*' Test10_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
------------------------------
| s | o | gkid |
==============================
| <u:John> | <u:Jack> | |
------------------------------
7.16.7 名前付きグラフを含む問合せ
foaf:mbox
述語を使用して各名前付きグラフのメールボックスの値を確認できます。
例7-23 名前付きグラフ・ベースの問合せ
import org.apache.jena.query.*; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.graph.*; public class Test11_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); Dataset ds = DatasetFactory.create(); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); model.getGraph().add(Triple.create(NodeFactory.createURI("http://example.org/bob"), NodeFactory.createURI("http://purl.org/dc/elements/1.1/publisher"), NodeFactory.createLiteral("Bob Hacker"))); model.getGraph().add(Triple.create(NodeFactory.createURI("http://example.org/alice"), NodeFactory.createURI("http://purl.org/dc/elements/1.1/publisher"), NodeFactory.createLiteral("alice Hacker"))); ModelOracleSem model1 = ModelOracleSem.createOracleSemModel(oracle, szModelName+"1", szUser, szNetworkName); model1.getGraph().add(Triple.create(NodeFactory.createURI("urn:bob"), NodeFactory.createURI("http://xmlns.com/foaf/0.1/name"), NodeFactory.createLiteral("Bob") )); model1.getGraph().add(Triple.create(NodeFactory.createURI("urn:bob"), NodeFactory.createURI("http://xmlns.com/foaf/0.1/mbox"), NodeFactory.createURI("mailto:bob@example") )); ModelOracleSem model2 = ModelOracleSem.createOracleSemModel(oracle, szModelName+"2", szUser, szNetworkName); model2.getGraph().add(Triple.create(NodeFactory.createURI("urn:alice"), NodeFactory.createURI("http://xmlns.com/foaf/0.1/name"), NodeFactory.createLiteral("Alice") )); model2.getGraph().add(Triple.create(NodeFactory.createURI("urn:alice"), NodeFactory.createURI("http://xmlns.com/foaf/0.1/mbox"), NodeFactory.createURI("mailto:alice@example") )); ds.setDefaultModel(model); ds.addNamedModel("http://example.org/bob",model1); ds.addNamedModel("http://example.org/alice",model2); String queryString = " PREFIX foaf: <http://xmlns.com/foaf/0.1/> " + " PREFIX dc: <http://purl.org/dc/elements/1.1/> " + " SELECT ?who ?graph ?mbox " + " FROM NAMED <http://example.org/alice> " + " FROM NAMED <http://example.org/bob> " + " WHERE " + " { " + " ?graph dc:publisher ?who . " + " GRAPH ?graph { ?x foaf:mbox ?mbox } " + " } "; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, ds) ; ResultSet results = qexec.execSelect() ; ResultSetFormatter.out(System.out, results, query); qexec.close(); model.close(); model1.close(); model2.close(); OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); OracleUtils.dropSemanticModel(oracle, szModelName + "1", szUser, szNetworkName); OracleUtils.dropSemanticModel(oracle, szModelName + "2", szUser, szNetworkName); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ./:./jena-2.6.4.jar:./sdordfclient.jar:./ojdbc6.jar:./slf4j-api-1.5.8.jar:./slf4j-log4j12-1.5.8.jar:./arq-2.8.8.jar:./xercesImpl-2.7.1.jar Test11_privnet.java java -classpath ./:../jar/'*' Test11_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1 ------------------------------------------------------------------------ | who | graph | mbox | ======================================================================== | "alice Hacker" | <http://example.org/alice> | <mailto:alice@example> | | "Bob Hacker" | <http://example.org/bob> | <mailto:bob@example> | ------------------------------------------------------------------------
7.16.8 SPARQL ASK問合せ
次の例は、SPARQL ASK問合せを示しています。JohnがMaryの親であるという条件のトリプルを挿入します。次にJohnがMaryの親かどうかを確認します。
例7-24 SPARQLのASK問合せ
import org.apache.jena.query.*; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.graph.*; public class Test12_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = model.getGraph(); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Mary"))); String queryString = " ASK { <u:John> <u:parentOf> <u:Mary> } "; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; boolean b = qexec.execAsk(); System.out.println("ask result = " + ((b)?"TRUE":"FALSE")); qexec.close() ; OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test12_privnet.java
java -classpath ./:../jar/'*' Test12_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
ask result = TRUE
7.16.9 SPARQL DESCRIBE問合せ
次の例は、SPARQL DESCRIBE問合せを示しています。次の条件を持つトリプルを挿入します。
- Johnは、Maryの親です。
- Johnは、Jackの親です。
- Amyは、Jackの親です。
次に、Jackの親を含むすべての関係を検出します。
例7-25 SPARQLのDESCRIBE問合せ
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
import org.apache.jena.query.*; import org.apache.jena.rdf.model.Model; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.graph.*; public class Test13_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = model.getGraph(); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Mary"))); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); g.add(Triple.create( NodeFactory.createURI("u:Amy"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); String queryString = " DESCRIBE ?x WHERE {?x <u:parentOf> <u:Jack>}"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; Model m = qexec.execDescribe(); System.out.println("describe result = " + m.toString()); qexec.close() ; OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test13_privnet.java
java -classpath ./:../jar/'*' Test13_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
describe result = <ModelCom {u:Amy @u:parentOf u:Jack;
u:John @u:parentOf u:Jack; u:John @u:parentOf u:Mary} | [u:Amy, u:parentOf, u:Jack] [u:John, u:parentOf,
u:Jack] [u:John, u:parentOf, u:Mary]>
7.16.10 SPARQL CONSTRUCT問合せ
次の例は、SPARQL CONSTRUCT問合せを示しています。次の条件を持つトリプルを挿入します。
- Johnは、Maryの親です。
- Johnは、Jackの親です。
- Amyは、Jackの親です。
- それぞれの親は、自分の子どもを愛しています。
次に、誰が誰を愛しているかについての情報でRDFグラフを構築します。
例7-26 SPARQLのCONSTRUCT問合せ
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
import org.apache.jena.query.*; import org.apache.jena.rdf.model.Model; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.graph.*; public class Test14_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = model.getGraph(); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Mary"))); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); g.add(Triple.create( NodeFactory.createURI("u:Amy"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); String queryString = " CONSTRUCT { ?s <u:loves> ?o } WHERE {?s <u:parentOf> ?o}"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; Model m = qexec.execConstruct(); System.out.println("Construct result = " + m.toString()); qexec.close() ; OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test14_privnet.java
java -classpath ./:../jar/'*' Test14_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
Construct result = <ModelCom {u:Amy @u:loves u:Jack;
u:John @u:loves u:Jack; u:John @u:loves u:Mary} | [u:Amy, u:loves, u:Jack] [u:John, u:loves,
u:Jack] [u:John, u:loves, u:Mary]>
7.16.11 複数のモデルの問合せと「重複の許可」の指定
次の例は、複数のモデルを問い合せて「重複の許可」オプションを使用します。次の条件を持つトリプルを挿入します。
- Johnは、Jackの親です(モデル1)
- Maryは、Jackの親です(モデル2)
- それぞれの親は、自分の子どもを愛しています。
次に、誰が誰を愛しているかについて検出します。両方のモデルを検索し、モデルでの重複トリプルを(この例に重複はありませんが)許可します。
例7-27 複数のモデルを問い合せて重複の許可を指定する
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
import org.apache.jena.query.*; import org.apache.jena.rdf.model.Model; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.graph.*; public class Test15_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName1 = args[3]; String szModelName2 = args[4]; String szNetworkName = args[5]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model1 = ModelOracleSem.createOracleSemModel(oracle, szModelName1, szUser, szNetworkName); model1.getGraph().add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); model1.close(); ModelOracleSem model2 = ModelOracleSem.createOracleSemModel(oracle, szModelName2, szUser, szNetworkName); model2.getGraph().add(Triple.create( NodeFactory.createURI("u:Mary"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); model2.close(); String[] modelNamesList = {szModelName2}; String[] rulebasesList = {}; Attachment attachment = Attachment.createInstance(modelNamesList, rulebasesList, InferenceMaintenanceMode.NO_UPDATE, QueryOptions.ALLOW_QUERY_VALID_AND_DUP); GraphOracleSem graph = new GraphOracleSem(oracle, szModelName1, attachment, szUser, szNetworkName); ModelOracleSem model = new ModelOracleSem(graph); String queryString = " CONSTRUCT { ?s <u:loves> ?o } WHERE {?s <u:parentOf> ?o}"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; Model m = qexec.execConstruct(); System.out.println("Construct result = " + m.toString()); qexec.close() ; model.close(); OracleUtils.dropSemanticModel(oracle, szModelName1, szUser, szNetworkName); OracleUtils.dropSemanticModel(oracle, szModelName2, szUser, szNetworkName); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test15_privnet.java
java -classpath ./:../jar/'*' Test15_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 M2 NET1
Construct result = <ModelCom {u:Mary @u:loves u:Jack; u:John @u:loves u:Jack} | [u:Mary, u:loves, u:Jack] [u:John, u:loves, u:Jack]>
7.16.12 SPARQLの更新
次の例では、2つのトリプルをモデルに挿入します。
例7-28 SPARQLの更新
import org.apache.jena.util.iterator.*; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.graph.*; import org.apache.jena.update.*; public class Test16_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = model.getGraph(); String insertString = " PREFIX dc: <http://purl.org/dc/elements/1.1/> " + " INSERT DATA " + " { <http://example/book3> dc:title \"A new book\" ; " + " dc:creator \"A.N.Other\" . " + " } "; UpdateAction.parseExecute(insertString, model); ExtendedIterator<Triple> ei = GraphUtil.findAll(g); while (ei.hasNext()) { System.out.println("Triple " + ei.next().toString()); } OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test16_privnet.java
java -classpath ./:../jar/'*' Test16_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
Triple http://example/book3 @dc:title "A new book"
Triple http://example/book3 @dc:creator "A.N.Other"
7.16.13 SPARQL問合せでのARQ組込み関数の使用
次の例では、2冊の本に関するデータを挿入し、本のタイトル(すべて大文字)と、各タイトル文字列の長さを表示します。
例7-29 SPARQL問合せでのARQ組込み関数の使用
import org.apache.jena.query.*; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.update.*; public class Test17_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = model.getGraph(); String insertString = " PREFIX dc: <http://purl.org/dc/elements/1.1/> " + " INSERT DATA " + " { <http://example/book3> dc:title \"A new book\" ; " + " dc:creator \"A.N.Other\" . " + " <http://example/book4> dc:title \"Semantic Web Rocks\" ; " + " dc:creator \"TB\" . " + " } "; UpdateAction.parseExecute(insertString, model); String queryString = "PREFIX dc: <http://purl.org/dc/elements/1.1/> " + " PREFIX fn: <http://www.w3.org/2005/xpath-functions#> " + " SELECT ?subject (fn:upper-case(?object) as ?object1) (fn:string-length(?object) as ?strlen) " + "WHERE { ?subject dc:title ?object } " ; Query query = QueryFactory.create(queryString, Syntax.syntaxARQ); QueryExecution qexec = QueryExecutionFactory.create(query, model); ResultSet results = qexec.execSelect(); ResultSetFormatter.out(System.out, results, query); model.close(); OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test17_privnet.java
java -classpath ./:../jar/'*' Test17_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
----------------------------------------------------------
| subject | object1 | strlen |
==========================================================
| <http://example/book3> | "A NEW BOOK" | 10 |
| <http://example/book4> | "SEMANTIC WEB ROCKS" | 18 |
----------------------------------------------------------
7.16.14 SELECTキャスト問合せ
次の例では、2つの華氏温度(18.1と32.0)を摂氏温度に変換します。
例7-30 SELECTキャスト問合せ
import org.apache.jena.query.*; import oracle.spatial.rdf.client.jena.*; import org.apache.jena.update.*; public class Test18_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = model.getGraph(); String insertString = " PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> " + " INSERT DATA " + " { <u:Object1> <u:temp> \"18.1\"^^xsd:float ; " + " <u:name> \"Foo... \" . " + " <u:Object2> <u:temp> \"32.0\"^^xsd:float ; " + " <u:name> \"Bar... \" . " + " } "; UpdateAction.parseExecute(insertString, model); String queryString = " PREFIX fn: <http://www.w3.org/2005/xpath-functions#> " + " SELECT ?subject ((?temp - 32.0)*5/9 as ?celsius_temp) " + "WHERE { ?subject <u:temp> ?temp } " ; Query query = QueryFactory.create(queryString, Syntax.syntaxARQ); QueryExecution qexec = QueryExecutionFactory.create(query, model); ResultSet results = qexec.execSelect(); ResultSetFormatter.out(System.out, results, query); model.close(); OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test18_privnet.java
java -classpath ./:../jar/'*' Test18_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
------------------------------------------------------------------------
| subject | celsius_temp |
========================================================================
| <u:Object1> | "-7.7222223"^^<http://www.w3.org/2001/XMLSchema#float> |
| <u:Object2> | "0.0"^^<http://www.w3.org/2001/XMLSchema#float> |
------------------------------------------------------------------------
7.16.15 OracleConnectionを使用したOracle Databaseのインスタンス化
次の例は、指定されたOracleConnection
オブジェクトを使用してOracleオブジェクトをインスタンス化する別の方法を示しています。(J2EE Webアプリケーションでは、ユーザーは通常、J2EEデータソースからOracleConnection
オブジェクトを取得できます。)
例7-31 OracleConnectionを使用してOracle Databaseをインスタンス化する
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
import org.apache.jena.query.*; import org.apache.jena.graph.*; import oracle.spatial.rdf.client.jena.*; import oracle.jdbc.pool.*; import oracle.jdbc.*; public class Test19_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; OracleDataSource ds = new OracleDataSource(); ds.setURL(szJdbcURL); ds.setUser(szUser); ds.setPassword(szPasswd); OracleConnection conn = (OracleConnection) ds.getConnection(); Oracle oracle = new Oracle(conn); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName, szUser, szNetworkName); GraphOracleSem g = model.getGraph(); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Mary"))); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); g.add(Triple.create( NodeFactory.createURI("u:Mary"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jill"))); String queryString = " SELECT ?s ?o WHERE { ?s <u:parentOf> ?o .} "; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; ResultSet results = qexec.execSelect() ; ResultSetFormatter.out(System.out, results, query); qexec.close() ; OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); model.close(); oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test19_privnet.java
java -classpath ./:../jar/'*' Test19_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
-----------------------
| s | o |
=======================
| <u:John> | <u:Mary> |
| <u:John> | <u:Jack> |
| <u:Mary> | <u:Jill> |
-----------------------
7.16.16 Oracle Database接続プーリング
次の例では、Oracle Database接続プーリングを使用します。
例7-32 Oracle Database接続プーリング
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
import org.apache.jena.graph.*; import oracle.spatial.rdf.client.jena.*; public class Test20_privnet { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; String szNetworkName = args[4]; // test with connection properties (taken from some example) 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 OraclePool"); OraclePool op = new OraclePool(szJdbcURL, szUser, szPasswd, prop, "OracleSemConnPool"); System.out.println("Done creating OraclePool"); // grab an Oracle and do something with it System.out.println("Getting an Oracle from OraclePool"); Oracle oracle = op.getOracle(); System.out.println("Done"); System.out.println("Is logical connection:" + oracle.getConnection().isLogicalConnection()); GraphOracleSem g = new GraphOracleSem(oracle, szModelName, szUser, szNetworkName); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Mary"))); g.close(); // return the Oracle back to the pool oracle.dispose(); // grab another Oracle and do something else System.out.println("Getting an Oracle from OraclePool"); oracle = op.getOracle(); System.out.println("Done"); System.out.println("Is logical connection:" + oracle.getConnection().isLogicalConnection()); g = new GraphOracleSem(oracle, szModelName, szUser, szNetworkName); g.add(Triple.create( NodeFactory.createURI("u:John"), NodeFactory.createURI("u:parentOf"), NodeFactory.createURI("u:Jack"))); g.close(); OracleUtils.dropSemanticModel(oracle, szModelName, szUser, szNetworkName); // return the Oracle back to the pool oracle.dispose(); } }
次に、前述のコードをコンパイルおよび実行するためのコマンドと、java
コマンドの想定される出力を示します。
javac -classpath ../jar/'*' Test20_privnet.java
java -classpath ./:../jar/'*' Test20_privnet jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> M1 NET1
Creating OraclePool
Done creating OraclePool
Getting an Oracle from OraclePool
Done
Is logical connection:true
Getting an Oracle from OraclePool
Done
Is logical connection:true