私は、Neo4jデータベースのデータとして500万の製品と100,000の売り手を持っています。売り手は、すべての製品ポートフォリオの中にいくつかの共通の製品を持っています。これらの製品と売り手はノードであり、それらの間の関係はNeo4jデータベースのエッジです。Neo4jの検索クエリの時間複雑度はどのくらいですか?
Neo4jデータベースの各売り手のすべての商品を検索するための検索クエリの複雑さはどのくらいですか?
私は、Neo4jデータベースのデータとして500万の製品と100,000の売り手を持っています。売り手は、すべての製品ポートフォリオの中にいくつかの共通の製品を持っています。これらの製品と売り手はノードであり、それらの間の関係はNeo4jデータベースのエッジです。Neo4jの検索クエリの時間複雑度はどのくらいですか?
Neo4jデータベースの各売り手のすべての商品を検索するための検索クエリの複雑さはどのくらいですか?
特定の売り手(または売り手、一度に複数の人を見上げる場合)を探す必要がある場合、関係を横断する複雑さは、特定の売り手(すべての売り手ではない)によって販売される商品に比例しますそれをk
と呼ぶ)、したがってO(k)。
売り手ノードを索引で検索します(特定のラベル/プロパティー索引のルーゼン索引ルックアップ、これはO(log(n))とみなされます)。ここでnはその項目の数です特定のインデックス)、次に関連するすべての関係(:Sells?)を、それらの売り手によって販売された製品ノードにトラバースし、次に売り手ごとの製品を収集する。
トラバーサルはグラフの関連部分を歩くだけなので、クエリが1つの売り手とその100個の商品についてクエリであった場合、それらがグラフ内の唯一のノードであるか、 5百万の製品と1 lakhの売り手の提案されたグラフ。
最初の売り手のルックアップにインデックスを使用していない場合は、代わりにすべての売り手ノードでラベルスキャンを実行するため複雑さが変わるため、クエリに比例します売り手ノードの数。
これは、できるだけインデックスを作成し、開始ノードにインデックスルックアップを使用することが不可欠な理由です。
EDIT:
で成長することは、クエリ(販売された製品の数が多いを与えられた)の中で最も高価な部分ではないかもしれないが、私は、Luceneを介して、少し上の...索引参照を明らかに索引付けされたノードの数(その1つの特定のラベル/プロパティー索引の場合)。しかし、ルーシンインデックスルックアップの複雑さを説明するためには、おそらくより緊密な方法があります。この種のルックアップは、ほとんどのデータベースでは、Neo4jやグラフDBに固有のものではないので、グラフのDBパフォーマンスを考える上でインデックスのルックアップは非常に重要ではないと考えています。
私はあなたのクエリに関する詳細を追加する必要があると思います。あなたの製品と売り手はすでに関係によって結ばれています。あなたの入力は何ですか?単一の製品ですか?複数?一人の売り手?単一の売り手、同じ商品を持っている他のすべての売り手(単なる売り手、または実際の売り手)を見つけようとしている場合、同じ商品をすべて購入する必要がありますか? – InverseFalcon
@InverseFalcon、私は必要な変更を加えました。あなたは時間の複雑さで今私を助けることができますか? –
返されるデータは、それぞれ500万の製品と収集された売り手です。それは本当に便利なクエリですか?その膨大な量のデータで何をする予定ですか? Neo4jは、クエリを絞り込んでグラフのより小さい関連性の高い部分に触れるときに最適です。 5百万行を返すのはむしろ過度に思われます。これは本当に照会しているのでしょうか? – InverseFalcon