如何在LogiQL中创建autoNumbered谓词?

时间:2015-09-24 12:10:16

标签: logicblox logiql

我想知道如何使用LogicBlox / LogiQL中的autoNumbered refmode谓词

我按照manual中的示例进行了操作,但是在将实例断言到实体谓词时遇到了问题,第一个将被添加,但后续尝试不会。

以下是我在LB交互式shell中尝试做的事情:

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

1 个答案:

答案 0 :(得分: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有用的地方。 e.g。

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

请注意,每个工作区的每个事务的事务:id是唯一的。这意味着在同一个事务中,您只获得一个事务:id,如果您想在同一个事务中创建多个auto实体,则必须对事务进行一些计算:id以获取其中的更多唯一数字交易。

还有一个uid系列函数,它也可以帮助生成唯一的id。但是你必须有一些独特的东西来使用它来生成。我不确定这会对你有所帮助,但如果上述情况不能让你知道的话,请告诉我,我们可以探讨一下uid是否可以提供帮助。