如何查询IDB谓词的更改?

时间:2016-12-30 06:05:47

标签: logicblox

我想对某些EDB进行更改,然后了解IDB如何因此而改变。

docs表示查询阶段在最后阶段之后,“可以访问阶段FINAL的效果”。但如果我跑

p.name

(等级是IDB)我得到了

Null Exception

我也尝试过关注diff predicate example。但是这个

query '_(id) <- ^level(id; _).'

导致语法错误:

block block_1Z7PZ61E: line 2: error: predicate level is an IDB, therefore deltas for it will not be available until stage final. (code: STAGE_INITIAL_IDB_DELTA)
    ^level(id; _).
    ^^^^^^^^^^^^^

1 ERROR
BloxCompiler reported 1 error in block 'block_1Z7PZ61E'

1 个答案:

答案 0 :(得分:0)

不幸的是,差异谓词功能尚未发布(截至2016年12月)。我们已经注意到这是一个需要修复的文档错误。该功能预计在2017年第一季度的LB 4.4。

这是在更改EDB后打印或查询IDB谓词中的值的简单示例。在这种情况下,您不需要使用增量逻辑。

[dan@glycerine Fri Dec 30 09:55:54 ~/Temp]
$ cat foo.logic
foo(x), foo_id(x: y) -> int(y).
edb[x] = y -> foo(x), int(y).
idb[x] = y -> foo(x), int(y).
idb[x] = y <- edb[x] + 10 = y.
[dan@glycerine Fri Dec 30 09:56:33 ~/Temp]
$ lb create --overwrite foo && lb addblock foo --name foo --file foo.logic && lb exec foo '+foo(x), +foo_id[x] = 1, +edb[x] = 5.'
created workspace 'foo'
added block 'foo'
[dan@glycerine Fri Dec 30 09:57:23 ~/Temp]
$ lb print foo edb
[10000000005] 1 5
[dan@glycerine Fri Dec 30 09:57:28 ~/Temp]
$ lb print foo idb
[10000000005] 1 15
[dan@glycerine Fri Dec 30 09:57:32 ~/Temp]
$ lb exec foo '^edb[x] = 15 <- foo_id[x] = 1.'
[dan@glycerine Fri Dec 30 09:57:54 ~/Temp]
$ lb print foo idb
[10000000005] 1 25
[dan@glycerine Fri Dec 30 09:57:55 ~/Temp]
$ lb query foo '_[x] = edb[x].'
/--------------- _ ---------------\
[10000000005] 1 15
\--------------- _ ---------------/

我可以想到几个选项,可以在发生变化时更多地观察变化。在一次案例中,您可以创建一个观察者谓词,并像这样添加值。

watcher(x, y) -> int(x), int(y).
^watcher(x, y) <- foo_id[x] = id, ^idb[id] = y.

可以增强它以拥有自己的实体和时间戳......

另一种方法是,如果您使用Web服务进行EDB更新,则使用

lb web-server monitor -w foo idb

观看谓词列表。