2015-09-24 19 views
3

我不知道如何處理autoNumbered在LogicBlox refmode謂詞/ LogiQL如何在LogiQL中創建一個autoNumbered謂詞?

我跟着manual的例子,但然後我有麻煩主張的事實進入實體謂語,第一個將被添加,但隨後的嘗試會不是。

這是我試圖在LB互動殼裏做:

lb> create wibble 
created workspace 'wibble' 
lb wibble> addblock ' 
>auto(x), auto_id(x:id) -> int(id). 
>lang:autoNumbered(`auto_id). 
>cons_auto[] = x -> auto(x). 
>lang:constructor(`cons_auto).' 
added block 'block_1Z2ZWC0N' 
lb wibble> exec '+auto(x), +cons_auto[] = x.' 
lb wibble> popcount auto 
    1: auto 
lb wibble> exec '+auto(x), +cons_auto[] = x.' 
lb wibble> popcount auto 
    1: auto 

回答

3

這裏的問題是構造函數,cons_auto。該方式構造的工作是,對於每一個獨特的密鑰元組的構造,將創建一個唯一的實體,無論多少次,你斷言與相同的密鑰元組

構造您已經定義了一個構造函數沒有鑰匙。這意味着無論您執行增量規則聲明多少次,都會使用此構造函數創建一個實體。

可以定義構造函數有點不同,有例如一個鍵:

cons_auto_onekey[key] = x -> int(key), auto(x). 
lang:constructor(`cons_auto_onekey). 

現在你可以這樣做:

+cons_auto_onekey[1] = x, +auto(x). 

然後,

+cons_auto_onekey[2] = x, +auto(x). 

你會看到會創建兩個自動實體。

現在當然,我懷疑這不是你想要的 - 因爲你如何得到鑰匙?你讓自動編號實體的整個點可能是因爲你想自動生成「引用」。

這是transaction:id的用處。例如

+cons_auto_onekey[key] = x, +auto(x) <- 
    transaction:id[] = key. 

請注意,transaction:id對於每個事務,每個工作空間都是唯一的。這意味着在同一個事務中,你只能得到一個事務:id,如果你想在同一個事務中創建多個自動實體,你必須做一些事務處理:id來獲得更多的唯一數字交易。

還有一個uid系列函數可以幫助生成唯一的id。但是你必須有一些獨特的東西來使用它。我不確定這會幫助你,但讓我知道如果上述不足以讓你足夠好,我們可以探討uid是否可以提供幫助。

相關問題