Как оптимизировать шифр, когда я хочу найти путь от узла к другому? - PullRequest
1 голос
/ 28 апреля 2019

Я хочу оптимизировать шифр, потому что он слишком медленный, чтобы получить результат.

Мой код:

MATCH (e0{name:"dacomitinib"})-[r01]-(e1)-[r12]-(e2)-[r23]-(e3{name:"rucaparib camsylate"})
WHERE (e1:GeneEntity or e1:CompoundEntity or e1:DrugsEntity or e1:DiseaseEntity or e1:ProteinEntity) 
and (e2:GeneEntity or e2:CompoundEntity or e2:DrugsEntity or e2:DiseaseEntity or e2:ProteinEntity) 
RETURN e0.name,r01.confidence,e1.name,r12.confidence,e2.name,r23.confidence,e3.name

Что мне делать?

обновить один:

PROFILE моего кода

enter image description here

Cypher версия: CYPHER 3.5, планировщик: COST, время выполнения: INTERPRETED.Всего 86876729 дБ обращений за 53454 мс.

1 Ответ

1 голос
/ 28 апреля 2019

Есть несколько способов повысить производительность вашего запроса.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...