Как использовать пустой узел в правилах Datalog для GenericRuleReasoner?

Я использую GenericRuleReasoner для вывода виртуального факта в моей онтологии. GenericRuleReasoner принимает правила вывода в качестве правила ввода данных, как объясняется в поддержке вывода jena. Вот пример DatalogRule, присоединенного к универсальному аргументу:

String rules = "[r1: (?e1 st:runningTask st:gic_eth0) -> (?e1 rdf:type st:dataFromEthernet2IP)]";
Reasoner reasoner = new GenericRuleReasoner(Rule.parseRules(rules));
reasoner.setDerivationLogging(true);
InfModel inf = ModelFactory.createInfModel(reasoner, rawData);

Когда я проверил этот код на моих данных, он работал нормально и обнаружил 2000 виртуальных фактов. Тем не менее, когда я изменил правило Datalog, чтобы создать пустые узлы, как это

String rules = "[r1: (?e1 st:runningTask st:gic_eth0) -> (_:p rdf:type st:dataFromEthernet2IP)]";

Я получаю только на основании фактического факта.

Есть ли проблема с моим пустым представлением узла в правиле регистрации данных для GenericRuleReasoner?

1 ответ

Решение

Есть ли проблема с моим пустым представлением узла в правиле регистрации данных для GenericRuleReasoner?

Да. Вы не используете пустые узлы, как это в правилах Йены. Документ, на который вы ссылаетесь, содержит грамматику для правил, и в ней нет ничего, что позволяло бы что-то вроде _:p как узел. Синтаксис для узлов в правилах Jena:

node      :=   uri-ref               // e.g. http://foo.com/eg
          or   prefix:localname      // e.g. rdf:type
          or   <uri-ref>             // e.g. <myscheme:myuri>
          or   ?varname              // variable
          or   'a literal'           // a plain string literal
          or   'lex'^^typeURI        // a typed literal, xsd:* type names support

Если вы хотите создать новый пустой узел, используйте makeTemp(?x) Булитин в теле правила связывать ?x в новый пустой узел. Например,

[r1: (?e1 st:runningTask st:gic_eth0), makeTemp(?p)
     ->
     (?p rdf:type st:dataFromEthernet2IP) ]
Другие вопросы по тегам