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