Neo4j データベースの適切なインデックス戦略を決定するための助けが必要です。データベースにはアイテムを持つユーザーがいて、すべてのユーザーとアイテムには変更されたエポック整数値と UUID 値 (トリミングされた Base64 文字列) があります。私は 2.0-M6 で開発しているので、新しいスキーマベースのインデックス作成を適切に使用して、ラベル USER の「uuid」フィールドでユーザーにクエリを実行できます。
しかし、ユーザーのアイテムのインデックス作成はより複雑です。タイプ「userUUID = X AND modified > Y」の両方のクエリを実行したい。これは、数値 Y よりも大きい (最近の) 変更された整数を持つすべてのアイテムを返す必要があります。しかし、単純な検索も行いたいです。 「userUUID=X, itemUUID=Z」、単一のノードを返す必要があります。
Lucene についての私の現在の非常に限られた理解では、おそらく最良の解決策は、「userUUID、itemUUID、変更された」3 つのキーを持つ 1 つのインデックスであり、複合クエリでクエリを実行できるようになります。しかし、そのようなインデックスをどのように正確に作成すればよいのでしょうか? また、ユーザー ベースが拡大しても高速であり続けるでしょうか? インデックスは主に userUUID プロパティで最適化する必要があります。これはすべてのクエリにあり、その後 itemUUID と変更された整数でのみ最適化されます。それは可能ですか?
もう 1 つのオプションは、変更された値に対してユーザーごとに 1 つのインデックスを構築し、直接アイテムにアクセスするために結合キー "userUUID+itemUUID" を使用して 1 つのインデックスを構築することです。これは、Neo4j によって単一のキー インデックスが十分にサポートされ、文書化されているため、オプション 1 よりも実装がはるかに簡単です。しかし、100 万人のユーザーがいるとしたら、インデックス "modified-items-for-X" のインデックス ルックアップは依然として高速であり、それらすべてのインデックスがすべてのメモリを消費するのでしょうか?
この質問は関連していますが、Lucene indecies の数ははるかに少なくなっています。
編集。Stefan が推測したように、ユーザーとアイテムは OWNS 関係でリンクされており、UUID はデータベース内のすべてのノードで一意です。
さらに明確にするために、アイテムをクエリするための最もパフォーマンスの高いソリューションを探しています。1 人のユーザーが何千ものアイテムを持っていると予想され、「userUUID=X AND modified > Y」クエリがすべてのユーザーによって一定のペースで発行されます。 (1 分に 1 回でも)、「userUUID=X and itemUUID=Y」クエリと同様です。したがって、ここではすべてのミリ秒がカウントされます。