Как получить объект CycAccess?
В ResearchCyc есть функция lisp, называемая случайным утверждением. Я хочу назвать это из некоторого кода Java. Я использую Cyc Core API Suite v1.0.0-rc5 (с http://dev.cyc.com/), но я не вижу способа вызвать базовый код на Лиспе.
В старом API OpenCyc был объект под названием CycAccess, который вы могли бы использовать для этого, но я не могу понять, как его получить. Если бы я мог найти это, я бы назвал это
access.converseObject("(случайное утверждение)");
По крайней мере, в ResearchCyc это извлекло бы псевдослучайное утверждение из базы знаний Cyc. Не уверен, что он будет работать в OpenCyc, но он также может работать там.
Может кто-нибудь объяснить, как вызывать lisp-код таким образом через Java-API Cyc?
1 ответ
(Отказ от ответственности: я один из разработчиков Cyc APIs...)
Эталонной реализацией Core API Suite является Core Client, основанный на Base Client... который, в свою очередь, является производным от старого OpenCyc API. Таким образом, абсолютно возможно вызвать произвольный код lisp (SubL) в ResearchCyc несколькими различными способами...
Прежде всего, уже есть метод, который переносит случайное утверждение:
try {
CycAccess access = CycAccessManager.getCurrentAccess();
CycAssertion cycAssertion = access.getLookupTool().getRandomAssertion();
} catch (SessionException ex) {
// Do something with the exception...
} catch (CycConnectionException connEx) {
// Do something else...
}
Говоря об общем случае, вы обнаружите, что синтаксис довольно похож на API OpenCyc:
try {
CycAccess access = CycAccessManager.getCurrentAccess();
Object cycAssertion = access.converse().converseObject("(random-assertion)");
} catch (SessionException ex) {
// Do something with the exception...
} catch (CycConnectionException connEx) {
// Do something else...
}
Или, если можно предположить, что результатом будет CycObject:
...
CycAccess access = CycAccessManager.getCurrentAccess();
CycObject cycAssertion = access.converse().converseCycObject("(random-assertion)");
...
Однако базовый клиент добавляет новый способ инкапсуляции функций SubL через интерфейс com.cyc.baseclient.subl.SublFunction. Сам интерфейс SublFunction довольно минималистичен, но в com.cyc.baseclient.subl.subtypes есть ряд классов, которые предоставляют реализации для расширения. Например, если вы вызываете функцию без аргументов и ожидаете возврата CycObject, вы можете расширить SublCycObjectNoArgFunction следующим образом:
public static final SublCycObjectNoArgFunction RANDOM_ASSERTION_FUNCTION =
new SublCycObjectNoArgFunction("random-assertion");
...
try {
CycAccess access = CycAccessManager.getCurrentAccess();
CycObject cycAssertion = RANDOM_ASSERTION_FUNCTION.eval(access);
} catch (SessionException ex) {
// Do something with the exception...
} catch (CycConnectionException connEx) {
// Do something else...
}
(Другие примеры этого см. В com.cyc.baseclient.subl.functions.* В Базовом клиенте.)
Этот подход делает довольно простым определение функций SubL как статических полей без написания (или переписывания) большого количества кода. Мы ожидаем, что основной клиент постепенно перейдет к этому подходу.
Наконец, вы можете использовать классы реализации в клиенте KB для преобразования ваших результатов в объекты KBObject. Например:
try {
CycAccess access = CycAccessManager.getCurrentAccess();
CycObject cycAssertion = RANDOM_ASSERTION_FUNCTION.eval(access);
// To convert to a com.cyc.kb.Assertion:
Assertion assertion = AssertionImpl.get(cycAssertion);
// Or, to convert to a more general KBObject:
KbObject kbObj = KbObjectImpl.get(cycAssertion);
} catch (SessionException ex) {
// Do something with the exception...
} catch (CycConnectionException connEx) {
// Do something else...
} catch (KbTypeException ex) {
// Potentially thrown by AssertionImpl#get() & KbObjectImpl#get()
} catch (CreateException ex) {
// Also potentially thrown by AssertionImpl#get() & KbObjectImpl#get()
}