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


推断可能会更有效,因为它不需要大型内存模型。但是,它在计算的推论中受到限制。

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

10-04 12:34