如何获取 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()
}
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()
}