Есть несколько способов повысить производительность вашего запроса.
1.Создать индекс для свойства name
:
Сделайте то же самое для других меток.
CREATE INDEX ON :GeneEntity(name)
2.Используйте метки при сопоставлении (здесь для e0
и e3
): Рассмотрите возможность использования меток для уменьшения количества сканируемых узлов.Если вы не используете метки, Neo4j будет сравнивать все узлы.
Решение:
Ваш внутренний запрос приводит к AllNodesScan
.AllNodesScan
Это плохая идея!
Лучшее решение может быть:
MATCH (e0{name:"dacomitinib"}), (e3{name:"rucaparib camsylate"})
WITH e0, e3
MATCH (e0)-[r01]-(e1)-[r12]-(e2)-[r23]-(e3)
WHERE
head(labels(e1)) IN ['GeneEntity','CompoundEntity','DrugsEntity','DiseaseEntity','ProteinEntity']
AND
head(labels(e2)) IN ['GeneEntity','CompoundEntity','DrugsEntity','DiseaseEntity','ProteinEntity']
RETURN e0.name, r01.confidence, e1.name, r12.confidence, e2.name, r23.confidence, e3.name