带有打印内置规则的 Jena list 语句

Jena list statements with print builtin rule

我正在尝试了解 Jena 和 GenericRuleReasoner 的工作原理。我从 Apache Jena 教程中获取了这个。

[transitiveRule: (?A demo:p ?B), (?B demo:p ?C) -> (?A > demo:p ?C) ]
[symmetricRule: (?Y demo:p ?X) -> (?X demo:p ?Y) ]

如果我想添加另一个语句

[testPrintRule: (?X demo:p ?Y) -> print(?Y, "for testing")] //Print only this

我可以在打印命令中只列出语句吗?打印语句打印在控制台中。我想在我的 UI.

中显示

这就是我目前在耶拿(Jena)为获得三元组所做的事情。如果我说错了请见谅,我是初学者

Property p = ReadOntology.model.getProperty(ns + "demo:p");
List rules = Rule.rulesFromURL(FileLocations.getRulesLoc());
Reasoner reasoner = new GenericRuleReasoner( rules );
InfModel infModel = ModelFactory.createInfModel( reasoner, ReadOntology.model);

StmtIterator train = infModel.listStatements(null, p, (RDFNode)null);

好的,如果我理解正确的话,你有 2 个问题:

(1) 您想知道是否可以使用规则来打印您的三元组,并且

(2) 您想知道是否可以将 Jena 规则中的内容写入您的 GUI。

回答(1)

您可以通过

这样的规则打印您的三元组
[rulePrintTriples: (?s ?p ?o) -> print(?s, ?p, ?o)]

虽然我认为你不应该这样做,因为它可能效率很低。此外,Jena 已经有办法轻松做到这一点,即:

RDFDataMgr.write(System.out, model, RDFFormat.TTL);

回答(2)

是的,您可以有一个写入 GUI 的规则,但为此您必须创建自己的内置类型,如 here 所述。假设您的 GUI 使用某种 MVC 模式,您可以在使用自定义规则代码触发规则时更新 GUI 的模型。

同样,您是否想这样做可能会有疑问,因为在您的 GUI 尚未初始化的情况下它可能很脆弱。一种更稳健的方法是将三元组添加到 Jena 模型,然后在初始化 GUI 时,运行 对 Jena 模型进行 SPARQL 查询并以这种方式填充您的 GUI。

我写过耶拿规则here and here