gpt4 book ai didi

java - 为什么会出现此异常 com.hp.hpl.jena.reasoner.rulesys.Rule$ParserException : In Using Apache Jena Reasoner?

转载 作者:行者123 更新时间:2023-11-30 02:39:14 26 4
gpt4 key购买 nike

这是我的代码:

public class FunctionalityCheckTest1 {

InfModel infModel;
Model model = ModelFactory.createDefaultModel();
String NS = "http://myweb.com/vocab#";

@Test
public void playingWithJenaReasoner()
{
Resource alex = this.model.createResource(NS+"Alex");
Resource bob = this.model.createResource(NS+"Bob");
Resource alice = this.model.createResource(NS+"Alice");
Property isFriendOf = this.model.createProperty(NS,"isFriendOf");
alex.addProperty(isFriendOf,bob);
bob.addProperty(isFriendOf,alice);
StmtIterator stmtIterator1 = this.model.listStatements();
while (stmtIterator1.hasNext())
{
System.out.println(stmtIterator1.next());
}

String customRule = "@prefix vocab: <http://myweb.com/vocab#>. " +
"[rule1: (?a vocab:isFriendOf ?b) (?b vocab:isFriendOf ?c) -> (?a vocab:isFriendOf ?c) ]";

List<Rule> rules = new ArrayList<>();
rules.add(Rule.parseRule(customRule));

GenericRuleReasoner reasoner = new GenericRuleReasoner(rules);
reasoner.setDerivationLogging(false);
this.infModel = ModelFactory.createInfModel(reasoner, this.model);
StmtIterator stmtIterator2 = this.infModel.listStatements();
while (stmtIterator2.hasNext())
{
System.out.println(stmtIterator2.next());
}
}

}

执行playWithJenaReasoner()函数时会抛出错误:
com.hp.hpl.jena.reasoner.rulesys.Rule$ParserException:子句开头应有“(”,找到词汇:
来自行rules.add(Rule.parseRule(customRule) ));

如果我将这些更改添加到上面的代码中,一切都会正常

PrintUtil.registerPrefix("vocab",NS);
String customRule = "[rule1: (?a vocab:isFriendOf ?b) (?b vocab:isFriendOf ?c) -> (?a vocab:isFriendOf ?c) ]";

这有什么问题

String customRule = "@prefix vocab: <http://myweb.com/vocab#>. " +
"[rule1: (?a vocab:isFriendOf ?b) (?b vocab:isFriendOf ?c) -> (?a vocab:isFriendOf ?c) ]";

在此Jena Documentation ,他们提到了 @prefix 和规则。我哪里做错了?

最佳答案

我今天遇到了同样的问题,这似乎是方法

public static List<Rule> parseRules(String source)

不允许在字符串中使用前缀。我不确定这是该方法的错误还是功能。

但是,如果您在规则文件中声明规则并通过

加载它

public static List<Rule> rulesFromURL(String uri)

您应该能够加载包含前缀的规则。

这是一个小例子来测试这是否有效。它假设您的本体存储在文件系统的某个位置,并且有一个名为 jena.rule 的规则文件。在你的类路径中:

public class JenaRuleTest {

public static void main(String[] args) throws UnsupportedEncodingException {

OntModel model = ModelFactory.createOntologyModel();
model.read("C:\\path\\to\\ontology\\ontology.ttl");

String ruleResourceStr = JenaRuleTest.class.getResource("/jena.rule").toString();

Reasoner reasoner = new GenericRuleReasoner(Rule.rulesFromURL(ruleResourceStr));
reasoner.setDerivationLogging(true);

InfModel inf = ModelFactory.createInfModel(reasoner, model);
inf.write(System.out, "TURTLE");
}
}

可以在此处找到更详细的示例:http://tutorial-academy.com/jena-reasoning-with-rules/

Rule 的文档类可以在这里找到:https://jena.apache.org/documentation/javadoc/jena/org/apache/jena/reasoner/rulesys/Rule.html

希望有人遇到此问题时能有所帮助。

问候

关于java - 为什么会出现此异常 com.hp.hpl.jena.reasoner.rulesys.Rule$ParserException : In Using Apache Jena Reasoner?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42266076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com