3

LogicBlox / LogiQL で autoNumbered refmode 述語を操作する方法を知りたい

マニュアルの例に従いましたが、エンティティの述語に事実をアサートするのに問題があります。最初の述語は追加されますが、その後の試みはそうではありません。

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
4

1 に答える 1

3

ここで問題になるのは、cons_auto コンストラクターです。コンストラクターが機能する方法は、コンストラクターへの一意のキータプルごとに、同じキータプルでコンストラクターに何回アサートしても、一意のエンティティが作成されることです。

キーなしでコンストラクターを定義しました。これは、デルタ ルール アサーションを何回実行しても、このコンストラクターを使用して 1 つのエンティティーが作成されることを意味します。

たとえば、1 つのキーを使用して、コンストラクターを少し異なる方法で定義できます。

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

2 つの自動エンティティが作成されることがわかります。

もちろん、これはあなたが望んでいることではないと思います。auto を自動番号付けエンティティにしたのは、おそらく「参照」を自動的に生成したかったからです。

ここで transaction:id が役立ちます。例えば

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

transaction:id は、トランザクションごと、ワークスペースごとに一意であることに注意してください。つまり、同じトランザクションでは、1 つの transaction:id しか取得できません。同じトランザクションで複数の自動エンティティを作成する場合は、トランザクション内でさらに一意の番号を取得するために、transaction:id から計算を行う必要があります。トランザクション。

一意の ID を生成するのに役立つ uid シリーズ関数もあります。ただし、それを使用して生成するには、使用する固有のものを用意する必要があります。それがあなたの助けになるかどうかはわかりませんが、上記で十分に理解できない場合はお知らせください。 uid が役立つかどうかを調査できます。

于 2015-09-24T14:06:53.820 に答える