首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个异常在使用Apache推理器时会出现com.hp.hpl.jena.reasoner.rulesys.Rule$ParserException:?

为什么这个异常在使用Apache推理器时会出现com.hp.hpl.jena.reasoner.rulesys.Rule$ParserException:?
EN

Stack Overflow用户
提问于 2017-02-16 05:59:41
回答 1查看 493关注 0票数 1

这是我的代码:

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

}

在执行playingWithJenaReasoner()函数时,它会引发错误:

com.hp.hpl.jena.reasoner.rulesys.Rule$ParserException:预期的'(‘在子句的开头,找到了vocab:

Rules.add线(Rule.parseRule(CustomRule));

如果我将这些更改添加到上面的代码中,那么一切都可以正常工作。

代码语言:javascript
复制
PrintUtil.registerPrefix("vocab",NS);
String customRule = "[rule1: (?a vocab:isFriendOf ?b) (?b vocab:isFriendOf ?c) -> (?a vocab:isFriendOf ?c) ]";

所以这有什么不对

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

在这个耶拿文件中,他们提到了@前缀和规则。我哪里做错了?

EN

回答 1

Stack Overflow用户

发布于 2017-07-18 09:17:12

我遇到了你今天遇到的同样的问题,看起来就像一个方法

public static List<Rule> parseRules(String source)

不允许在字符串中使用前缀。我不确定这是一个bug还是这个方法的一个特性。

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

public static List<Rule> rulesFromURL(String uri)

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

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

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

如果有人面临这个问题,希望这会有所帮助。

问候

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

https://stackoverflow.com/questions/42266076

复制
相关文章

相似问题

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