【问题标题】:datomic join query execution and metadatadatomic join 查询执行和元数据
【发布时间】:2016-11-10 06:46:37
【问题描述】:

在 java(通过 JDBC 驱动程序)中,当我对 T1(a, b) 和 T2(x, y) 执行 sql 连接查询时,我得到一个包含连接记录 J(a, b, x, y) 的输出。除此之外,我还得到元数据,告诉我在连接记录 J 中,字段“a”和“b”来自表 T1,字段“x”和“y”来自表 T2。

我的问题是,当我在java中运行datomic join查询时,我是否也会得到这种元数据信息,告诉我joined记录中的哪个字段属于哪个输入表?

【问题讨论】:

    标签: datomic


    【解决方案1】:

    Datomic 没有表格。它就像一个三重商店。内置时间轴。

    三元组是实体-属性-值。因此,您可以在输出中包含匹配的实体以及属性和值。

    例如,在您的数据库中有三元组:

    [joe :likes :pizza]
    [joe :favorite-color :gray]
    [joe :name "joe"]
    [jane :likes :pizza]
    [jane :favorite-color :blue]
    [jane :name "jane"]
    

    joe 和 jane 是实体(它们是具有唯一标识符并附加属性的事物),:likes、:name 和 :favorite-color 是属性,:pizza、:grey 和 :blue 是值。

    查询谁喜欢披萨并且喜欢灰色

    (d/q '[:find ?person
           :where
           [?person :likes :pizza]
           [?person :favorite-color :gray]]
           db)
    

    这里的结果将是一个实体列表,在本例中为joe。您可以从该实体导航到其所有属性(名称、喜欢等)。这个查询没有太多意义,但您可以返回任何变量,可以是实体属性或值。

    我会在这里停下来,因为 Datomic 有很棒的教程以及官方文档。

    【讨论】:

    • 那么我如何在 datomic 中表示 SQL 表记录呢?我想会有一个主键的概念,基于它我们可以在datomic中检索记录(属于具有相同主键的记录的多个列)等效实体?
    • 进一步充实了答案。但真的只是想一个小时的教程是最有帮助的。
    • 感谢您提供详细信息。实际上,我确实看过 datomic doc,但对此感到困惑。我认为你的解释已经回答了我的问题。现在我明白我可以将 SQL 的“主键”甚至“表名”/“dbname”作为实体的属性之一,尽管将“表名”作为每个实体(或表的记录)的属性将是重复的
    • 嗨亨利,在上述情况下,如果 joe 属于表 T1(在 SQL 意义上)即 [joe :table :T1] 并且 jane 属于表 T2 即 [jane :table :T2],那么我猜猜我是否想获取属于表 T1 并喜欢“披萨”的所有实体/记录,那么我必须将其作为条件?在 SQL 意义上,两个表可能具有相同名称的属性,如果这些数据是以 datomic 形式放置的,那么我们需要根据表属性来区分它们吗?
    • 这是一种方式,是的。或有 2 个属性:table1/likes, :table2/likes.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    相关资源
    最近更新 更多