如何获取CycAccess对象?

时间:2016-02-08 18:12:45

标签: opencyc

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

在旧的OpenCyc API中,有一个名为CycAccess的对象可供您使用,但我无法弄清楚如何获取。如果我能找到它,我就称之为

access.converseObject("(随机断言)&#34);

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

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

1 个答案:

答案 0 :(得分:0)

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

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

首先,已经存在一个包含随机断言的方法:

$('li').on('tap',function(){
    // Only make the elements selectable when parent is not scrolling
    if(checklist_scroll%2===0){
        // Select the li
    }
});

对于一般情况,您会发现语法与OpenCyc API非常相似:

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

或者,如果可以安全地假设结果是CycObject:

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...
}

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

  ...
  CycAccess access = CycAccessManager.getCurrentAccess();
  CycObject cycAssertion = access.converse().converseCycObject("(random-assertion)");
  ...

(有关其他示例,请参阅Base Client中的com.cyc.baseclient.subl.functions。*。)

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

最后,您可以使用KB Client中的实现类将结果转换为KBObject。例如:

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...
}