Как использовать пустой узел в правилах 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) ]