2016-02-08 42 views
0

ResearchCyc中有一個名爲random-assertion的lisp函數。我想從一些Java代碼中調用它。我正在使用Cyc Core API Suite v1.0.0-rc5(從http://dev.cyc.com),但我沒有看到調用底層Lisp代碼的任何方法。如何獲取CycAccess對象?

在舊的OpenCyc API中有一個名爲CycAccess的對象,您可以使用它,但我無法弄清楚如何獲取它。如果我能找到它,我會稱之爲access.converseObject(「(random-assertion)」);

至少在ResearchCyc中,這將從Cyc知識庫中檢索僞隨機斷言。不知道它是否可以在OpenCyc中工作,但它也可能在那裏工作。

有人可以解釋如何通過Cyc的java API調用像這樣的lisp代碼嗎?

回答

0

(聲明:我的的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() 
} 
+0

很好。經過深入挖掘,我能夠找到像您的「一般案例」一樣的例子,並且運行良好。我將不得不嘗試SublCycObjectNoArgFunction及其親屬。 – DaveS