您好我一直在嘗試爲Neo4j實現DBSCAN算法,但是我遇到了嚴重的性能瓶頸。我將描述實施,然後尋求幫助。在Cypher/Python中爲neo4j優化DBSCAN
我離散化了可能的ε值,並將每個節點中每個離散化下的鄰居數目計數,以便能夠檢索一個查詢中的所有核心節點。
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
我再挑一個核心節點,從開始,只要還存在着核心節點鄰居,運行上述查詢來標記它們的鄰居。
我認爲問題在於我的圖具有非常不同的稀疏級別 - 從弱相似性開始,它幾乎完全連接,〜10k節點之間有〜50M的關係,而在相似性很強的情況下,只有~20k約10k個節點之間的關係(或更少)。無論如何,它總是非常緩慢。對我來說,最好的辦法是什麼?它是關係類型和起始節點上的索引嗎?我一直無法找到關於這個問題的任何資源,並且令人驚訝的是還沒有實現,因爲這是一個非常標準的圖算法。我可以使用scikit.learn,但然後我將被限制在內存距離matricies :(
也許這是因爲neo4j針對圖遍歷進行了優化,而不是針對圖插入/編輯的主要。我看到neo4j和其他圖形數據庫引擎在數據處理速度上的比較,而neo4j的安靜速度很慢。另一方面,它在圖表遍歷的速度上勝過其他人 – ulkas