После того, как я написал встроенную функцию, что мне нужно сделать, чтобы ризонеры знали об этом?

Я написал собственный встроенный модуль для использования в своем проекте, но я действительно не знаю, как его использовать. Я написал два класса. В одном из них есть встроенная функция, которую я сделал (используя BaseBuiltin), а в другой я зарегистрировал новую встроенную функцию (используя BuiltinRegistry).

Я уже пробовал использовать встроенные функции по умолчанию, написав правила, которые их используют, в текстовом файле, читаемом из Eclipse с помощью Java. В этом случае у меня нет никаких проблем. Как я могу использовать встроенный модуль, который я построил? Должен ли я импортировать (или включать) что-то в некоторые файлы?


person user3563844    schedule 24.04.2014    source источник


Ответы (1)


Сначала вы определяете Builtin, обычно расширяя BaseBuiltin, а затем используете BuiltinRegistry.theRegistry.register(Builtin), чтобы сделать его доступным для вывода на основе правил Jena.

После того, как вы это сделаете, вам нужно использовать правило, которое будет ссылаться на ваш Builtin, чтобы активировать его.

BuiltinRegistry.theRegistry.register( new BaseBuiltin() {
    @Override
    public String getName() {
        return "example";
    }
    @Override
    public void headAction( final Node[] args, final int length, final RuleContext context ) {
        System.out.println("Head Action: "+Arrays.toString(args));
    }
} );

final String exampleRuleString =
    "[mat1: (?s ?p ?o)\n\t-> print(?s ?p ?o),\n\t   example(?s ?p ?o)\n]"+
    "";
System.out.println(exampleRuleString);

/* I tend to use a fairly verbose syntax for parsing out my rules when I construct them
 * from a string. You can read them from whatever other sources.
 */
final List<Rule> rules;
try( final BufferedReader src = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(exampleRuleString.getBytes()))) ) {
    rules = Rule.parseRules(Rule.rulesParserFromReader(src));
}

/* Construct a reasoner and associate the rules with it  */
final GenericRuleReasoner reasoner = (GenericRuleReasoner) GenericRuleReasonerFactory.theInstance().create(null);
reasoner.setRules(rules);

/* Create & Prepare the InfModel. If you don't call prepare, then
 * rule firings and inference may be deferred until you query the
 * model rather than happening at insertion. This can make you think
 * that your Builtin is not working, when it is.
 */
final InfModel infModel = ModelFactory.createInfModel(reasoner, ModelFactory.createDefaultModel());
infModel.prepare();

/* Add a triple to the graph: 
* [] rdf:type rdfs:Class
*/
infModel.createResource(RDFS.Class);

Вывод этого кода будет:

  • Строка правила прямой цепочки
  • Результат вызова print Builtin
  • Результат вызова примера Builtin

... что именно мы и видим:

[mat1: (?s ?p ?o)
    -> print(?s ?p ?o),
       example(?s ?p ?o)
]
-2b47400d:14593fc1564:-7fff rdf:type rdfs:Class 
Head Action: [-2b47400d:14593fc1564:-7fff, http://www.w3.org/1999/02/22-rdf-syntax-ns#type, http://www.w3.org/2000/01/rdf-schema#Class]
person Rob Hall    schedule 24.04.2014
comment
Я это попробую! Большое вам спасибо за вашу помощь! - person user3563844; 25.04.2014
comment
И снова здравствуйте! Я пробовал код. У меня только один вопрос. Где я могу использовать метод Head Action? Я имею в виду, моя программа печатает: 1) Строку правила прямой цепочки 2) Результат вызова встроенной печати Как я могу напечатать последний результат? Ваше здоровье! - person user3563844; 29.04.2014
comment
HeadAction вызывается, если ваш Builtin является следствием/результатом правило прямой цепочки. Он срабатывает всякий раз, когда срабатывает само правило (т. е. когда все предшествующие условия удовлетворены). «Результатом» является срабатывание правила и последующий вывод Head Action:.... - person Rob Hall; 29.04.2014
comment
Если этот ответ был удовлетворительным и помог вам решить вашу проблему, вы можете рассмотреть возможность отметки это принято. Это уменьшает количество вопросов без ответов. - person Rob Hall; 29.08.2014