我正在将数据加载到 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
Infer 可以更高效,因为它不需要大的内存模型。但是,它计算的推论受到限制。
关于java - 带 TDB 的 Jena 规则引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604792/