【问题标题】:Sparql Query With Inferencing带推理的 Sparql 查询
【发布时间】:2011-08-25 13:46:49
【问题描述】:

我有一些 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 本体,我想在我的查询中使用这个本体来自动进行推理(当我查询人时,查询应该返回,例如男人,女人) 那么如何将本体链接到我的查询?请帮帮我。

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

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

提前致谢。

【问题讨论】:

    标签: sparql ontology jena


    【解决方案1】:

    关键是要认识到,在耶拿,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();
    

    【讨论】:

    • 感谢您的帮助,我正在使用这个模型来加载我想要查询的 rdf,但是如何加载本体文件(.rdf)并在查询运行时使用它进行推理?跨度>
    • 查看Model.read()FileManager.readModel() 的Javadocs。就个人而言,我会使用FileManager 路由。
    • 如果您有与第一个问题相关的第二个查询,您真的应该向 StackOverflow 发布一个新问题。 SO 并不是一个真正的主题讨论论坛,而是一种收集好问题和好答案的方式。顺便说一句,这就是为什么您应该接受满足您问题的答案的原因 - 它可以帮助其他用户找到好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2011-08-14
    相关资源
    最近更新 更多