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接続プーリングを使用します。

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

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

  2. Javaソース・ファイルをコンパイルします。たとえば、次のようにします。

    > javac -classpath ../jar/'*' Test.java
    

    ノート:

    javacコマンドとjavaコマンドは、それぞれ1行のコマンドである必要があります。

  3. コンパイルされたファイルを実行します。たとえば、次のようにします。

    java -classpath ./:../jar/'*' Test jdbc:oracle:thin:@localhost:1521:orcl scott <password-for-scott> TestModel NET1

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 名前付きグラフを含む問合せ

次の例は、名前付きグラフを含む問合せを示しています。これには、名前付きグラフのURIとその作成者の情報を持つデフォルト・グラフが含まれます。問合せで、グラフ名、グラフの作成者および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