Example5.java: SPARQL query with JOIN_METHOD

This example shows a SPARQL query with additional features including the selection of a join_method (JOIN_METHOD={nl, hash}) used to select the join method to use in operations over query patterns. It loads the quads contained in RDF file example.nt located in the examples directory of the RDF Graph feature that assert the following:

It then finds all the names of the people in graph <http://example.org/alice/foaf.rdf> who knows another person, using nested loop join operations to merge bindings retrieved between the query patterns in the SPARQL query.

import com.hp.hpl.jena.query.*;
import org.openjena.riot.Lang;
import com.hp.hpl.jena.sparql.core.DatasetImpl;
import oracle.rdf.kv.client.jena.*;

public class Example5
{
  
public static void main(String[] args) throws Exception
  {
 
String szStoreName  = args[0];
String szHostName   = args[1];
String szHostPort   = args[2];
   
// Create connection    
OracleNoSqlConnection conn 
     = OracleNoSqlConnection.createInstance(szStoreName,
                                            szHostName, 
                                            szHostPort);

// Create the datasetgraph    
OracleGraphNoSql graph = new OracleGraphNoSql(conn);
DatasetGraphNoSql datasetGraph = DatasetGraphNoSql.createFrom(graph);
   
// Close graph, as it is no longer needed
graph.close();
    
// Clear dataset
datasetGraph.clearRepository();
    
Dataset ds = DatasetImpl.wrap(datasetGraph);
    
// Load data from file into the dataset    
DatasetGraphNoSql.load("example.nt", Lang.NQUADS, conn, 
                           "http://example.com"); //base URI

// change hint to hash to test hash join, or remove to use default
// join settings
String szQuery = 
" PREFIX ORACLE_SEM_FS_NS: "                         +
" <http://oracle.com/semtech#join_method=nl>"        +
" PREFIX foaf: <http://xmlns.com/foaf/0.1/>"         +
" SELECT ?name1 ?name2 "                             +
" WHERE { "                                          +
"   graph <http://example.org/alice/foaf.rdf> { "    +
"     ?person1 foaf:knows ?person2 . "               +
"     ?person1 foaf:name ?name1 . "                  +
"     ?person2 foaf:name ?name2 . "                  +
"   } "                                              +
" } ";
    
System.out.println("Execute query " + szQuery);
    
Query query = QueryFactory.create(szQuery);
QueryExecution qexec = QueryExecutionFactory.create(query, ds);
    
try {
      ResultSet results = qexec.execSelect();
      ResultSetFormatter.out(System.out, results, query);
    }
    
finally {
      qexec.close();
    }
    
ds.close();
conn.dispose();   
  }
}

The following are the commands to compile and run this example, as well as the expected output of the java command.

javac -classpath ./:./jena-core-2.7.4.jar:./jena-arq-2.9.4.jar: \
./sdordfnosqlclient.jar:./kvclient.jar:./xercesImpl-2.10.0.jar: \
./slf4j-api-1.6.4.jar:./slf4j-log4j12-1.6.4.jar:./log4j/1.2.16.jar: \
./jena-iri-0.9.4.jar:./xml-apis-1.4.01.jar Example5.java

javac -classpath ./:./jena-core-2.7.4.jar:./jena-arq-2.9.4.jar: \
./sdordfnosqlclient.jar:./kvclient.jar:./xercesImpl-2.10.0.jar: \
./slf4j-api-1.6.4.jar:./slf4j-log4j12-1.6.4.jar:./log4j/1.2.16.jar: \
./jena-iri-0.9.4.jar:./xml-apis-1.4.01.jar Example5 <store_name> \
<host_name> <host_port>
-------------------
| name1   | name2 |
===================
| "Alice" | "Bob" |
------------------- 

You can test hash join selection by modifying the following line in the code. The output of this Java class will be the same as the one presented before.

PREFIX ORACLE_SEM_FS_NS: <http://oracle.com/semtech#join_method=hash>