带推断的Sparql查询

带推断的Sparql查询,sparql,ontology,jena,Sparql,Ontology,Jena,我有一些rdf&rdfs文件,我想使用jena 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.createO

我有一些rdf&rdfs文件,我想使用jena 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();

提前感谢。

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

虽然您可以直接使用,但通常最简单的方法是使用所需的推理支持度:

Model model = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM_RDFS_INF );
如果需要不同的推理器或OWL支持,可以选择不同的
OntModelSpec
常量。请注意,大型和/或复杂模型可能导致查询速度较慢

更新(编辑原始问题后)

要对两个模型进行推理,您需要工会。您可以通过
OntModel
的子模型事实性来实现这一点。我将对您的示例进行如下更改(注意:我尚未测试此代码,但它应该可以工作):

String rdfFile=“…您的RDF文件位置…”;
模型源=FileManager.get().loadModel(rdfFile);
String ontFile=“…您的本体文件位置…”;
Model ont=FileManager.get().loadModel(ontFile);
模型m=ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF,ont);
m、 添加子模型(源);
字符串查询字符串=
“前缀rdf:”
+“前缀wn:”
+“选择?个人”
+“其中{”
+“?人员rdf:类型wn:人员。”
+ "      }";
Query=QueryFactory.create(queryString);
QueryExecution qe=QueryExecutionFactory.create(query,m);
ResultSet results=qe.execSelect();
ResultSetFormatter.out(System.out、结果、查询);
qe.close();

感谢您的帮助,我正在使用此模型加载我要查询的rdf,但是如何加载本体文件(.rdf)并在查询运行时使用它进行推断?请参阅
model.read()
FileManager.readModel()
的Javadocs。就个人而言,我会使用
FileManager
路径。如果您有与第一个问题相关的第二个查询,您应该向StackOverflow发布一个新问题。因此,这不是一个真正的线程讨论论坛,而是一种收集好问题和好答案的方式。顺便说一句,这就是为什么你应该接受满足你问题的答案——这有助于其他用户找到好的答案。
Model model = ModelFactory.createOntologyModel( OntModelSpec.RDFS_MEM_RDFS_INF );
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();