2011-08-06 14 views
1

グラフデータベースは、データをノード、プロパティ、リレーションとして格納します。クエリに基づいてオブジェクトから特定のデータを取得する必要がある場合は、複数のオブジェクトを取得する必要があります(クエリの結果が多いため)。私は、各ユーザがオブジェクトとして格納されているユーザの(グラフ)データベースを有するグラフデータベースのオブジェクト指向プログラミング

は、グラフデータベース内のオブジェクト指向プログラミングでは、この単純なシナリオを検討してください。特定の場所にいるユーザーのリストを取得する必要があります(プレースプロパティはユーザーオブジェクトに格納されます)。だから、どうすればいい?私は何かをする必要があるたびに不必要なデータが取り出されることになります(この場合、ユーザーオブジェクト全体を取得する必要があります)。関数型プログラミングはグラフデータベースでは優れていませんか?

この例は、私の頭に浮かんだ上記の質問の単純な類推に過ぎません。それをベンチマークとみなさないでください。ですから、質問は残っています。グラフデータベースのオブジェクト指向プログラミングはどれくらいのことがありますか?

+0

私はむしろ場所のノードを作り、関係を使ってそれらにユーザーを接続したいと思います。 - グラフ化されていない種類のストレージと同じように、なぜgraphdbを使用するのですか? AFAIKのすべてのグラフデータベースにはインデックスのサポートが付属していますので、プロパティ値を1つずつ調べる代わりに使用してください。 - OOプログラミングを使用しても、DBからすべてのオブジェクトを常にロードする必要はありません。質問をより明確にしようとするかもしれませんか? – nawroth

答えて

1

各ノードには、オブジェクトフィールドにマップできる属性があります。手動で行うこともできますし、spring-dataを使ってマッピングを行うこともできます。

3

グラフデータベースは単なる頂点とエッジ以外にもあります。 neo4jなどのほとんどのグラフデータベースでは、idの頂点とlabelのエッジを持つ頂点に加えて、それらのプロパティのリストがあります。通常、Javaベースのグラフデータベースでは、これらのプロパティはJavaプリミティブに限定されています。その他のものはすべて文字列にシリアル化する必要があります(日付など)。頂点/エッジプロパティへのこのマッピングは、getPropertysetPropertyなどのメソッドを使用して手作業で行うことも、のようにTinkerPopスタックを使用するオブジェクトマッパーとすることもできます。

1

ほとんどのグラフデータベースには、頂点/エッジのインデックスが少なくとも1種類あります。例えば、InfiniteGraphは、B-Trees、Lucene(テキスト用)および分散型のスケーラブルなインデックス型をサポートしています。フィールドとしてフィルタとして使用しようとしているインデックスがない場合は、グラフをトラバースし、各ステップで自分で述語を適用する必要があります。うまくいけば、それは横断されるべきノードの数を減らすでしょう。

0

ブロッククォート特定の場所に住んでいるユーザーのリストを取得する必要があります(プレースプロパティはユーザーオブジェクトに格納されています)。

良い方法があります。ユーザーと別の場所。場所をプロパティとして持つ代わりに、場所のノードを作成します。 (u:User)-[:LIVES_IN]->(l:Location)タイプの関係を持つことができます。

それは単純なクエリで特定の場所に住んでいるユーザーのリストを取得することが容易となる。

match(u:User)-[:LIVES_IN]->(l:Location) where l.name = 'New York'. 
return u,l. 

これは、各ノードのすべてのプロパティをスキャンすることなく、ニューヨークに住んでいるすべてのユーザーを返します。それはより速いアプローチです。

関連する問題