Bonjour, J'ai essayé d'implémenter l'algorithme DBSCAN pour Neo4j, mais je suis confronté à de sérieux goulots d'étranglement. Je vais décrire la mise en œuvre puis demander de l'aide.Optimisation de DBSCAN pour neo4j en Cypher/Python
J'ai discrétisé les valeurs epsilon possibles et mis des comptes du nombre de voisins sous chaque discrétisation dans chaque nœud afin de pouvoir récupérer tous les nœuds de base dans une requête.
START a = node(*)
WHERE a.rel<cutoff threshold>! >= {minp}
RETURN a
Cette partie est rapide, la partie qui n'est pas rapide est le suivi requête:
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
Je prends alors un nœud de base pour démarrer à partir, et aussi longtemps que il y a encore noyau voisins de noeud, exécutez la requête ci-dessus pour étiqueter leurs voisins. Je pense que le problème est que mon graphique a des niveaux très différents de sparsité - à partir de seulement une faible similitude, il est presque entièrement connecté, avec ~ 50M relations entre ~ 10k nœuds, alors qu'à forte similitude, il y en a aussi peu que ~ 20k relations entre ~ 10k nœuds (ou moins). Peu importe quoi, c'est toujours très lent. Quelle est la meilleure façon pour moi de gérer cela? Est-ce indexer sur le type de relation et le noeud de départ? Je n'ai pas été capable de trouver des ressources sur ce problème, et étonnamment il n'y a pas déjà une implémentation car il s'agit d'un algorithme graphique assez standard. Je pourrais utiliser scikit.learn mais alors je serais limité aux matricies de distance en mémoire seulement :(
peut-être parce que neo4j est optimisé pour la traversée de graphe et non primaire pour l'insertion/l'édition de graphe. J'ai vu quelque part une comparaison entre neo4j et d'autres moteurs de graphique DB dans la vitesse de traitement des données et neo4j était calme lent. d'autre part, il a surpassé les autres dans la vitesse du graphique traversant – ulkas