Java 如何在给定名称的Jena TDB上查询模型

Java 如何在给定名称的Jena TDB上查询模型,java,rdf,jena,triplestore,tdb,Java,Rdf,Jena,Triplestore,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, dat

我有个问题

我正在尝试在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;
}
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();
}
特别是,我有两个文件,我想在Jena TDB上加载这些文件。我在互联网上读到,我可以使用“addNamedModel”为我的模型添加一个名称。在上面的代码中,我添加了名称“File1”和“File2”

现在,我想查询此数据集,并尝试编写以下代码:

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;
}
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”)的模型的查询结果。事实上,如果这样编写查询,我将得到两个模型的结果


我怎么能实现呢?

你没有使用绝对虹膜来命名你的图形,所以我不知道你的图形名称会是什么。您可以使用这样的查询来帮助找出它们是什么:

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
  }
}
选择*
从命名
{
?s?p?o
}
选择*{
图{
?s?p?o
}
}

有关详细信息和更多示例,请参见和。

您没有使用绝对虹膜来命名图形,因此我不知道您的图形名称。您可以使用这样的查询来帮助找出它们是什么:

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
  }
}
选择*
从命名
{
?s?p?o
}
选择*{
图{
?s?p?o
}
}

有关详细信息和更多示例,请参见和。

谢谢。我已更改“”和“”中的名称。当我运行select*{graph?g{s?p?o}}时,我在名为“g”的列中得到以下值:“和”。然后,当我从命名的{s?p?o}运行select*时,我得到两个模型的结果。我在运行select*{graph{s?p?o}时得到了相同的结果。为什么?我认为这是因为您一直将所有数据加载到默认模型中,然后将默认模型添加为命名模型。由于loadModel实现,所有模型最终都是相同的before
FileManager.get().readModel(tdb,源代码,“RDF/XML”)。执行类似于
Model Model=ModelFactory.createDefaultModel()的操作取而代之。然后,您将创建一个新的模型,当您将其添加为命名图时,不会出现冲突。谢谢Joshua。我已在“模型模型=模型工厂。createDefaultModel();”中更改了“模型tdb=dataset.getDefaultModel();”。如果我运行这个查询:“String qiry=“select*{graph{s?p?o}”;“我只得到model1Thanks的查询结果。我已更改“”和“”中的名称。当我运行select*{graph?g{s?p?o}}时,我在名为“g”的列中得到以下值:“和”。然后,当我从命名的{s?p?o}运行select*时,我得到两个模型的结果。我在运行select*{graph{s?p?o}时得到了相同的结果。为什么?我认为这是因为您一直将所有数据加载到默认模型中,然后将默认模型添加为命名模型。由于loadModel实现,所有模型最终都是相同的
before
FileManager.get().readModel(tdb,源代码,“RDF/XML”)。执行类似于
Model Model=ModelFactory.createDefaultModel()的操作取而代之。然后,您将创建一个新的模型,当您将其添加为命名图时,不会出现冲突。谢谢Joshua。我已在“模型模型=模型工厂。createDefaultModel();”中更改了“模型tdb=dataset.getDefaultModel();”。如果我运行这个查询:“String qiry=“select*{graph{s?p?o}”;“我只得到model1的查询结果