gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:35:52 25 4
gpt4 key购买 nike

我想使用 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 hasSpecialX some X

显式存储的是以下数据:
SomeObject a Object 
SomeX a X
SomeObject hasSpecialX SomeX

使用以下查询,我想确定一个实例属于哪个类。根据所做的假设,只应返回“SomeObject”。
SELECT ?x WHERE { ?x :hasX :SomeX . } 

但是,查询 ds.getDefaultModel()不起作用,因为数据没有明确存储。当我使用时 infModel另一方面,查询永远不会完成。在中止之前,我最长等待了 25 分钟。 (triplestore 的大小约为 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 .那我还能做什么?

最佳答案

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

如果直接使用推断数据没有获得预期的性能,那么我建议转向更具可扩展性的三元组存储( 4storeVirtuoso )。

关于sparql - Jena:如何推断数据/性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10181183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com