2014-07-16 40 views
0

我有一個問題。如何查詢Jena TDB上的模型名稱

我想在Jena TDB上加載我的RDF文件。

我寫了這個代碼:

public void store(){ 
    String directory = "C:\\tdb"; 
    String source = "C:\\file1.rdf"; 
    String source1 = "C:\\file2.rdf"; 
    Dataset dataset = openTDB(directory); 
    Model tdb = loadModel(source, dataset); 
    dataset.addNamedModel("File1", tdb); 

    Model tdb1 = loadModel(source1, dataset); 
    dataset.addNamedModel("File2", tdb1); 

    queryTDB(tdb, dataset); 
    queryTDB(tdb1, dataset); 

    tdb.close(); 
    tdb1.close(); 
    dataset.close(); 
} 

public Dataset openTDB(String directory) { 
    // open TDB dataset 
    Dataset dataset = TDBFactory.createDataset(directory); 
    return dataset; 
} 

public Model loadModel(String source, Dataset dataset) { 

    Model tdb = dataset.getDefaultModel(); 
    FileManager.get().readModel(tdb, source, "RDF/XML"); 
    return tdb; 
} 

特別是,我有兩個文件,我想上加載耶拿TDB這些文件。我已經在互聯網上閱讀過,我可以使用「addNamedModel」爲我的模型添加一個名稱。這樣做,在上面的代碼中,我添加了名稱「File1」和「File2」。

現在,我要查詢這個數據集,我試圖寫這樣的代碼:

public void queryTDB(Model tdb, Dataset dataset) { 

    String queryStr = "SELECT * { ?s ?p ?o }"; 

    Query query = QueryFactory.create(queryStr); 
    QueryExecution qexec = QueryExecutionFactory.create(query, tdb); 
    /*Execute the Query*/ 
    ResultSet results = qexec.execSelect(); 
    ResultSetFormatter.out(results) ; 
    qexec.close(); 
} 

此代碼的工作,但我想知道我怎樣才能得到查詢結果僅供模型名爲「File1」(或「File2」)。事實上,通過這樣的查詢,我得到了兩種模型的結果。

我該如何實現它?

回答

4

你並沒有使用絕對IRI來命名圖表,所以我不知道你的圖名是什麼。您可以使用這樣的查詢,以幫助找出它們是什麼:

select * { 
    graph ?g { 
    ?s ?p ?o 
    } 
} 

一旦你做到了這一點,你可以繼續使用graph ?g { … }模式,或使用from named在查詢中指定圖形:

select * 
from named <name-of-graph> 
{ 
    ?s ?p ?o 
} 

select * { 
    graph <name-of-graph> { 
    ?s ?p ?o 
    } 
} 

請參閱13.2 Specifying RDF Datasets13.3 Querying the Dataset瞭解全部細節和更多示例。

+0

謝謝。我在「http:// prova/File1」和「http:// prova/File2」中更改了名稱。當我運行select * { graph?g?p?o } }時,我在名爲「g」的列中得到以下值:「http:// prova/File1」和「http:// PROVA /文件2" 。 然後,當我運行select * from { ?s?p?o }時,我得到了兩個模型的結果。當我運行select * {0} prova/File1> { ?s?p?o } }時,我會得到相同的結果。爲什麼? – Musich87

+0

我認爲這是因爲您不斷將所有數據加載到默認模型中,然後將默認模型添加爲命名模型。由於loadModel的實現,所有的模型都是相同的。 –

+0

我該如何解決這個問題? – Musich87