首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有TDB的Jena规则引擎

带有TDB的Jena规则引擎
EN

Stack Overflow用户
提问于 2013-07-12 06:45:27
回答 2查看 1.4K关注 0票数 2

我正在TDB模型中加载我的数据,并使用Jena编写了一些规则,以便应用到TDB中。然后我将推断的数据存储到一个新的TDB中。

我在一个大约200kb的小数据集中应用了上面的情况,并且表达得很好。然而,我的实际TDB是2.7G,计算机已经运行了大约一周,实际上它仍然在运行。

这是正常的吗,还是我做错了什么?使用Jena规则引擎的替代方案是什么?

下面是一小段代码:

代码语言:javascript
复制
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();
  }
}
EN

回答 2

Stack Overflow用户

发布于 2013-07-12 16:50:27

持久化存储中的大型数据集与Jena的规则系统不匹配。基本问题是,在规则传播期间,RETE engine将对图进行许多小型查询。正如您所发现的,对任何持久性存储(包括TDB )执行这些查询的开销往往会导致执行时间过长,令人无法接受。

根据您使用推理的目标,您可能有一些替代方案:

  • 将您的数据加载到一个足够大的内存图中,然后在单个事务中将推理闭包(基图加上蕴涵关系)保存到TDB存储中。此后,您可以在不产生规则系统开销的情况下查询存储。显然,更新可能是这种方法的一个问题。
  • 将您的数据放在TDB中,就像现在一样,但会动态地将一个子集加载到内存模型中,以便实时使用推理。使更新更容易(只要同时更新内存副本和持久存储),但需要对数据进行分区。

如果您只想要一些基本的推断,例如rdfs:subClassOf层次结构的闭包,您可以使用infer命令行工具生成一个推理闭包,您可以将其加载到TDB中:

代码语言:javascript
复制
$ 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

票数 2
EN

Stack Overflow用户

发布于 2013-07-17 05:07:37

谢谢伊恩。

实际上,我可以按照DAVE的建议,通过SPARQL更新来完成这项工作,并且只用了10分钟就完成了。

以下是代码的示例:

代码语言:javascript
复制
System.out.println(" ... Load rules ...");
    data.startQuery();
    String query = data.loadQuery("src/sparqlUpdatesRules.tql");
    data.endQuery();

    System.out.println(" ... Inserting rules ...");
    UpdateAction.parseExecute(query, inferredData.tdb);

    System.out.println(" ... Printing RDF ...");
    inferredData.exportRDF();

    System.out.println(" ... closeing  ...");
    inferredData.close();

下面是SPARQL更新的一个示例:

代码语言:javascript
复制
INSERT {
   ?w ddids:carries ?p .
} WHERE {
   ?p ddids:is_in ?w .
}; 

感谢您的回答

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17604792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档