1

我正在尝试了解 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 中显示。

这就是我目前在耶拿为获得三分球所做的事情。如果我错了,我很抱歉,我是初学者。

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);
4

1 回答 1

2

好的,如果我理解正确,您有两个问题:

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

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

答案(1)

您可以通过以下规则打印您的三重奏

[rulePrintTriples: (?s ?p ?o) -> print(?s, ?p, ?o)]

尽管我认为您不应该这样做,因为它可能非常低效。此外,耶拿已经有办法轻松做到这一点,即:

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

答案(2)

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

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

我在这里这里写过关于耶拿规则的文章。

于 2018-04-19T10:12:46.737 回答