【问题标题】:How to query changes to IDB predicates?如何查询 IDB 谓词的更改?
【发布时间】:2016-12-30 06:05:46
【问题描述】:

我想对一些 EDB 进行更改,然后找出 IDB 是如何改变的。

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

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

(其中 level 是 IDB)我得到了

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'

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

query '_(id) <- (level\level@prev)(id; _).'

导致语法错误:

block block_1Z80EFSZ: line 2: error: illegal character 'U+005C' (code: ILLEGAL_CHARACTER)
    (level\level@prev)(id; _).
          ^

block block_1Z80EFSZ: line 2: error: unexpected token 'level' (code: UNEXPECTED_TOKEN)
    (level\level@prev)(id; _).
           ^^^^^

block block_1Z80EFSZ: line 2: error: unexpected token ')' (code: UNEXPECTED_TOKEN)
    (level\level@prev)(id; _).
                     ^

block block_1Z80EFSZ: line 2: error: unexpected token ';' (code: UNEXPECTED_TOKEN)
    (level\level@prev)(id; _).
                         ^

4 ERRORS
BloxCompiler reported 4 errors in block 'block_1Z80EFSZ'

【问题讨论】:

    标签: logicblox


    【解决方案1】:

    很遗憾,diff 谓词功能尚未发布(截至 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
    

    查看谓词列表。

    【讨论】:

    • 我有一个非常大的 IDB 和另一个想要订阅更改的程序,所以我专门寻找差异,而不仅仅是整个事情的打印输出。 monitor 听起来很有希望,但我该怎么办?参考手册中没有提到,帮助字符串也没有启发 - gist.github.com/jamii/64f3beaec9e6027f38b630b85e133ae4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多