私が構築しているClojureシステムにNeo4jを統合することを検討しています。最初に尋ねられた質問は、なぜ Datomic を使用しなかったのかということでした。誰もこれに対する良い答えを持っていますか? Datomic について聞いたり見たりしたことはありますが、Neo4j と Datomic の違いを知るにはグラフ データベースについて十分に知りません。
1 に答える
それらの間にはいくつかの基本的な違いがあります。
データ・モデル
Neo4j と Datomic はどちらも、任意の関係をモデル化できます。どちらも EAV (entity-attribute-value) スキーマを効果的に使用しているため、同じ問題領域の多くをモデル化できますが、Datomicの EAV スキーマには時間次元 (つまり EAVT) も組み込まれているため、実行したい場合に非常に強力になります。任意の時点でのデータベースに対する効率的なクエリ。これは、不変のデータ ストア (Neo4j を含む) では不可能なことです。
データアクセス
Neo4j と Datomic の両方が、トラバーサル API とクエリ言語を提供します。
クエリ
Neo4j と Datomic はどちらも、再帰クエリをサポートする宣言型クエリ言語 (それぞれ Cypher と Datalog) を提供しますが、Datomic の Datalog は、カスタム フィルタリングと集計関数を任意の JVM コードとして実装できるようにすることで、はるかに優れたクエリ機能を提供します。実際には、これはCypher の組み込み関数が Clojure のシーケンス ライブラリに効果的に取って代わられることを意味します。これが可能なのは、データベースではなくアプリケーションがクエリを実行しているためです。
トラバーサル
トラバーサル API は常にアプリケーション コードによって駆動されます。つまり、Neo4j と Datomic の両方が、任意のトラバーサル、フィルタリング、およびデータ変換コードを使用してグラフをウォークできることを意味しますが、Neo4j は実行中のトランザクションを必要とし、実際には時間制限があることを意味します。
データの一貫性
もう 1 つの基本的な違いは、Datomic クエリはデータベースの調整を必要とせず (読み取りトランザクションがない)、一貫したデータ スナップショットで常に機能することです。つまり、任意の期間にわたって複数のクエリとデータ変換を実行し、結果が常に保証されることを意味します。一貫性があり、トランザクションがタイムアウトしないこと (存在しないため)。繰り返しになりますが、既存のデータベースの大部分 (Neo4j を含む) のような不変のデータ ストアでは、これを行うことは不可能です。これは、トラバーサル API にも当てはまります。
Neo4j と Datomic はどちらもトランザクション (ACID) システムですが、Neo4j は従来の対話型トランザクション (楽観的同時実行制御を使用) を使用するため、クエリにタイムアウトの制約を課すトランザクション内でクエリを実行する必要があります (調整する必要があります)。実際には、これは、非常に複雑で長時間実行されるクエリの場合、クエリを分割することになるため、特定の制限時間内にクエリが終了し、データの一貫性が失われることを意味します。
ワーキング セット
何らかの理由でクエリに膨大な量のデータ (通常はメモリに収まるよりも多くのデータ) を含める必要があり、結果をストリーミングできない場合 (Datomic はストリーミング API を提供するため)、Datomic はおそらく適切ではないでしょう。 Datomic のアーキテクチャを利用して、ピアに作業メモリを絶えず追い出し、追加のネットワーク呼び出しを実行し、データ セグメントを解凍することはありません。