従来のデータログのn-ary述語は、実際にはリレーショナルデータベースのテーブルに似ています。したがって、たとえば次の行は、従来のデータログシステムの人に関する情報を追加します。
assert Person("John", "Smith", "1985-01-01")
3番目の値が生年月日であることを示す唯一のことは、述語内の位置であることに注意してください。
Datomicは、データを格納するためにこのような自由形式の述語を使用しません。クエリ側で厳密にDatalogを使用します。上記のDatomicで私たちのようなものを表すには、3つの属性を作成する必要があります。属性を:、、と呼ぶことができます: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"}]
つまり、簡単な答えは次のとおりです。入力側でn-ary述語を実行しないDatomicはありませんが、Datomicで表現できないn-ary述語で表現できるものはありません。そして利点は、述語内の位置に関してのみ定義されたものではなく、名前付き属性を使用できることです(これは、実際のシステムでは非常に脆弱であることがわかります。そのようなもののスキーマを変更する方法を考えてください)。 。