Я изучаю Datalog/DataScript/Datomic. Для этого я настроил простую базу данных реестра на DataScript. На данный момент он в основном состоит из набора учетных записей и списка записей с атрибутами :entry.record/account
и :entry.record/amount
. Теперь я пытаюсь получить баланс всех счетов, суммируя все :entry.record/amount
для каждого счета. Этот запрос дает мне баланс для всех счетов, которые имеют записи в бухгалтерской книге:
(d/q '[:find ?account ?account-name (sum ?amount)
:with ?record
:in $
:where [?account :account/name ?account-name]
[?record :entry.record/account ?account]
[?record :entry.record/amount ?amount]]
@conn)
Но у меня есть несколько учетных записей, в которых до сих пор нет зарегистрированных записей, и они не отображаются здесь. Я хочу сделать запрос, который включает их, перечисленные со значением 0. Я играл с or-join
и missing?
, чтобы включить эти учетные записи в запрос, но я понятия не имею, как получить сумму до 0 для учетных записей. Например, этот запрос:
(d/q '[:find ?account ?account-name (sum ?amount)
:with ?record
:in $
:where [?account :account/name ?account-name]
(or-join [?record]
(and [?record :entry.record/account ?account]
[?record :entry.record/amount ?amount])
[(missing? $ ?record :entry.record/account)])]
@conn)
Выдает исключение с сообщением Query for unknown vars: [?amount]
, так как вторая часть or-join
не может присвоить значение ?amount
.