Возможны ли n-арные предикаты Datomic (n!= 2)?

Я пытаюсь сопоставить то, что я прочитал о Datalog с описаниями Datomic. Все предикаты, которые я вижу в Datomic, представляют собой тройки, то есть [значение атрибута сущности] или атрибут (e,v) в более прологическом синтаксисе. Datalog, с другой стороны, поддерживает n-арные предикаты, такие как pred(a,b,c,d).

Как мне соответствовать этому?

  1. Я пропускаю функцию Datomic, то есть есть ли у нее n-арные предикаты, или я могу как-то их смоделировать?
  2. Является ли 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. И преимущество в том, что теперь у вас есть именованный атрибут вместо того, что определено только с точки зрения его положения в предикате (что оказывается очень хрупким в реальных системах: подумайте, как изменить схему для чего-то подобного),

Другие вопросы по тегам