Andy,
One more thing that might be relevant. Pay attention to the code segment:
public static void selectDataset(Dataset dataset, String querystr){
//SPARQL QUERY is handled here
Query query = QueryFactory.create(querystr);
dataset.getLock().enterCriticalSection(Lock.READ) ;
try {
QueryExecution qexec = QueryExecutionFactory.create(query, dataset)
;
ResultSet results = qexec.execSelect() ;
ResultSetFormatter.out(System.out, results);
qexec.close();
} finally {
dataset.getLock().leaveCriticalSection();
}
}
So, the query is executed over dataset not model. If I execute the same query
over model (even if I set OWL_MEM as reasoner) I get correct results as
expected.
Milorad
>________________________________
> From: Andy Seaborne <[email protected]>
>To: [email protected]
>Sent: Thursday, March 28, 2013 3:36 PM
>Subject: Re: graph merge in SPARQL
>
>On 28/03/13 13:14, Milorad Tosic wrote:
>> Hi,
>>
>> The SPARQL standard states that multiple FROM clauses in a single
>> SPARQL query should be interpreted as a graph merge operation. But, I
>> get strange behavior in this case not as specified. At the end of the
>> message I first include results of a illustrative example that
>> indicates that graphs are not merged followed byJava code for
>> the same example.
>> What I am doing wrong? What should be done to make the graph merge
>> working? We use jena-2.6.4 and tdb-0.8.9.
>>
>
>Old versions, pre-Apache. It seems to work for me in current TDB.
>
>A simple test case of your setup is one data file, one query.
>
>== D.trig
>@base <http://example/> .
>
><g1> { <s> <p> <x> }
><g2> { <x> <q> <o> }
>== Q.rq
>BASE <http://example/>
>SELECT *
>FROM <g1>
>FROM <g2>
>{
> ?s <p> ?x .
> ?x <q> <o>
>}
>==
> tdbquery --mem D.trig --file Q.rq
>==>
>-------------
>| s | x |
>=============
>| <s> | <x> |
>-------------
>
>(I also did the same with your data, converted, successfully but it's a
>bit wide for email)
>
>This is with current TDB 0.10.0 which supports --mem for quick,
>in-memory testing. It creates and loads a TDB database using a RAM disk
>- otherwise TDB query execution is the same as disk.
>
>Otherwise: You will need
>
>rm -rf DBX
>tdbloader --loc=DBX D.trig
>tdbquery --loc=DBX --file Q.rq
>
> Andy
>
>(I haven't checked the java code is working correctly)
>
>
>> Thanks,
>> Milorad
>>
>> ===================================================================
>> START
>> Deleting directory: C:/DatasetGraphsMergeTest
>> creating directory: C:/DatasetGraphsMergeTest
>> DIR created
>> WARN [main] (SetupTDB.java:755) - No BGP optimizer
>> First graph created.
>> --------------------------------------------------------------------------------------------------------------------------
>> | s | p |
>> o |
>> ==========================================================================================================================
>> | <http://test/r1> | <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> |
>> <http://www.w3.org/2000/01/rdf-schema#label> |
>> --------------------------------------------------------------------------------------------------------------------------
>> Second graph created.
>> ----------------------------------------------------------------------------------------------
>> | s | p |
>> o |
>> ==============================================================================================
>> | <http://test/r2> | <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> |
>> <http://test/r1> |
>> ----------------------------------------------------------------------------------------------
>> Inter graph query results.
>> ---------
>> | s | l |
>> =========
>> ---------
>> END
>>
>> ===================================================================
>>
>>
>> import java.io.File;
>> import java.io.IOException;
>>
>> import org.apache.commons.io.FileUtils;
>>
>> import com.hp.hpl.jena.query.Query;
>> import com.hp.hpl.jena.query.Dataset;
>> import com.hp.hpl.jena.query.QueryExecution;
>> import com.hp.hpl.jena.query.QueryExecutionFactory;
>> import com.hp.hpl.jena.query.QueryFactory;
>> import com.hp.hpl.jena.query.ResultSet;
>> import com.hp.hpl.jena.query.ResultSetFormatter;
>> import com.hp.hpl.jena.shared.Lock;
>> import com.hp.hpl.jena.tdb.TDB;
>> import com.hp.hpl.jena.tdb.TDBFactory;
>> import com.hp.hpl.jena.update.UpdateAction;
>> import com.hp.hpl.jena.update.UpdateFactory;
>> import com.hp.hpl.jena.update.UpdateRequest;
>>
>> public class DatasetGraphsMergeSPARQL {
>> public static final String TDB_DIR = "C:/DatasetGraphsMergeTest";//path
>>on locval HDD for TDB store
>> public static final boolean DELETE_EXISTING_TDB = true;//if TDB already
>>exist should we delete it
>>
>> public static final String Q_CreateGraph1 =
>> "INSERT DATA { " +
>> " GRAPH <http://g1> { " +
>> " <http://test/r1>
>><http://www.w3.org/2000/01/rdf-schema#subPropertyOf> " +
>> " <http://www.w3.org/2000/01/rdf-schema#label> . " +
>> " }" +
>> "}";
>> public static final String Q_CreateGraph2 =
>> "INSERT DATA { " +
>> " GRAPH <http://g2> { " +
>> " <http://test/r2>
>><http://www.w3.org/2000/01/rdf-schema#subPropertyOf> " +
>> " <http://test/r1> . " +
>> " }" +
>> "}";
>> public static final String Q_TestEmpty1 =
>> "SELECT ?s ?p ?o " +
>> "FROM <http://g1> " +
>> "{ " +
>> " ?s ?p ?o . " +
>> "}";
>> public static final String Q_TestEmpty2 =
>> "SELECT ?s ?p ?o " +
>> "FROM <http://g2> " +
>> "{ " +
>> " ?s ?p ?o . " +
>> "}";
>> public static final String Q_TestInterGraphPath =
>> "SELECT ?s ?l " +
>> "FROM <http://g1> " +
>> "FROM <http://g2> " +
>> "{ " +
>> " ?s <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> ?l . " +
>> " ?l <http://www.w3.org/2000/01/rdf-schema#subPropertyOf> " +
>> " <http://www.w3.org/2000/01/rdf-schema#label> .
>>" +
>> "}";
>>
>>
>> public static void main(String[] args) throws Exception{
>> Dataset m_dataset;
>> System.out.println("START");
>>
>> m_dataset = initDataset();
>> updateDataset(m_dataset, Q_CreateGraph1);
>> System.out.println("First graph created.");
>> selectDataset(m_dataset, Q_TestEmpty1);
>>
>> updateDataset(m_dataset, Q_CreateGraph2);
>> System.out.println("Second graph created.");
>> selectDataset(m_dataset, Q_TestEmpty2);
>>
>> System.out.println("Inter graph query results.");
>> selectDataset(m_dataset, Q_TestInterGraphPath);
>>
>> System.out.println("END");
>> }
>>
>> public static Dataset initDataset() throws IOException{
>> //Initializing Dataset//Creating Directory for TDB
>> File tdbDir = new File(TDB_DIR);
>>
>> if(DELETE_EXISTING_TDB && tdbDir.exists()){
>> System.out.println("Deleting directory: " + TDB_DIR);
>> FileUtils.deleteDirectory(tdbDir);
>> }
>> if (!tdbDir.exists()){
>> System.out.println("creating directory: " + TDB_DIR);
>> boolean result = tdbDir.mkdir();
>> if(result){
>> System.out.println("DIR created");
>> }
>> }
>> //Initializing Dataset
>> return TDBFactory.createDataset(tdbDir.getPath());
>> }
>>
>> public static void updateDataset(Dataset dataset, String querystr){
>> dataset.getLock().enterCriticalSection(Lock.WRITE);
>> try {
>> UpdateRequest updateRequest = UpdateFactory.create(querystr);
>> UpdateAction.execute(updateRequest, dataset);
>> }catch (Exception e){
>> System.out.println(e);
>> } finally {
>> TDB.sync(dataset);
>> dataset.getLock().leaveCriticalSection();
>> }
>> }
>>
>> public static void selectDataset(Dataset dataset, String querystr){
>> //SPARQL QUERY is handled here
>> Query query = QueryFactory.create(querystr);
>> dataset.getLock().enterCriticalSection(Lock.READ) ;
>> try {
>> QueryExecution qexec = QueryExecutionFactory.create(query,
>>dataset) ;
>> ResultSet results = qexec.execSelect() ;
>> ResultSetFormatter.out(System.out, results);
>> qexec.close();
>> } finally {
>> dataset.getLock().leaveCriticalSection();
>> }
>> }
>>
>> }
>>
>
>
>
>