3

Datalog について読んだことと、Datomic の説明を一致させようとしています。私が Datomic で目にするすべての述語はトリプル、つまり [entity attribute value] またはよりプロロジアンな構文の attribute(e,v) です。一方、Datalog は pred(a,b,c,d) のような n-ary 述語をサポートします。

これをどう合わせるか。

  1. Datomic の機能が欠けているのでしょうか。つまり、n 項述語があるのでしょうか、それともどうにかモデル化できますか?
  2. Datomics Datalog は、通常 Datalog と呼ばれるものの制限付きバージョンですか?
4

1 に答える 1

1

従来のデータログの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述語で表現できるものはありません。そして利点は、述語内の位置に関してのみ定義されたものではなく、名前付き属性を使用できることです(これは、実際のシステムでは非常に脆弱であることがわかります。そのようなもののスキーマを変更する方法を考えてください)。 。

于 2013-02-01T13:32:12.867 に答える