如何获取 CycAccess 对象?

How to get a CycAccess object?

ResearchCyc 中有一个名为 random-assertion 的 lisp 函数。我想从一些 Java 代码中调用它。我正在使用 Cyc Core API Suite v1.0.0-rc5(来自 http://dev.cyc.com),但我看不到任何调用底层 Lisp 代码的方法。

在旧的 OpenCyc API 中有一个名为 CycAccess 的对象,您可以使用它,但我不知道如何获得它。如果我能找到它,我会称之为

access.converseObject("(随机断言)");

至少在 ResearchCyc 中,这将从 Cyc 知识库中检索伪随机断言。不确定它是否可以在 OpenCyc 中工作,但它也可能在那里工作。

谁能解释一下如何通过 Cyc 的 java API 调用这样的 lisp 代码?

(免责声明:我是 Cyc APIs 的开发者之一...)

Core API Suite 的参考实现是 Core Client,它基于 Base Client...,后者又派生自旧的 OpenCyc API。因此,绝对有可能以几种不同的方式在 ResearchCyc 上调用任意 lisp (SubL) 代码...

首先,已经有一个包装随机断言的方法:

try {
  CycAccess access = CycAccessManager.getCurrentAccess();
  CycAssertion cycAssertion = access.getLookupTool().getRandomAssertion();
} catch (SessionException ex) {
  // Do something with the exception...
} catch (CycConnectionException connEx) {
  // Do something else...
}

不过,就一般情况而言,您会发现语法与 OpenCyc 非常相似 API:

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)");
  ...

但是,Base Client 通过 com.cyc.baseclient.subl.SublFunction 接口添加了一种封装 SubL 函数的新方法。 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 客户端中的实现 类 将您的结果转换为 KBObjects。例如:

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()
}