У меня есть база данных с 9537 узлами и 52846 взаимосвязью. Оба узла и отношения имеют атрибуты, которые индексируются.Как я могу оптимизировать вложенный запрос Cypher?
Я бег много запросов к этой базе данных, которые имеют более или менее следующую форму:
START n0 = node:my_nodes(label='2'), n4 = node:my_nodes(label='2')
MATCH n0-[r0]-n4
WITH n0, n4, r0
MATCH n0-[r1]-n3
WHERE r1.lab - r0.lab = 0 and n3.label = 0 and id(r1) <> id(r0)
WITH n0, n4, n3, r0, r1
MATCH n0-[r2]-n2
WHERE r2.lab - r0.lab = 0 and n2.label = 2 and id(r2) <> id(r0) and id(r2) <> id(r1)
WITH n0, n4, n3, n2, r0, r1, r2
MATCH n0-[r3]-n1
WHERE r3.lab - r0.lab = -1 and n1.label= 0 and id(r3) <> id(r0) and id(r3) <> id(r1) and id(r3) <> id(r2)
RETURN id(n0), r0.lab, r1.lab, r2.lab, r3.lab;
Вместо конкретных значений для значений атрибутов (как для узлов и отношений) у меня есть параметры, которые изменяются. Структура MATCH также изменяется.
Моя проблема прямо сейчас в том, что если java не попадает в пределы памяти, запрос запускается более 30 минут.
Есть ли способ оптимизировать этот запрос? Нужно ли настраивать некоторые параметры конфигурации для повышения производительности?
PS: Я использую neo4j-1.9-RC2 на FreeBSD (там работает дистрибутив Linux). Конфигурация Памяти:
wrapper.java.initmemory=512
wrapper.java.maxmemory=8192
Я думал, что это было как WITH работал, но я уверен, что это на самом деле ленив, а это означает, что это больше похоже на трубопровод, который посылает приводит весь путь к end, пока окончательный возврат не будет повторен (если вам не нужно сортировать или делать что-то еще, что делает невозможным). Однако короткозамкнутая часть вашего аргумента остается в силе. –
WITH ленив, что он не предварительно вычисляет вещи, кроме случаев, когда вы используете 'order by',' distinct' или aggregation –
, ранее я писал запросы cypher так, как предлагает @ ean5533, но я понял, что запросы с 'WITH' выполнять быстрее. Сейчас я попробую разные комбинации. Имеет ли значение, сколько узлов я помещаю в «СТАРТ»? Лучше ли ставить только 'n0' в' START', а остальные - в 'WHERE'? – npobedina