【问题标题】:Reasoner in Virtuoso Jena programVirtuoso Jena 程序中的推理器
【发布时间】:2019-05-08 11:05:49
【问题描述】:

我正在使用 Virtuoso Jena Provider 来查询上传到 Virtuoso 上的图表,但我还想在查询中添加推理。

我已尝试过此代码,但在 .execSelect(); 行出现错误

Exception in thread "main" java.lang.NullPointerException
    at mypackage.Main.main(Main.java:49)

这是我目前尝试过的代码。

VirtGraph vg = new VirtGraph(graph, url, username, password);
VirtModel model = new VirtModel(vg);
InfModel ont = ModelFactory.createInfModel(ReasonerRegistry.getOWLReasoner(), model);
Query sparql = QueryFactory.create("PREFIX sosa: <http://www.w3.org/ns/sosa/>\r\n" + 
                "PREFIX ex: <http://example.org/data/>\r\n" + 
                "SELECT ?s ?o FROM <http://147.27.60.65/sensorOntology> WHERE {?s sosa:isHostedBy ?o}");
QueryExecution vqe = VirtuosoQueryExecutionFactory.create(sparql, ont);
ResultSet results = vqe.execSelect();

向我的图表添加推理器的正确方法是什么?如何查询结果集?

这些是我正在使用的版本: 耶拿:3.1 JDBC:4 大师级:6

编辑 我从https://github.com/stardog-union/pellet 安装了 Pellet reasoner,但我只能正确推断存储在我的电脑上并加载到 Jena 上的 .owl 文件,但我仍然无法推断作为 virtuoso 图上传的相同文件。

【问题讨论】:

标签: java jena virtuoso reasoner openlink-virtuoso


【解决方案1】:

VirtuosoQueryExecutionFactory 只能与 VirtGraph/VirtModel 数据源一起使用。

如果您想对 InfModel 数据源执行查询,您必须使用 Jena 查询引擎。

正确的例子是在Virtuoso Jena Example14 => 在public static void test4() { ... }

来自test4()的代码

...
    public static void exec_select(String header, Model m, String query) {
        String h = header==null?"":header;
        System.out.println("===========["+h+"]==========");
        System.out.println("Exec: "+ query);
        Query jquery = QueryFactory.create(query) ;
        QueryExecution qexec = QueryExecutionFactory.create(jquery, m) ;
        ResultSet results =  qexec.execSelect();
        ResultSetFormatter.out(System.out, results, jquery);
        qexec.close();
        System.out.println("============================\n");

    }

...

    public static void test4() {
        try {
            System.out.println("--------------- TEST 4 -------------------");
            VirtModel vdata = VirtModel.openDatabaseModel("test:inf4", URL, uid, pwd);
            vdata.removeAll();

            String NS = PrintUtil.egNS;
            Resource c1 = vdata.createResource(NS + "C1");
            Resource c2 = vdata.createResource(NS + "C2");
            Resource c3 = vdata.createResource(NS + "C3");
            vdata.add(c2, RDFS.subClassOf, c3);
            vdata.add(c1, RDFS.subClassOf, c2);
            OntModel om = ModelFactory.createOntologyModel(OntModelSpec.RDFS_MEM_RDFS_INF, vdata);

            exec_select("Data in DB", vdata, "select * where {?s ?p ?o}");

            exec_select("Data in Ontology Model", om, "select * where {?s ?p ?o}");

            exec_select("Data in Ontology", om, "select * where {<"+c1+"> <"+RDFS.subClassOf+"> ?o}");

        } catch (Exception e) {
            System.out.println("ERROR Test Failed.");
            e.printStackTrace();
        }
    }

【讨论】:

  • 问题是我的三元组在图中,我可以使用 VirtGraph 访问它们,但无法使用 OntModel/InfModel 访问它们。当我使用您指出的示例时,我得到一个空集。 ``` ===========[数据库中的数据]========== 执行:select * where {?s ?p ?o} -------- ----- |小号 | p | ○ | ============= ------------- ======================== ==== ```
  • 在您指出的示例中,还有正在使用的变量 _ruleset。我应该如何创建它。使用像 Pellet 这样自行推理的推理器不是很重要吗?
  • 您确定,您检查了上面链接中的示例吗?你在哪里找到了示例中的 var _ruleset? var _ruleset us 使用了另一个示例。
  • 1. 当您使用VirtuosoQueryExecutionFactory 时,查询在服务器端执行,数据存储在 VirtuosoDB 中。 2. 当您使用 Jena Query Engine 时,查询是在客户端执行的,Jena Query 引擎可以使用来自客户端和服务器端的所有数据,但它会运行得更慢。 3. Jena 默认只将推理相关的三元组(用于 OntModel/InfModel)存储在客户端的内存中。
  • 使用的这个规则集变量是什么。我应该如何生成它。我在 protege 上构建了我的本体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多