Возможны ли n-арные предикаты Datomic (n!= 2)?
Я пытаюсь сопоставить то, что я прочитал о Datalog с описаниями Datomic. Все предикаты, которые я вижу в Datomic, представляют собой тройки, то есть [значение атрибута сущности] или атрибут (e,v) в более прологическом синтаксисе. Datalog, с другой стороны, поддерживает n-арные предикаты, такие как pred(a,b,c,d).
Как мне соответствовать этому?
- Я пропускаю функцию Datomic, то есть есть ли у нее n-арные предикаты, или я могу как-то их смоделировать?
- Является ли Datomics Datalog ограниченной версией того, что обычно называется Datalog?
1 ответ
N-арные предикаты в традиционном Datalog на самом деле похожи на таблицы в реляционных базах данных. Так, например, следующая строка добавит информацию о человеке в традиционной системе регистрации данных:
assert Person("John", "Smith", "1985-01-01")
Обратите внимание, что единственное, что говорит вам, что 3-е значение - это дата рождения, это его положение в предикате.
Datomic не использует подобные предикаты в свободной форме для хранения данных. Он использует Datalog строго на стороне запроса. Чтобы представить что-то вроде нашего человека выше в Datomic, вам нужно создать три атрибута. Вы можете назвать атрибуты: :person/first-name
, :person/last-name
, :person/dob
(Обратите внимание, что :person/
это просто часть имени, оно на самом деле не создает какой-либо структуры или табличной вещи).
Каждый атрибут должен быть установлен с использованием transact
функция, прежде чем вы можете использовать его. Вот пример того, что вам нужно отправить для транзакции для :person/last-name
[{:db/id #db/id[:db.part/db]
:db/ident :person/last-name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/fulltext true
:db/doc "A person's last name"
:db.install/_attribute :db.part/db}]
Вы можете найти более подробную информацию в документации Datomic: http://docs.datomic.com/schema.html
Если у вас есть атрибуты, вы можете добавить ту же информацию, с которой мы начали, выполнив следующие действия:
[{:db/id #db/id[:db.part/user]
:person/first-name "John"
:person/last-name "Smith"
:person/dob "1985-01-01"}]
Итак, короткий ответ: ни один Datomic не делает n-арных предикатов на входной стороне, но нет ничего, что вы можете представить в n-арном предикате, который не может быть представлен в Datomic. И преимущество в том, что теперь у вас есть именованный атрибут вместо того, что определено только с точки зрения его положения в предикате (что оказывается очень хрупким в реальных системах: подумайте, как изменить схему для чего-то подобного),