【问题标题】:How do I create a autoNumbered predicate in LogiQL?如何在 LogiQL 中创建自动编号谓词?
【发布时间】:2015-09-24 12:10:16
【问题描述】:

我想知道如何在 LogicBlox / LogiQL 中使用自动编号的 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

【问题讨论】:

    标签: logicblox logiql


    【解决方案1】:

    这里的问题是构造函数 cons_auto。构造函数的工作方式是,对于构造函数的每个唯一键元组,都会创建一个唯一实体,无论您使用相同键元组向构造函数断言多少次

    您已经定义了一个没有键的构造函数。这意味着,无论您执行多少次 delta 规则断言,都将使用此构造函数创建一个实体。

    您可以稍微不同地定义构造函数,例如使用一个键:

    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).
    

    您会看到创建了两个自动实体。

    当然,我怀疑这不是您想要的——因为您打算如何获得钥匙?您将 auto 设为自动编号实体的全部意义可能是因为您想自动生成“引用”。

    这是 transaction:id 有用的地方。例如

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

    请注意,每个事务、每个工作区的 transaction:id 都是唯一的。这意味着在同一个事务中,你只会得到一个事务:id,如果你想在同一个事务中创建多个自动实体,你必须对事务进行一些计算:id 以获得更多的唯一数字交易。

    还有一个 uid 系列函数也可以帮助生成唯一的 id。但是你必须有一些独特的东西来使用它来生成。我不确定这是否会对您有所帮助,但如果以上内容还不足以帮助您,请告诉我,我们可以探索 uid 是否可以提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      相关资源
      最近更新 更多