首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得CycAccess对象?

如何获得CycAccess对象?
EN

Stack Overflow用户
提问于 2016-02-08 18:12:44
回答 1查看 91关注 0票数 1

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

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

Access.converseObject(“随机-断言”);

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

有人能解释如何通过Cyc的java API调用这样的lisp代码吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-09 18:25:27

(免责声明:我是Cyc API的开发人员之一)

Core套件的参考实现是基于based的Core客户端。这反过来又是从旧的OpenCyc API派生出来的。因此,绝对有可能在ResearchCyc上调用任意的lisp (ResearchCyc)代码,以几种不同的方式.

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
  ...
  CycAccess access = CycAccessManager.getCurrentAccess();
  CycObject cycAssertion = access.converse().converseCycObject("(random-assertion)");
  ...

但是,Base通过SubL接口添加了一种封装com.cyc.baseclient.subl.SublFunction函数的新方法。SublFunction接口本身是非常小的,但是在com.cyc.baseclient.subl.subtypes下有许多类可以为您提供可扩展的实现。例如,如果您正在调用一个no-arg函数并期望返回一个CycObject,您可以像这样扩展SublCycObjectNoArgFunction:

代码语言:javascript
复制
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...
}

(有关这方面的其他示例,请参见Base中的com.cyc.baseclient.subl.function.*。)

这种方法使将SubL函数定义为静态字段变得相当简单,而无需编写(或重写)大量代码。我们期望核心客户端逐步向这种方法迁移。

最后,可以使用KB客户机中的实现类将结果转换为KBObjects。例如:

代码语言:javascript
复制
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()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35276397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档