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

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

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

  1. Я пропустил особенность Datomic, т.е. у него есть n-арные предикаты, или я могу их как-то смоделировать?
  2. Является ли Datomics Datalog ограниченной версией того, что обычно называется Datalog?

person Falko    schedule 16.01.2013    source источник


Ответы (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"}]

Итак, краткий ответ: no Datomic не выполняет n-арные предикаты на стороне ввода, но нет ничего, что вы можете представить в n-арном предикате, что не может быть представлено в Datomic. И преимущество в том, что теперь у вас есть именованный атрибут, а не то, что определено только с точки зрения его позиции в предикате (что оказывается очень хрупким в реальных системах: подумайте, как изменить схему для чего-то подобного) .

person sethev    schedule 01.02.2013
comment
Ах! Этого различия я не нашел в документации. - person Falko; 03.02.2013