(聲明:我的的Cyc的API的開發者之一...)
核心API套件的參考實現是核心客戶,這是基於基本的客戶端...而這又是從舊的OpenCyc API派生而來的。所以,這是絕對有可能調用任意口齒不清上ResearchCyc(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.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 Client中的實現類將結果轉換爲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()
}
很好。經過深入挖掘,我能夠找到像您的「一般案例」一樣的例子,並且運行良好。我將不得不嘗試SublCycObjectNoArgFunction及其親屬。 – DaveS