我正在寻找Datalog的Jave实现,它不会评估不必要的规则。我看着IRIS reasoner这似乎是最稳定的一个。
但是,它会评估所有规则,而不仅仅是使用的规则。 举个例子:
parent('homer', 'bart').
parent('abe', 'homer').
ancestor(?a, ?b) :- parent(?a, ?b).
ancestor(?a, ?b) :- ancestor(?a, ?c), ancestor(?c, ?b).
// query.. find all parent-child pairs.
?-parent(?x, ?y).
我发现即使从未使用过,IRIS也会计算关系ancestor
。
还有哪些其他可用于Java的实现?有没有人执行这种优化?
答案 0 :(得分:0)
从IRIS网站引用OP链接到:
支持以下程序优化: - 规则过滤(删除无助于回答的规则) 查询) - 魔术集和侧身信息传递策略(SIPS)
答案 1 :(得分:0)
IRIS中有一个选项,
import org.deri.iris.optimisations.rulefilter.RuleFilter;
import org.deri.iris.Configuration;
Configuration config = new Configuration();
config.programOptmimisers.add(new RuleFilter());
然而,我无法让它发挥作用。我在使用的基础JGraphT库中得到了“循环异常”。
最后,我最终编写了自己的规则过滤器。这并不困难。 我们需要确保我们只包含在导致最终关系的规则尾部引用的规则。