5

1 つ以上のカテゴリに属する​​何百万もの製品を表現したいと考えています。

私はいくつかのアプローチを考えています:

  1. インデックス付きカテゴリ ノード - 各カテゴリのノードを作成し、category_name に auto_index を作成します。次に、各製品ノードとそれぞれのカテゴリ ノードの間に「isCategoryOf」関係を作成します。

  2. 個々のカテゴリ関係タイプ - 製品とルート ノードの間に、それぞれの「isCategoryGames」、「isCategoryFood」、「isCategoryLifestyle」などの関係を作成します。

  3. カテゴリを 1 つの関係タイプのプロパティとして保存する - 製品ノードとルート ノードの間に「isCategory」関係を作成し、それぞれのカテゴリ タイプを関係のプロパティに保存します。

これらのアプローチのうち、最も効率的かつ/またはスケーラブルなものはどれですか。データベース内のほぼすべてのノードをルート ノードに接続すると、制限やパフォーマンスへの影響はありますか?

4

1 に答える 1

4

何百万ものノードをルート ノードに接続すると、ルート ノードがスーパーノードになります。これは問題になる可能性があります。

オプション 1 の一般的な概念は有望です。食品をモデル化している場合、「ナッツ」、「乳製品」、「デザート」、「農産物」などの名前プロパティと「カテゴリ」のタイプ プロパティを持つノードがあるとします。次に、「Dairy Products」および「Desserts」ノードへの発信「category」エッジを持つ「Cherry Cheesecake」などの name プロパティを持つ他のノードを作成します。

この構造が十分なパフォーマンスを発揮するかどうかは、クエリによって異なります。「食品」のような幅広いカテゴリがある場合、最終的にスーパーノードになる可能性があり、接続されたノードを線形スキャンして、特定のプロパティを持つノードを見つけます。何千ものものに対する線形スキャンは目的に十分な速さかもしれませんが、1M のものに対するスキャンはそうではないかもしれません。

それを調べるには、いくつかのランダムな製品ノードとカテゴリ ノードを生成し、各製品ノードをランダムな数のカテゴリ ノードに接続する簡単なプロトタイプを作成することをお勧めします。製品およびカテゴリ ノードを名前でインデックス付けすると、個々の製品またはカテゴリを見つけるのに役立ちますが、スーパーノードにヒットした場合にパフォーマンスの問題が発生するのはトラバーサルです。最も問題があると思われるいくつかの Gremlin トラバーサルまたは Cypher クエリを試してみてください。ノード数を 1K、10K、100K、および 1M にスケールアップして、比例した数のエッジを使用してみてください。トラバーサル / クエリ時間はどのように変化しますか?

于 2013-03-13T17:36:27.403 に答える