Как получить объект 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()
}
Другие вопросы по тегам