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

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

Как да съчетая това?

  1. Пропускам ли функция на Datomic, т.е. има ли n-арни предикати, или мога да ги моделирам по някакъв начин?
  2. Datomics Datalog ограничена версия ли е на това, което обикновено се нарича Datalog?

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


Отговори (1)


n-арните предикати в традиционния Datalog всъщност са подобни на таблиците в релационните бази данни. Така например следният ред ще добави информация за човек в традиционна система 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-ary предикат, което да не може да бъде представено в Datomic. И предимството е, че сега имате наименуван атрибут вместо нещо, което е дефинирано само по отношение на позицията му в предикат (това се оказва много крехко в системите от реалния свят: помислете как да промените схемата за нещо подобно) .

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