2016-05-13 19 views
1

グラフデータベースに最適なアプリケーションを構築しており、Neo4Jを決定しました。私は、Neo4Jノードに特定のノードに関するデータを格納するか、単にmongo db内の項目への参照を持つかの2つの考え方をしています。MongoDBまたはNeo4Jに裏打ちされたNeo4J

(個人:名= "ビル"、年齢= 29、ID = 1)< -neo

(人:ID = 1、UUID = "いくつかの-UUID")< - ネオ {UUID: "いくつかの-UUID"、名= "ビル"、年齢= 29} - :

/user/{id} <モンゴ

は、私は次のようになりますデータへのRESTインターフェイスを持つことを計画します:

  • (neo)私はneoのIDで個別のユーザーを検索します。
  • (neo + mongo)私はmongoのユーザーを(neoに触れることなく)見つけることができます。

    /user/{id}/friends

  • (ネオ)は、ユーザーのすべての友達を見つけて、ノード

  • (ネオ+モンゴ)をロードするユーザーのすべての友人は同上のを取得し、その後のためモンゴを照会して下さいデータ

だから、私の質問は次のようなことだと思います.Neo(パフォーマンスなど)にノードに関するすべてのデータを保存するのは面倒ですか?

おかげで、

ベンそれはあなたが実行されますあなたのデータのサイズ(構造)とクエリの種類に依存

+0

その他のデータは保存していますか? – manonthemat

+0

単一のデータベースを使用するか、* polyglotの永続化アプローチをとって複数のデータベースを扱うかに関わらず、実際には正解はありません。これは、データの特定の形や、各データベースの強みをどのように活用したいかということになります。あなたの例では両方を使用する場所では、neo4jにIDだけを格納しているので、その場合、Neo4jのクエリ機能をどのように活用していますか? –

答えて

2

  • はあなたが実行する必要が想定できます。)について考えるべきいくつかのガイドライン/物事;正確な数で定義することは困難である「巨大な」しかし - そこは、ノード上で大量のデータを格納する場合に観察パフォーマンスヒットすることができフィルタリングのためのより多くの属性を使用するクエリ - クエリで使用したいものは、グラフ内になければなりません。あなたの所有物の少数派か大半ですか?個人的には、フィルタのプロパティが20%、ノードが見つかったら80%のディストリビューションがあれば、デュアルストレージ(他の要素があれば)を考えます。逆の場合(クエリで80%が使用されていない場合、20%ではない)、おそらく単純化のためにすべてをグラフに格納します。
  • ネイティブストレージがどのように実装されているかに起因して、Neoは多数の小さなプロパティよりも小さいプロパティのほうが機能します。私は、すべての小道具と各物件を別々に1つのjsonを保存するという粗雑な測定を行いました。大きなCSVをインポートするのには数倍のスピードで、読み込みを測定しませんでしたが、影響を受けることも期待しています。したがって、いくつかのプロパティがある場合は、それらの負荷があり、それらを別々にしたい場合よりも良いでしょう。
  • グラフのサイズと速度の要件によって、実際にそれについて心配する必要はありません。 mongo(または何か他のもの)で未使用のプロパティを持つのは速いかもしれませんが、典型的なクエリで差が100msと200msの場合は、プロジェクトの複雑さを増やす価値がないかもしれません。

全体として、あなたの質問は確かに有効であり、人々がグラフからいくつかのデータを移動したと聞いたプロジェクトがあります。しかし、私はこれから始めるつもりはありません。まず、すべてのものをneo4jに入れて、クエリや使用例について基本的なperfテストを行い、パフォーマンスやストレージが判明した場合にのみリファクタリングを行いますサイズは受け入れられません。

P.S.私はまた、あなたが読み物について賢明であると仮定した場合、あなたはおそらくこれよりも多くのことを読み込みよりも見ることになるでしょう。特定のプロパティだけを返すフォーム(例:ノードが完全ではない)に読取りクエリを取得すると、「添付」されているプロパティの数にかかわらず、読込みは損なわれません。言い換えれば、RETURN user.nameを実行すると、ユーザーに多数のプロパティがあり、その名前にのみ関心がある場合、RETURNユーザーよりもはるかに高速になります。

0

数年前にロンドンのグラフで興味深いプレゼンテーションを私に覚えています。 Adidas Globalは、実際にはneo4jをメタデータストアとして使用しています。私はLilliがすでに優れた答えを与えてくれたと思う。おそらく、私が加えることができる1つのこと。

私はneoの人が優れた仕事をしていると思います。エンタープライズエディションのライセンスを取得する必要があります。しかし、あなたがまだいないなら、あなたはコミュニティ版でそれをしなければならないでしょう。高可用性クラスタを持たないことを意味します。もちろん、複数のインスタンスを設定し、それらをロードバランサの背後に置くこともできます。しかし、ネオをプライマリデータストアとして使用する場合は、書き込みを行う必要があることを意味します。その状況はかなり醜いかなり速くなるでしょう。

コミュニティ版を使用する必要があり(現時点で)、規模を拡大したい場合は、読み取り専用のデータベースとバッチ処理が必要です。 (バッチインポーターは非常に高速ですが、Javaが必要です)。

エンタープライズを使用できる場合は、(近く)リアルタイム更新を行うことができます。また、主データストアとしてneo4jを使用することもできます。

しかし、私はそれをしません。ここに私の個人的なアドバイスがあります。それが良いもののためにneo4jを使用してください。プライマリデータストアとしては使用しないでください。 Neo4jはデータ保存用に最適化されていません。 MySQL、MongoDB、またはHadoopを使用しているかどうか。彼らのそれぞれは、neo4jがそれほど心配していない(おそらくはそうすべきではない)機能に関わっています。また、neo4jはRAMに大きく依存しています。私はneoができるだけ効率的に利用可能なメモリを使いたいと思っています。

最後に重要なことですが、 Neo4jは、あらかじめ定義された問題を効率的に解決するのに非常に適しています。あなたのデータは、ドメイン質問の後にモデル化されることが多く、迅速かつリアルタイムで回答する必要があることを意味します。しかし、必要なモデルはデータ構造を全く表さないかもしれません。あなたが考えたいと思うかもしれない何か。 :-)

関連する問題