java - 带 TDB 的 Jena 规则引擎

标签 java jena rule-engine tdb jena-rules

我正在将数据加载到 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/

相关文章:

java - 在 springboot aws lambda 中注入(inject)服务

java - Apache Jena 保存 ttl 文件

java - Sparql 查询永远运行

java - Drools 嵌套聚合

java - 使用 Drools fluent API 即时更改规则的示例

java - Android 中按钮的边距未以编程方式设置

java - 我可以在哪里使用线程来改进这些方法?

java - 驱动器已满或空间不足的 IOException

java - 如何将 Jena 与 Maven 结合使用

java - Drools 中的非模板动态规则