グラフベースのデータベース ( http://neo4j.org/ ) とオブジェクト指向データベース ( http://www.db4o.com/ )の違いは何ですか?
6 に答える
私はこれに別の方法で答えます。オブジェクトデータベースとグラフデータベースは、2つの異なるレベルの抽象化で動作します。
オブジェクトデータベースの主なデータ要素はオブジェクトであり、オブジェクト指向プログラミング言語からそれらを知る方法です。
グラフデータベースの主なデータ要素はノードとエッジです。
オブジェクトデータベースには、自動参照整合性などを備えた2つのものの間の(双方向)エッジの概念がありません。グラフデータベースには、NULLになる可能性のあるポインターの概念がありません。(もちろん、ハイブリッドを想像することができます。)
スキーマに関しては、オブジェクトデータベースのスキーマは、アプリケーション内のクラスのセットが何であれです。グラフデータベースのスキーマ(たとえば、 InfoGridで行うように、文字列ラベルの意味の慣例による暗黙的か、モデルとしての宣言による明示的か)は、アプリケーションから独立しています。これにより、たとえば、スキーマはアプリケーションに依存しないため、オブジェクトデータベースの代わりにグラフデータベースを使用して、同じデータに対して複数のアプリケーションを作成することがはるかに簡単になります。一方、グラフデータベースを使用すると、単純に任意のオブジェクトを取得して永続化することはできません。
さまざまな仕事のためのさまざまなツールだと思います。
はい、API が大きな違いのように見えますが、実際には表面的なものではありません。概念的には、一連のオブジェクトがグラフを形成し、このグラフを統一された方法で処理する API を考えることができます。逆に、理論的には、パターンの一般的なグラフ構造をマイニングし、それらを何らかの API を介して公開されたオブジェクトにマップすることができます。しかし、実際の製品の API の設計は、通常、データが実際にどのように格納されるか、どのようにクエリを実行できるかに影響を与えるため、たとえばラッパーを作成して別のもののように見せることは簡単なことではありません。また、オブジェクト指向データベースは、グラフ データベースでは通常行われない、いくつかの整合性の保証と型付け構造を提供する必要があります。実際、本格的な OO データベースは「自由形式」とはかけ離れています :)
[HyperGraphDB][1] を見てください。これは完全なオブジェクト指向データベース (db4o など) であり、表現機能とクエリ機能の両方の点で非常に高度なグラフ データベースです。一般化されたハイパーグラフ (エッジが複数のノードを指し、他のエッジも指すことができる) を格納することができ、完全に拡張可能な型システムがグラフなどとして埋め込まれています。
他のグラフ データベースとは異なり、HyperGraphDB では、すべてのオブジェクトがグラフのノードまたはエッジになり、API の侵入が最小限に抑えられます。オブジェクトをグラフとして表すか、オブジェクトをグラフと直交する方法で扱うかを選択できます。グラフ構造 (ノードまたはエッジの「ペイロード」値として)。洗練されたトラバーサル、カスタマイズされたインデックス作成およびクエリを実行できます。
HyperGraphDB が実際に ODMS である理由については、ブログ投稿 Is HyperGraphDB an OO Database? を参照してください。Kobrix の Web サイトで。
Will が別の角度から説明しているように、graphdb はデータをアプリケーションのクラスやオブジェクトから分離したままにします。また、graphdb には、最短パスや深いトラバーサルなど、グラフを処理するための組み込み機能もあります。
もう 1 つの重要な違いは、neo4j のようなグラフデータベースでは、完全なノード (ノードのプロパティ/属性を含む) をロードすることなく、関係 (エッジ) のタイプと方向に基づいてグラフをトラバースできることです。また、neo4j をオブジェクト db のバックエンドとして使用するという選択肢もありますが、それでもすべてのグラフィティを使用できます。参照: jo4neoこのプロジェクトには、neo4j 上のオブジェクト db としてカウントすることもできる別のアプローチがあります: neo4j.rb。新しいオプションは、Spring Data Graphを使用することです。これは、アノテーションを通じて graphdb サポートを提供します。
このブログ投稿へのコメントでも同じ質問がありました。
両方のウェブサイトを簡単に閲覧すると、次のようになります。
主な違いは、API を使用して構築できる自由形式のデータベースの種類ではなく、API の構造です。
db4o はオブジェクト マッピングを使用します。つまり、Java/C# クラスを作成すると、リフレクションを使用してそれをデータベースに永続化します。
neo4j には明示的な操作 API があります。
私の謙虚な意見では、Neo4j とのやり取りははるかに優れているように思えました。
また、キーと値のストアを検討することもできます。それらの 1 つを使用して、まったく同じ自由形式のデータベースを作成できます。
低レベルでの違いはそれほど大きくありません。どちらも、コストのかかる結合を行わずに直接リンクとして関係を管理します。さらに、どちらもクエリ言語との関係をたどる方法がありますが、グラフ データベースには、N 番目のレベルで再帰的に移動する演算子があります。
しかし、最大の違いはドメインにあります。グラフ データベースでは、すべてが頂点とエッジの 2 つのタイプに基づいていますが、通常は独自のタイプを頂点またはエッジの一種のサブタイプとして定義できます。
ODBMS では、独自に記述しない限り、Vertex と Edge の概念はありません。
グラフデータベースを使用すると、数学的グラフ理論に基づいている可能性がわずかにあります。オブジェクト指向データベースを使用すると、それがまったく何にも基づいていない(そして最も確かに数学的理論がまったくない)という確信があります。