Сложность запроса neo4j - PullRequest
       51

Сложность запроса neo4j

0 голосов
/ 12 сентября 2018

Мне нужно измерить производительность любого запроса.

например:

MATCH (n:StateNode)-[r:has_city]->(n1:CityNode)
WHERE n.shortName IN {0} and n1.name IN {1} 
WITH n1
Match (aa:ActiveStatusNode{isActive:toBoolean('true')})--(n2:PannaResume)-[r1:has_location]->(n1)
WHERE (n2.firstName="master") OR (n2.lastName="grew" )
WITH n2  
MATCH (o:PannaResumeOrganizationNode)<-[h:has_organization]-(n2)-[r2:has_skill]->(n3:Skill)
WHERE (0={3} OR o.organizationId={3}) AND (0={4} OR n3.name IN {2} OR n3.name IN {5}) 
WITH size(collect(n3)) as count, n2 
MATCH (n2) where (0={4} OR count={4}) 
RETURN DISTINCT n2 

Я пытался профиль и объяснить предложения, но они только возвращают количество попаданий в дБ. Можно ли получить большие нотации для запроса neo4j, т. Е. Cn мы измеряем производительность в терминах больших нотаций O? Существуют ли другие способы проверки производительности запросов, кроме использования профиля и объяснения ?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Нет, вы не можете преобразовать Cypher в нотацию Big O.

Cypher не описывает, как получить информацию, только какую информацию вы хотите вернуть. Планировщик Cypher в базе данных Neo4j должен преобразовать Cypher в исполняемый запрос (используя эвристику о том, какую информацию он должен найти, какие индексы доступны для него и внутреннюю статистику по запрашиваемому набору данных. Поэтому просто измените Состояние базы данных может изменить сложность Cypher.)

Очень простой пример этого - Cypher Cypher 3.1 MATCH (a{id:1})-[*0..25]->(b) RETURN DISTINCT b. Используя довольно усредненный связный граф с циклами, работа с Neo4j 3.1.1 приведет к превышению времени ожидания из-за того, что он слишком сложный (поскольку планировщик пытается найти все пути, даже если ему не нужна эта избыточная информация), тогда как Neo4j 3.2.3 будет возврат очень быстро (поскольку планировщик признает, что ему нужно только выполнить сканирование графика, например поиск в глубину, чтобы найти все подключенные узлы).


Дополнительное примечание, вы можете утверждать, что BIG O обозначения на возвращаемые результаты. Например, MATCH (a), (b) должен иметь минимальную сложность n ^ 2, потому что результатом является декартово произведение, и выполнение не может быть менее сложным, чем ответ. Это понимание того, как сложность влияет на количество строк, может помочь вам написать Cyphers, которые уменьшат объем работы, которую планировщик заканчивает планировать.

Например, использование WITH COLLECT(n) as data MATCH (c:M) для уменьшения количества строк, с которыми планировщик заканчивает работу перед следующей частью шифра, с нм (число первых совпадений, число вторых совпадений) до m (число совпадений, равное 1 раз) .

Однако, поскольку Сайфер не дает никаких обещаний о том, как найти данные, нет способа гарантировать сложность выполнения. Мы можем только попытаться написать Сайферы, которые с большей вероятностью получат оптимальный план выполнения, и использовать EXPLAIN / PROFILE, чтобы оценить, может ли планировщик найти относительно оптимальное решение.

0 голосов
/ 06 мая 2019

Ничего подобного нет в наличии. Но это может быть получено / приближено с некоторыми дополнительными усилиями.

При профилировании запроса мы получаем список функций, которые neo4j будет запускать для достижения желаемого результата. Каждая из этих функций будет связана со сложностями в теории от худшего к лучшему. И некоторые из них будут работать параллельно. Это повлияет на время выполнения, в зависимости от ядер, которые есть на вашем сервере.

Например, совпадение (a: A) совпадение (a: B) приводит к декартову произведению. И это будет O (count (a) * count (b))

Точно так же каждая функция в вашем плане запроса имеет такие временные сложности.

Таким образом, совокупности этих отдельных временных сложностей этих функций дадут вам общее приближение сложности времени запроса.

Но время от времени это будет меняться с каждой версией neo4j, поскольку их сообщество всегда может изменить имплантацию запроса или добиться лучшего времени выполнения / структурных изменений / распараллеливания / меньшего использования оперативной памяти.

Если то, что вы ищете, является показателем оптимизации db-hit запросов neo4j, это хороший показатель.

0 голосов
/ 12 сентября 2018

Результаты PROFILE показывают, как сервер neo4j действительно планирует обрабатывать ваш запрос Cypher.Вам необходимо проанализировать план выполнения, выявленный в результатах PROFILE, чтобы получить большую сложность.Мне не известны инструменты для этого (хотя для кого-то было бы неплохо создать его).

Вам также следует помнить, что план выполнения запроса может измениться.со временем по мере изменения характеристик БД, а также при переходе на другую версию neo4j.

...