2011-05-14 73 views
4

我有一些RDF & RDFS文件,我想用耶拿SPARQL实现查询它和我的代码如下所示:SPARQL查询随着推论

//model of my rdf file 
Model model = ModelFactory.createMemModelMaker().createDefaultModel(); 
model.read(inputStream1, null); 
//model of my ontology (word net) file 
Model onto = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF); 
onto.read(inputStream2,null); 
    String queryString = 
         "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " 
         + "PREFIX wn:<http://www.webkb.org/theKB_terms.rdf/wn#> " 
         + "SELECT ?person " 
         + "WHERE {" 
         + " ?person rdf:type wn:Person . " 
         + "  }"; 

    Query query = QueryFactory.create(queryString); 
    QueryExecution qe = QueryExecutionFactory.create(query, ????); 
    ResultSet results = qe.execSelect(); 
    ResultSetFormatter.out(System.out, results, query); 
    qe.close(); 

和我有一个WORDNET本体的RDF文件,我想在我的查询中使用这个本体来做自动推理(当我查询人的查询应该返回例如男人,女人) 那么如何将本体与我的查询连接?请帮帮我。

更新:现在我有两个模型:从哪个我应该运行我的查询?

QueryExecution qe = QueryExecutionFactory.create(query, ????); 

在此先感谢。

回答

6

关键是要认识到,在耶拿,Model是中央抽象的一个。推理模型只是一个Model,其中一些三元组存在,因为它们是由推理规则引起的,而不是从源文档读入。因此,您只需更改示例的第一行,即最初创建模型的位置。

虽然您可以create inference models直接,它往往是最简单的只是create an OntModel所要求的推理支持度:

Model model = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF); 

如果你想有一个不同的推理,或OWL支持,您可以选择不同的OntModelSpec不变。请注意,大型和/或复杂模型可能导致查询速度缓慢。

更新(以下原题的编辑)

理性了两个模型,你想要的工会。你可以通过OntModel的sub-model factivity来做到这一点。我会改变您的示例如下(注意:我还没有测试此代码,但它应该工作):

String rdfFile = "... your RDF file location ..."; 
Model source = FileManager.get().loadModel(rdfFile); 

String ontFile = "... your ontology file location ..."; 
Model ont = FileManager.get().loadModel(ontFile); 

Model m = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF, ont); 
m.addSubModel(source); 

String queryString = 
        "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> " 
        + "PREFIX wn:<http://www.webkb.org/theKB_terms.rdf/wn#> " 
        + "SELECT ?person " 
        + "WHERE {" 
        + " ?person rdf:type wn:Person . " 
        + "  }"; 

Query query = QueryFactory.create(queryString); 
QueryExecution qe = QueryExecutionFactory.create(query, m); 
ResultSet results = qe.execSelect(); 
ResultSetFormatter.out(System.out, results, query); 
qe.close(); 
+0

感谢您的帮助,我使用这个模型来加载我RDF,我要查询,但如何在查询运行时加载本体文件(.rdf)并将其用于推理? – Radi 2011-05-15 15:20:49

+0

查看Javadocs的'Model.read()'或'FileManager.readModel()'。就个人而言,我会使用'FileManager'路线。 – 2011-05-15 17:48:13

+0

请检查我的编辑。谢谢 – Radi 2011-05-16 18:33:46