Сайфер не использует NodeIndexSeek без подсказки - PullRequest
0 голосов
/ 02 октября 2018

Я добавляю связи с запросом UNWIND (neo4j 3.4.7, куча 30 ГБ, кэш страницы 30 ГБ):

UNWIND { rels } AS rel
MATCH (a:Locus), (b:Snp)
WHERE a.chr = rel.start_chr AND a.start = rel.start_start AND a.end = rel.start_end AND a.ref = rel.start_ref AND b.sid = rel.end_sid
CREATE (a)-[r:TEST_MAPS]->(b)
SET r = rel.properties

Вот примеры параметров:

:param rels => [{start_chr: '6', start_start: 93922926, start_end: 93922926, start_ref: 'h37', end_sid: 'rs782706', properties: {source: 'binder_immuno', uuid: 'e2ee1287-9894-4eb4-8ba8-d8adc4959e50'}}]

Свойства индексируются с помощью :Snp(sid) и :Locus(chr, start, end, ref).

Проблема : добавление связей происходит очень медленно.

При создании отношений планировщик запросов используетбыстрый NodeIndexSeek на a:Locus, но использует намного медленнее NodeIndexScan на b:Snp (по крайней мере, на один порядок медленнее).

Выбор планировщика зависит от меток, которыеиспользуется, то есть добавление отношений таким же образом с другими метками было быстрым и использовалось только NodeIndexSeek.

Я знаю, что могу заставить планировщика использовать поиск на b:Snp.Однако есть ли способ заставить Сайфера всегда выполнять поиск, когда индекс доступен без изменения запроса?

1 Ответ

0 голосов
/ 02 октября 2018

Cypher не дает никаких гарантий относительно того, как будет получена информация.Выполненный план будет зависеть от того, какую версию Neo4j (Planner) вы используете, и от внутренней статистики БД на момент планирования.

По этой причине Cypher вообще имеет подсказок ,Иногда внутренняя статистика вводит в заблуждение планировщика при выборе менее оптимального плана.

Один из способов, которым вы могли бы иметь возможность получить желаемые результаты, - встроить совпадения свойств, где вы можете.Как делать MATCH (a:Locus), (b:Snp{sid:rel.end_sid}).Это не гарантирует изменения окончательного плана, но перемещение части WHERE в часть MATCH, насколько это возможно, обычно дает лучшие планы.(Для более сложных запросов. Для более простых запросов разницы не будет. Пробег будет зависеть от используемой версии Neo4j.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...