Как только я напишу встроенный код, что мне нужно сделать, чтобы доводы об этом узнали?
Я написал собственный встроенный модуль для использования в своем проекте, но я не знаю, как его использовать. Я написал два класса. В одном из них есть встроенный мною BaseBuiltin
) и в другом я зарегистрировал новый встроенный (используя BuiltinRegistry
).
Я уже пытался использовать встроенные функции по умолчанию, записывая правила, которые используют их в текстовом файле, читаемом из Eclipse с использованием Java. В этом случае у меня нет никаких проблем. Как я могу использовать встроенный мной встроенный? Должен ли я импортировать (или включить) что-то в некоторые файлы?
1 ответ
Сначала вы определяете Builtin
обычно путем расширения BaseBuiltin
, а затем вы используете BuiltinRegistry.theRegistry.register(Builtin)
сделать его доступным для вывода на основе правил Йены.
Как только вы это сделаете, вам нужно использовать правило, которое будет ссылаться на ваш 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);
Выход этого кода будет:
- Строка правила прямой цепочки
- Результат вызова печати
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]