Jena:如何推断数据/性能问题

Posted

技术标签:

【中文标题】Jena:如何推断数据/性能问题【英文标题】:Jena: How to infer data / performance issues 【发布时间】:2012-04-28 04:47:21 【问题描述】:

我想使用 Jena 的推理功能,但在使用 InfModel 时遇到了一些性能问题。

这是我的本体的简化概述:

属性:

hasX            (Ranges(intersection): X, inverse properties: isXOf)
|-- hasSpecialX (Ranges(intersection): X, inverse properties: isSpecialXOf)

isXOf           (Domains(intersection): X, inverse properties: hasX)
|--isSpecialXOf (Domains(intersection): X, inverse properties: hasSpecialX)

还有一个类'Object':

Object hasSpecialX some X

显式存储的是以下数据:

SomeObject a Object 
SomeX a X
SomeObject hasSpecialX SomeX  

使用以下查询,我想确定一个实例属于哪个类。根据所做的假设,应该只返回“SomeObject”。

SELECT ?x WHERE  ?x :hasX :SomeX .  

但是,查询ds.getDefaultModel() 不起作用,因为数据没有显式存储。另一方面,当我使用infModel 时,查询永远不会完成。在中止之前,我一直在等待 25 分钟。 (三重存储的大小约为 180 MB)

这是我的代码:

OntModel ont = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM_MICRO_RULE_INF, null); 
ont.read("file:..." , "RDF/XML"); 

Reasoner reasoner = ReasonerRegistry.getOWLMicroReasoner(); 
reasoner = reasoner.bindSchema(ont); 

Dataset dataset = TDBFactory.createDataset(...); 
Model model = dataset.getDefaultModel(); 

InfModel infModel = ModelFactory.createInfModel(reasoner, model);

QueryExecution qe = null;
ResultSet rs;

try 
    String qry = "SELECT ?x WHERE  ?x :hasX :SomeX . "; 
    qe = QueryExecutionFactory.create(qry, infModel); 
    rs = qe.execSelect(); 

    while(rs.hasNext()) 
        QuerySolution sol = rs.nextSolution(); 
        System.out.println(sol.get("x"));
    
 finally 
    qe.close();
    infModel.close();
    model.close(); 
    dataset.close();

上面的代码有什么问题吗,或者还有什么原因导致它不起作用?

除此之外,我想知道如果我执行“将推断公理导出为本体”(由 Protege 提供)是否可以提高性能?

编辑: 我同时尝试使用 Pellet,但我仍然无法得到推断模型,正如我在另一个问题中所描述的那样:OutOfMemoryError using Pellet as Reasoner。那我还能做什么呢?

【问题讨论】:

【参考方案1】:

关于性能,最好在断言数据之前进行推理,而不是在关闭 Jena 推理机制的情况下执行 SPARQL。您已经在使用 TDB,它是适合大型数据集的 Jena 组件。

如果直接使用推断数据没有获得预期的性能,那么我建议迁移到更具可扩展性的三重存储(4store 或 Virtuoso)。

【讨论】:

感谢您的回答!不过,我不确定如何“在断言数据之前进行推理”。你能解释一下怎么做吗? 为此,您可以使用任何推理器,例如 Pellet。 我想我可以使用infModel.getDeductionsModel() 访问推断的模型,但是计算需要一段时间,并且由我上面的代码引起的性能问题可能是因为在内部将推断应用于整个数据库。但由于我的本体仍在变化,我不想将推断的数据物理存储在同一个 TDB 中。那么在这种情况下,最佳实践是什么?推断的数据通常存储在不同的三元存储中吗?

以上是关于Jena:如何推断数据/性能问题的主要内容,如果未能解决你的问题,请参考以下文章

setSameAs() 关联数据 --- Jena

Swift 显式与推断类型:性能

不同 ML 分类器的不同性能,我能推断出啥?

Spark 任务推断执行机制

在 Apache Jena Fuseki 中压缩数据集

如何使用Keras OCR示例推断新图像?