我正在将数据加载到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();
}
}
最佳答案
持久性存储中的大型数据集与Jena的规则系统不太匹配。基本问题是RETE engine将在规则传播过程中对图形进行许多小的查询。如您所知,对任何持久性存储(包括TDB)进行这些查询的开销往往会使执行时间过长,令人无法接受。
根据您采用推理的目标,您可能有一些选择:
将数据加载到足够大的内存图中,然后在单个事务中将推理闭包(基本图和附件)保存到TDB存储中。此后,您可以查询商店而不会产生规则系统的开销。显然,更新可能是这种方法的问题。
像现在一样,将数据存储在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。