Sparql查询与推理

时间:2011-05-14 16:10:14

标签: 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.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();

我在rdf文件中有一个wordNet Ontology,我想在我的查询中使用这个本体自动进行推理(当我查询查询的人应该返回例如。男人,女人) 那么如何将本体链接到我的查询?请帮帮我。

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

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

提前感谢。

1 个答案:

答案 0 :(得分:6)

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

虽然你可以直接create inference models,但对create an OntModel提供所需的推理支持程度通常最简单:

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

如果您需要不同的推理器或OWL支持,则可以选择不同的OntModelSpec常量。请注意,大型和/或复杂模型可能会导致查询速度变慢。

更新(编辑原始问题后)

要推理两个模型,您需要联合。您可以通过OntModel的子模型功能来实现此目的。我会改变你的例子如下(注意:我没有测试过这段代码,但它应该可以工作):

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();