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