gpt4 book ai didi

recursion - Datomic 的递归数据日志查询真的很慢

转载 作者:行者123 更新时间:2023-12-04 12:12:10 25 4
gpt4 key购买 nike

我目前正在评估 Datomic 用于存储和查询构成本体的已解析符号的用例。数据库中总共有 225122 个符号(实体)(所以它是一个相当大的本体,但对于 DB 来说应该不是什么大问题)。

结构非常标准,符号有

  • 包含它们的父符号(如子符号等)
  • super 符号(它们继承的符号)

  • 为了更好地访问符号,我们有一个独特的 name对于每个符号。这加起来就是以下 Datomic 模式:
    [{:db/ident :ml/name,
    :db/valueType :db.type/string,
    :db/cardinality :db.cardinality/one,
    :db/unique :db.unique/identity}
    {:db/ident :ml/parent,
    :db/valueType :db.type/ref,
    :db/index true,
    :db/cardinality :db.cardinality/one}
    {:db/ident :ml/superclass,
    :db/valueType :db.type/ref,
    :db/index true,
    :db/cardinality :db.cardinality/one}]

    现在我有了最基本的递归查询“给我(传递地)包含在符号 p 中的所有符号”。在数据方面:
    (def rules
    '[
    [(ubersymbol ?c ?p) (?c :ml/parent ?p)]
    [(ubersymbol ?c ?p) (?c :ml/parent ?c1) (ubersymbol ?c1 ?p) ]
    ])
    (q '[:find ?c ?n :in $ % :where
    (ubersymbol ?c ?d) [?d :ml/name "name of a root symbol"] [?c :ml/name ?n]]
    current-db rules)

    查询本身(所以是一个中等大小的符号)需要在 之间5 5.5 秒并返回 80 次点击。 不是毫秒,而是实秒 .这只是我想询问的有关数据集的最基本查询(它旨在从网络工具中使用,以帮助建模者了解本体的结构)。

    我在运行 datomic-pro-0.9.5554 ,使用内存数据库并使用对等库(我按照 "getting started" 指南中的描述启动了服务器。

    非常感谢为 Datomic 提供案例的帮助。

    马库斯

    最佳答案

    编辑

    fricke自己发现,是子句排序的问题,但在查询中,而不是在规则集中。更有效的版本是:

    [:find ?c ?n :in $ % :where
    [?d :ml/name "name of a root symbol"]
    (ubersymbol ?c ?d)
    [?c :ml/name ?n]]

    可以通过以下方式进一步改进上述查询:
  • 在查询正文中使用查询参数而不是使用动态参数
  • 使用查找引用通过其 :ml/name 解析输入实体

  • 产生:
    (d/q
    '[:find ?c ?n :in % $ ?d :where
    (ubersymbol ?c ?d)
    [?c :ml/name ?n]]
    rules current-db [:ml/name "name of a root symbol"])

    我的理论是,您的规则不是以 Datalog 可以针对此读取模式优化的方式编写的 - 可能会导致遍历所有实体。我建议将它们重写如下:
    [[(ubersymbol ?c ?p) 
    (?c :ml/parent ?p)]
    [(ubersymbol ?c ?p)
    ;; we bind a child of the ancestor, instead of a parent of the descendant
    (?c1 :ml/parent ?p)
    (ubersymbol ?c ?c1)]]

    这种编写规则集的方式经过优化,可以找到某个节点的后代。您最初编写它的方式经过优化以找到某个节点的祖先。

    在我的机器上使用 Datomic 0.9.5385 在 50000 个实体的平衡二叉树上进行的快速基准测试表明,使用第二种方法确实获得了所需的性能。

    关于recursion - Datomic 的递归数据日志查询真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42457136/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com