こんにちは私はNeo4j用のDBSCANアルゴリズムを実装しようとしていますが、深刻なパフォーマンスのボトルネックに直面しています。実装について説明してから、助けを求めます。
1つのクエリですべてのコアノードを取得できるように、可能なイプシロン値を離散化し、各ノードの各離散化の下にあるネイバーの数をカウントしました。
START a = node(*)
WHERE a.rel<cutoff threshold>! >= {minp}
RETURN a
この部分は高速ですが、高速でない部分はフォローアップクエリです:
START a = node({i})
SET a.label<cutoff threshold>_<minpoints> = {clust}
WITH a
MATCH a -[:'|'.join(<valid distance relations>)]- (x)
WHERE not(has(x.label<cutoff threshold>_<minpoints>))
WITH x
SET x.label<cutoff threshold>_<minpoints>={clust}
RETURN x
次に、開始するコアノードを選択し、コアノードのネイバーがまだ存在する限り、上記のクエリを実行してネイバーにラベルを付けます。
問題は、私のグラフのスパース性のレベルが非常に異なることだと思います。類似性が弱いことから始めて、ほぼ完全に接続されており、ノード間で約5,000万の関係がありますが、類似性が高い場合は、約10,000の間にわずか20kの関係があります。ノード(またはそれ以下)。何があっても、それは常に本当に遅いです。これを処理するための最良の方法は何ですか?関係タイプと開始ノードのインデックスを作成するのですか?この問題に関するリソースを見つけることができませんでした。驚くべきことに、これはかなり標準的なグラフアルゴリズムであるため、実装はまだありません。scikit.learnを使用することもできますが、メモリ内の距離行列のみに制限されます:(