我正在TDB模型中加载我的数据,并使用Jena编写了一些规则,以便应用到TDB中。然后我将推断的数据存储到一个新的TDB中。
我在一个大约200kb的小数据集中应用了上面的情况,并且表达得很好。然而,我的实际TDB是2.7G,计算机已经运行了大约一周,实际上它仍然在运行。
这是正常的吗,还是我做错了什么?使用Jena规则引擎的替代方案是什么?
下面是一小段代码:
public class Ruleset {
private List<Rule> rules = null;
private GenericRuleReasoner reasoner = null;
public Ruleset (String rulesSource){
this.rules = Rule.rulesFromURL(rulesSource);
this.reasoner = new GenericRuleReasoner(rules);
reasoner.setOWLTranslation(true);
reasoner.setTransitiveClosureCaching(true);
}
public InfModel applyto(Model mode){
return ModelFactory.createInfModel(reasoner, mode);
}
public static void main(String[] args) {
System.out.println(" ... Running the Rule Engine ...");
String rulepath = "src/schemaRules.osr";
Ruleset rule = new Ruleset (rulepath);
InfModel infedModel = rule.applyto(data.tdb);
infdata.close();
}
}发布于 2013-07-12 16:50:27
持久化存储中的大型数据集与Jena的规则系统不匹配。基本问题是,在规则传播期间,RETE engine将对图进行许多小型查询。正如您所发现的,对任何持久性存储(包括TDB )执行这些查询的开销往往会导致执行时间过长,令人无法接受。
根据您使用推理的目标,您可能有一些替代方案:
如果您只想要一些基本的推断,例如rdfs:subClassOf层次结构的闭包,您可以使用infer命令行工具生成一个推理闭包,您可以将其加载到TDB中:
$ infer -h
infer --rdfs=vocab FILE ...
General
-v --verbose Verbose
-q --quiet Run with minimal output
--debug Output information for debugging
--help
--version Version information推断可能更有效,因为它不需要大的内存模型。但是,它仅限于它将计算的推论。
如果这些都不适合您,您可能需要考虑商业推理引擎,如OWLIM或Stardog。
发布于 2013-07-17 05:07:37
谢谢伊恩。
实际上,我可以按照DAVE的建议,通过SPARQL更新来完成这项工作,并且只用了10分钟就完成了。
以下是代码的示例:
System.out.println(" ... Load rules ...");
data.startQuery();
String query = data.loadQuery("src/sparqlUpdatesRules.tql");
data.endQuery();
System.out.println(" ... Inserting rules ...");
UpdateAction.parseExecute(query, inferredData.tdb);
System.out.println(" ... Printing RDF ...");
inferredData.exportRDF();
System.out.println(" ... closeing ...");
inferredData.close();下面是SPARQL更新的一个示例:
INSERT {
?w ddids:carries ?p .
} WHERE {
?p ddids:is_in ?w .
}; 感谢您的回答
https://stackoverflow.com/questions/17604792
复制相似问题