Opencyc 如何获取CycacAccess对象?

Opencyc 如何获取CycacAccess对象?,opencyc,Opencyc,ResearchCyc中有一个lisp函数,叫做随机断言。我想从一些Java代码中调用它。我使用的是CycCoreAPI套件v1.0.0-rc5(从),但我看不到任何调用底层Lisp代码的方法 在旧的OpenCycAPI中,有一个名为CycAccess的对象,您可以使用它,但我不知道如何获得它。如果我能找到它,我会叫它 access.converseObject(“(随机断言)”) 至少在ResearchCyc中,这将从Cyc知识库中检索伪随机断言。不确定它是否能在OpenCyc中工作,但它也可

ResearchCyc中有一个lisp函数,叫做随机断言。我想从一些Java代码中调用它。我使用的是CycCoreAPI套件v1.0.0-rc5(从),但我看不到任何调用底层Lisp代码的方法

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

access.converseObject(“(随机断言)”)

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

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

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

核心API套件的参考实现是基于基本客户端的核心客户端。。。而这又是从旧的OpenCycAPI派生出来的。所以,在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)");
  ...
但是,基本客户端通过com.cyc.baseclient.SubL.SubL函数接口添加了一种封装SubL函数的新方法。SubFunction接口本身非常小,但是com.cyc.baseclient.subl.subtypes下有许多类,它们为您提供了可扩展的实现。例如,如果您正在调用一个no-arg函数,并期望返回一个CycObject,那么您可以像这样扩展子cycobjectnoarg函数:

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客户端中的实现类将结果转换为KB对象。例如:

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()
}
(免责声明:我是CYCAPI的开发者之一…)

核心API套件的参考实现是基于基本客户端的核心客户端。。。而这又是从旧的OpenCycAPI派生出来的。所以,在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)");
  ...
但是,基本客户端通过com.cyc.baseclient.SubL.SubL函数接口添加了一种封装SubL函数的新方法。SubFunction接口本身非常小,但是com.cyc.baseclient.subl.subtypes下有许多类,它们为您提供了可扩展的实现。例如,如果您正在调用一个no-arg函数,并期望返回一个CycObject,那么您可以像这样扩展子cycobjectnoarg函数:

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客户端中的实现类将结果转换为KB对象。例如:

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

伟大的经过大量的挖掘,我找到了一些类似于你的“一般案例”的例子,并且很好地发挥了作用。我很快就要尝试亚CycobjectNoArg函数及其相关函数了。太好了。经过大量的挖掘,我找到了一些类似于你的“一般案例”的例子,并且很好地发挥了作用。我很快就要尝试亚CycobjectNoArg函数及其相关函数。