【问题标题】:How I can query a model on Jena TDB given a name如何在 Jena TDB 上查询模型给定名称
【发布时间】:2014-07-16 14:30:51
【问题描述】:

我有一个问题。

我正在尝试在 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;
}

特别是,我有两个文件,我想将这些文件加载​​到 Jena 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”)的模型的查询结果。事实上,通过这样编写的查询,我得到了两个模型的结果。

如何实现?

【问题讨论】:

    标签: java rdf jena triplestore tdb


    【解决方案1】:

    您没有使用绝对 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 Datasets 和13.3 Querying the Dataset 了解完整详情和更多示例。

    【讨论】:

    • 谢谢。我已经更改了“prova/File1”和“prova/File2”中的名称。当我运行 select * { graph ?g { ?s ?p ?o } } 时,我在名为“g”的列中得到以下值:“prova/File1”和“prova/File2”。然后,当我运行 select * from named prova/File1> { ?s ?p ?o } 时,我得到了两个模型的结果。当我运行 select * { graph prova/File1> { ?s ?p ?o } } 时,我得到了相同的结果。为什么?
    • 我认为这是因为您不断将所有数据加载到默认模型中,然后将默认模型添加为命名模型。由于您的 loadModel 实现,您的所有模型最终都是相同的。
    • 不要做:Model tdb = dataset.getDefaultModel(); 在FileManager.get().readModel( tdb, source, "RDF/XML" ); 之前。改用Model model = ModelFactory.createDefaultModel(); 之类的方法。然后您将创建一个新模型,将其添加为命名图时不会发生冲突。
    • 谢谢约书亚。我已更改“模型 tdb = dataset.getDefaultModel();”在“模型模型 = ModelFactory.createDefaultModel();”中。如果我运行这个查询:"String qiry = "select * {graph prova/File1> { ?s ?p ?o }}";"我只得到model1的查询结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多