gpt4 book ai didi

java - 带有 TDB 的 Jena 规则引擎

转载 作者:行者123 更新时间:2023-11-30 09:20:04 25 4
gpt4 key购买 nike

我正在将我的数据加载到 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 可以更高效,因为它不需要大内存模型。但是,它在将要计算的推论方面受到限制。

如果这些都不适合您,您可能需要考虑商业推理引擎,例如 OWLIMStardog .

关于java - 带有 TDB 的 Jena 规则引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604792/

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