Oracle Database 11g Release 2 Semantic Technologies Using the Jena Adaptor for Oracle Database

Oracle Database 11g Release 2 Semantic Technologies Using the Jena Adaptor for Oracle Database Purpose This tutorial shows how to apply Jena APIs to t...
1 downloads 0 Views 407KB Size
Oracle Database 11g Release 2 Semantic Technologies Using the Jena Adaptor for Oracle Database Purpose This tutorial shows how to apply Jena APIs to the Semantic Technologies features of the Oracle Spatial Option by utilizing the Jena Adaptor for Oracle Database. Time to Complete Approximately 30~45 minutes Topics This tutorial covers the following steps • Overview of Semantic Technologies and Jena Adaptor • Scenario • Prerequisites • Setup the semantic network and environment • Using Jena Adaptor o Load an OWL ontology and perform OWLPrime inference o SPARQL OPTIONAL query o SPARQL query with LIMIT and OFFSET o SPARQL query with timeout setting and parallel execution o Named Graph query o SPARQL ASK Query o SPARQL DESCRIBE query o SPARQL CONSTRUCT query o Query multiple models with ALLOW_DUP option o SPARUL o Query with ARQ built-in function o SELECT cast query o Instantiate Oracle Database using OracleConnection o Use Oracle Database Connection Pooling

Overview Overview of Oracle Database 11g Release 2 Semantic Technologies As part of Oracle Spatial 11g, an option for Oracle Database 11g Enterprise Edition, Oracle delivers an advanced semantic data management capability not found in any other commercial or open source triple store. With native support for RDF/RDFS/OWL/SKOS standards, this semantic data store enables application developers to benefit from an open, scalable, secure, integrated, efficient platform for RDF and OWL-based applications. These semantic database features include (among others): storing, inference and query of RDF/RDFS/OWL/SKOS data and ontologies.

Sept. 2009

1

More information can be found on http://www.oracle.com/technology/tech/semantic_technologies/index.html This tutorial assumes that you are familiar with the major concepts associated with RDF and OWL, such as {subject, predicate, object} triples, and ontologies. This demo does not explain these concepts in detail, but focuses instead on how to setup the Oracle Database and the Jena Adaptor to be able to execute the usage examples listed in the demo.

Overview of Jena Adaptor for Oracle Database 11g release 2 The Jena Adaptor for Oracle Database provides a Java-based interface to Oracle Semantic Technologies by implementing the well-known Jena Graph and Model APIs. (Jena is an Open Source framework developed by Hewlett-Packard and is available under a BSD-style license; see http://jena.sf.net for details.) It extends the semantic data management capabilities of Oracle Database (Oracle Database 11g Release 1 and 2 RDF/OWL). Major new features and improvements in Jena Adaptor version 3 include: - Support for SPARQL Protocol by integrating with Joseki, a SPARQL Server for Jena - Support for features like property paths, SPARUL, variable assignments, project expressions, etc. that are beyond what have been defined in SPARQL - Native translation of SPARQL queries to Oracle Database SEM_MATCH based SQL statements - Support for Oracle Database Connection Pooling - Support virtual model - Support for query timeout, parallel execution, and hints. - Compatible with Jena 2.6.0 Back to topics Scenario You will create a schema called rdfusr which will contain all of the semantic models, application tables and entailments from the usage examples in this OBE. These semantic artifacts will be created transparently as needed by the Jena Adaptor. You will then go through each Jena Adaptor usage example, compiling and executing the java file for each example. Prerequisites Before starting this tutorial you should. • Install Oracle Database 11g Release 2 with the Oracle Spatial and Partitioning Options. • Install the Semantic Technologies support. • Install Jena (version 2.6.0)

Sept. 2009

2

• • •

o http://sourceforge.net/projects/jena/files/Jena/Jena-2.6.0/jena2.6.0.zip/download o Assume the Jena package is unpacked in directory / Download Jena Adaptor (sdordfclient.jar) o Put sdordfclient.jar under /lib JDBC library o Put ojdbc5.jar under /lib Install JDK 1.5 o Assume JAVAHOME is setup correctly to point to the installation o For example, setenv JAVA_HOME /usr/local/packages/jdk15/ Back to topics

Setup the Environment As a prerequisite, you must have already created the semantic network and described in the Semantic Technologies Developer's Guide. 1. Start SQL*Plus. At the Enter username prompt, enter the following to log-in as a privileged user: sys/oracle as sysdba

2. Create the rdf_users tablespace and create the semantic network by running the

following commands. create tablespace rdf_users datafile 'rdf_users01.dbf' size 128M reuse autoextend on next 64M maxsize unlimited segment space management auto;

Sept. 2009

3

exec sem_apis.create_rdf_network('RDF_USERS');

3. Create a user rdfusr create user rdfusr identified by rdfusr default tablespace rdf_users; 4.

Grant necessary privileges to the user. grant connect, resource to rdfusr;

Back to topics

Sept. 2009

4

Jena Adaptor Usage Examples 5. Compile and run the following code from /lib/: import oracle.spatial.rdf.client.jena.*; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.graph.*; public class Test { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); Model model = ModelOracleSem.createOracleSemModel( oracle, szModelName); model.getGraph().add(Triple.create( Node.createURI("http://example.com/John"), Node.createURI("http://example.com/fatherOf"), Node.createURI("http://example.com/Mary"))); model.close(); oracle.dispose(); } }

To compile, % java -classpath ./:./jena.jar:./sdordfclient.jar:./ojdbc5.jar:slf4japi-1.5.6.jar:log4j-1.2.12.jar:slf4j-log4j121.5.6.jar:arq.jar:xercesImpl.jar Test jdbc:oracle:thin:@stbdd08:1521:orcl rdfusr rdfusr Family

To run, % java -classpath ./:./jena.jar:./sdordfclient.jar:./ojdbc5.jar:slf4japi-1.5.6.jar:log4j-1.2.12.jar:slf4j-log4j121.5.6.jar:arq.jar:xercesImpl.jar:iri.jar:icu4j_3_4.jar Test jdbc:oracle:thin:@stbdd08:1521:orcl rdfusr rdfusr Family

Figure 1. Expected output of step 5

Sept. 2009

5

Back to topics 6. Load an OWL ontology (stored in a local file) and perform OWLPrime inference. Note that the OWL ontology is in RDF/XML format and after it is loaded into Oracle, it will be serialized out in N-TRIPLE form. We also query for the number of asserted and inferred triples. The ontology can be retrieved from http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl import java.io.*; import com.hp.hpl.jena.query.*; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.util.FileManager; import oracle.spatial.rdf.client.jena.*; public class Test6 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); Model model = ModelOracleSem.createOracleSemModel(oracle, szModelName); // 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); graph.analyze(); graph.performInference(); query = QueryFactory.create(queryString) ; qexec = QueryExecutionFactory.create(query,new ModelOracleSem(graph)) ; try { int iTriplesCount = 0; ResultSet results = qexec.execSelect() ;

Sept. 2009

6

for ( ; results.hasNext() ; ) { QuerySolution soln = results.nextSolution() ; iTriplesCount++; } System.out.println("Asserted + Infered triples count: " + iTriplesCount); } finally { qexec.close() ; } model.close(); OracleUtils.dropSemanticModel(oracle, szModelName); oracle.dispose(); } }

Figure 2. Expected output of Step 6

7. Load the same OWL ontology (stored in a local file) using Bulk Loader.

Ontologies can also be loaded using an incremental and batch loader; these two methods are also listed in the example below for completeness. import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.graph.*; com.hp.hpl.jena.rdf.model.*; com.hp.hpl.jena.util.*; oracle.spatial.rdf.client.jena.*;

public class Test7 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; // 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);

Sept. 2009

7

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(); OracleUtils.dropSemanticModel(oracle, szModelName); oracle.dispose(); } }

Figure 3. Loading an ontology using bulk loader (Step 7)

Sept. 2009

8

Back to topics

8. Run a SPARQL OPTIONAL query using the Jena Adaptor. import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; oracle.spatial.rdf.client.jena.*; com.hp.hpl.jena.graph.*;

public class Test8 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); GraphOracleSem g = model.getGraph(); g.add(Triple.create( Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Mary"))); g.add(Triple.create( Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); g.add(Triple.create( Node.createURI("u:Mary"), Node.createURI("u:parentOf"), Node.createURI("u:Jill"))); String queryString = " SELECT ?s ?o ?gkid " + " WHERE { ?s ?o . OPTIONAL {?o ?gkid }} "; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; try { int iMatchCount = 0; ResultSet results = qexec.execSelect() ; ResultSetFormatter.out(System.out, results, query); } finally { qexec.close() ; } model.close(); OracleUtils.dropSemanticModel(oracle, szModelName); oracle.dispose(); } }

Sept. 2009

9

Figure 4 Expected output of running a SPARQL OPTIONAL query using the Jena Adaptor.

Back to topics 9. Run a SPARQL query with LIMIT and OFFSET using the Jena Adaptor. import java.io.*; import com.hp.hpl.jena.query.*; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.util.FileManager; import oracle.spatial.rdf.client.jena.*; import com.hp.hpl.jena.graph.*; public class Test9 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); GraphOracleSem g = model.getGraph(); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Mary"))); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); g.add(Triple.create(Node.createURI("u:Mary"), Node.createURI("u:parentOf"), Node.createURI("u:Jill"))); String queryString = " SELECT ?s ?o ?gkid " + " WHERE { ?s ?o . OPTIONAL {?o ?gkid }} " + " LIMIT 1 OFFSET 2"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; int iMatchCount = 0; ResultSet results = qexec.execSelect() ; ResultSetFormatter.out(System.out, results, query); qexec.close() ; model.close(); OracleUtils.dropSemanticModel(oracle, szModelName); oracle.dispose();

Sept. 2009

10

} }

Figure 5 Expected output of running a SPARQL query with LIMIT and OFFSET specified.

Back to topics 10. Run a SPARQL query with additional features including a timeout setting (in seconds) and parallel execution setting (DOP=4) import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; oracle.spatial.rdf.client.jena.*; com.hp.hpl.jena.graph.*;

public class Test10 { public static void main(String[] args) throws Exception String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3];

{

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); GraphOracleSem g = model.getGraph(); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Mary"))); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); g.add(Triple.create(Node.createURI("u:Mary"), Node.createURI("u:parentOf"), Node.createURI("u:Jill"))); String queryString = " PREFIX ORACLE_SEM_FS_NS: " + " SELECT ?s ?o ?gkid WHERE { ?s ?o . " + " OPTIONAL {?o ?gkid }} " + " LIMIT 1 OFFSET 2"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; int iMatchCount = 0; ResultSet results = qexec.execSelect() ; ResultSetFormatter.out(System.out, results, query); qexec.close() ; model.close(); OracleUtils.dropSemanticModel(oracle, szModelName);

Sept. 2009

11

oracle.dispose(); } }

Figure 6 Expected output of running a SPARQL query timeout and degree of parallelism (DOP) specified.

Back to topics 11. Run a Named Graph based query import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; oracle.spatial.rdf.client.jena.*; com.hp.hpl.jena.graph.*;

public class Test11 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); DataSource ds = DatasetFactory.create(); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); model.getGraph().add(Triple.create(Node.createURI("http://example.org/bob"), Node.createURI("http://purl.org/dc/elements/1.1/publisher"), Node.createLiteral("Bob Hacker"))); model.getGraph().add(Triple.create(Node.createURI("http://example.org/alice"), Node.createURI("http://purl.org/dc/elements/1.1/publisher"), Node.createLiteral("alice Hacker")));

ModelOracleSem model1 = ModelOracleSem.createOracleSemModel(oracle, szModelName+"1"); model1.getGraph().add(Triple.create(Node.createURI("urn:bob"), Node.createURI("http://xmlns.com/foaf/0.1/name"), Node.createLiteral("Bob"))); model1.getGraph().add(Triple.create(Node.createURI("urn:bob"), Node.createURI("http://xmlns.com/foaf/0.1/mbox"), Node.createURI("mailto:bob@example"))); ModelOracleSem model2 = ModelOracleSem.createOracleSemModel(oracle,

Sept. 2009

12

szModelName+"2"); model2.getGraph().add(Triple.create(Node.createURI("urn:alice"), Node.createURI("http://xmlns.com/foaf/0.1/name"), Node.createLiteral("Alice"))); model2.getGraph().add(Triple.create(Node.createURI("urn:alice"), Node.createURI("http://xmlns.com/foaf/0.1/mbox"), Node.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: " + " PREFIX dc: " + " SELECT ?who ?graph ?mbox " + " FROM NAMED " + " FROM NAMED " + " 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); OracleUtils.dropSemanticModel(oracle, szModelName + "1"); OracleUtils.dropSemanticModel(oracle, szModelName + "2"); oracle.dispose(); } }

Figure 7 Expected output of step 11: running a named graph query

Back to topics

Sept. 2009

13

12. Run a SPARQL ASK Query import java.io.*; import com.hp.hpl.jena.query.*; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.util.FileManager; import oracle.spatial.rdf.client.jena.*; import com.hp.hpl.jena.graph.*; public class Test12 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); GraphOracleSem g = model.getGraph(); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Mary"))); String queryString = " ASK { } "; 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() ; model.close(); OracleUtils.dropSemanticModel(oracle, szModelName); oracle.dispose(); } }

Figure 8 Expected output for step 12: SPARQL ASK query

Back to topics

Sept. 2009

14

13. Run a SPARQL DESCRIBE query import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; oracle.spatial.rdf.client.jena.*; com.hp.hpl.jena.graph.*;

public class Test13 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); GraphOracleSem g = model.getGraph(); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Mary"))); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); g.add(Triple.create(Node.createURI("u:Amy"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); String queryString = " DESCRIBE ?x WHERE {?x }"; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; Model m = qexec.execDescribe(); System.out.println("describe result = " + m.toString()); qexec.close() ; model.close(); OracleUtils.dropSemanticModel(oracle, szModelName); oracle.dispose(); } }

Figure 9 Expected output for step 13: SPARQL DESCRIBE query.

Back to topics Sept. 2009

15

14. Run a SPARQL CONSTRUCT query import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; oracle.spatial.rdf.client.jena.*; com.hp.hpl.jena.graph.*;

public class Test14 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); GraphOracleSem g = model.getGraph(); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Mary"))); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); g.add(Triple.create(Node.createURI("u:Amy"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); String queryString = " CONSTRUCT { ?s ?o } WHERE {?s ?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, szModelName); oracle.dispose(); } }

Figure 10. Expected Output for step 14: SPARQL CONSTRUCT query.

Back to topics

Sept. 2009

16

15. Query multiple models and use ALLOW_DUP option import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; oracle.spatial.rdf.client.jena.*; com.hp.hpl.jena.graph.*;

public class Test15 { 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]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model1 = ModelOracleSem.createOracleSemModel(oracle, szModelName1); model1.getGraph().add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); model1.close(); ModelOracleSem model2 = ModelOracleSem.createOracleSemModel(oracle, szModelName2); model2.getGraph().add(Triple.create(Node.createURI("u:Mary"), Node.createURI("u:parentOf"), Node.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); ModelOracleSem model = new ModelOracleSem(graph); String queryString = " CONSTRUCT { ?s ?o } WHERE {?s ?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); OracleUtils.dropSemanticModel(oracle, szModelName2); oracle.dispose(); } }

Sept. 2009

17

Figure 11. Expected output for step 15: Querying multiple Oracle semantic models using the Jena Adaptor.

Back to topics 16. Test SPARUL import import import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; com.hp.hpl.jena.util.iterator.*; oracle.spatial.rdf.client.jena.*; com.hp.hpl.jena.graph.*; com.hp.hpl.jena.update.*;

public class Test16 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); GraphOracleSem g = model.getGraph(); String insertString = " PREFIX dc: " + " INSERT DATA " + " { dc:title \"A new book\" ; " + " dc:creator \"A.N.Other\" . " + " } "; UpdateAction.parseExecute(insertString, model); ExtendedIterator ei = GraphUtil.findAll(g); while (ei.hasNext()) { System.out.println("Triple " + ei.next().toString()); } model.close(); OracleUtils.dropSemanticModel(oracle, szModelName); oracle.dispose(); } }

Sept. 2009

18

Figure 12. Expected output for step 16: Using SPARQL 2.0 features such as INSERT DATA (SPARUL) using the Jena Adaptor.

Back to topics 17. Run a query with ARQ built-in function import import import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; com.hp.hpl.jena.util.iterator.*; oracle.spatial.rdf.client.jena.*; com.hp.hpl.jena.graph.*; com.hp.hpl.jena.update.*;

public class Test17 { public static void main(String[] args) throws Exception String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3];

{

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); GraphOracleSem g = model.getGraph(); String insertString = " PREFIX dc: " + " INSERT DATA " + " { dc:title \"A new book\" ; " + " dc:creator \"A.N.Other\" . " + " dc:title \"Semantic Web Rocks\" ; " + " dc:creator \"TB\" . " + " } "; UpdateAction.parseExecute(insertString, model); String queryString = "PREFIX dc: " + " PREFIX fn: " + " 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); oracle.dispose(); }

Sept. 2009

19

}

Figure 13. Expected output for step 17: Using built-in functions

Back to topics 18. Run a SELECT cast query import import import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; com.hp.hpl.jena.util.iterator.*; oracle.spatial.rdf.client.jena.*; com.hp.hpl.jena.graph.*; com.hp.hpl.jena.update.*;

public class Test18 { public static void main(String[] args) throws Exception String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3];

{

Oracle oracle = new Oracle(szJdbcURL, szUser, szPasswd); ModelOracleSem model = ModelOracleSem.createOracleSemModel(oracle, szModelName); GraphOracleSem g = model.getGraph(); String insertString = " PREFIX xsd: " + " INSERT DATA " + " { \"18.1\"^^xsd:float ; " + " \"Foo... \" . " + " \"32.0\"^^xsd:float ; " + " \"Bar... \" . " + " } "; UpdateAction.parseExecute(insertString, model); String queryString = " PREFIX fn: " + " SELECT ?subject ((?temp - 32.0)*5/9 as ?celsius_temp) " + "WHERE { ?subject ?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); oracle.dispose();

Sept. 2009

20

} }

Figure 14 Expected output for step 18: functions over SELECT list variables (converting Fahrenheit to Celsius)

Back to topics

Sept. 2009

21

19. Instantiate Oracle Database using OracleConnection import import import import import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; com.hp.hpl.jena.util.iterator.*; com.hp.hpl.jena.graph.*; com.hp.hpl.jena.update.*; oracle.spatial.rdf.client.jena.*; oracle.jdbc.pool.*; oracle.jdbc.*;

public class Test19 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; 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); GraphOracleSem g = model.getGraph(); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Mary"))); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); g.add(Triple.create(Node.createURI("u:Mary"), Node.createURI("u:parentOf"), Node.createURI("u:Jill"))); String queryString = " SELECT ?s ?o WHERE { ?s ?o .} "; Query query = QueryFactory.create(queryString) ; QueryExecution qexec = QueryExecutionFactory.create(query, model) ; ResultSet results = qexec.execSelect() ; ResultSetFormatter.out(System.out, results, query); qexec.close() ; model.close(); OracleUtils.dropSemanticModel(oracle, szModelName); oracle.dispose(); }

Sept. 2009

22

}

Figure 15 Expected output for step 19: Using an OracleConnection directly

Back to topics 20. Use Oracle Database Connection Pooling import import import import import import import import import import

java.io.*; com.hp.hpl.jena.query.*; com.hp.hpl.jena.rdf.model.Model; com.hp.hpl.jena.util.FileManager; com.hp.hpl.jena.util.iterator.*; com.hp.hpl.jena.graph.*; com.hp.hpl.jena.update.*; oracle.spatial.rdf.client.jena.*; oracle.jdbc.pool.*; oracle.jdbc.*;

public class Test20 { public static void main(String[] args) throws Exception { String szJdbcURL = args[0]; String szUser = args[1]; String szPasswd = args[2]; String szModelName = args[3]; // 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); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"),

Sept. 2009

23

Node.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); g.add(Triple.create(Node.createURI("u:John"), Node.createURI("u:parentOf"), Node.createURI("u:Jack"))); g.close(); OracleUtils.dropSemanticModel(oracle, szModelName); // return the Oracle back to the pool oracle.dispose(); op.close(); } }

Figure 16 Expected output for step 20: Using Oracle Connection Pooling

Sept. 2009

24

Suggest Documents