Почему возникает это исключение com.hp.hpl.jena.reasoner.rulesys.Rule$ParserException: при использовании Apache Jena Reasoner?

Вот мой код:

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 с правилом . Где я делаю неправильно?


person Badman    schedule 16.02.2017    source источник


Ответы (1)


Я столкнулся с той же проблемой, что и у вас сегодня, и похоже, что метод

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

Надеюсь, это поможет, если кто-то столкнется с этой проблемой.

Привет

person Scyla101    schedule 18.07.2017