Оптимизация сопоставления запросов Neo4j Cypher по свойствам

У меня есть запрос Cypher, который работает очень плохо (~ 30 секунд):

START foo=node:foos('Name:*')
MATCH foo<-[:HasMember]-()<-[:PartOf]-()<-[:Connected]-bar
WHERE foo.Name IN ["name1", "name2"] AND bar.Enabled = true
RETURN DISTINCT bar.Guid AS Guid, foo.Name AS Name

Я думаю, что происходит то, что индекс Lucene используется для извлечения всех значений, а затем используется поиск по графу для сопоставления с именами в наборе, потому что, если я изменю запрос на тот, что ниже, он будет на несколько порядков быстрее. (16 мс):

START foo=node:foos('Name:"name1" OR Name:"name2"')
MATCH foo<-[:HasMember]-()<-[:PartOf]-()<-[:Connected]-bar
WHERE bar.Enabled = true
RETURN DISTINCT bar.Guid AS Guid, foo.Name AS Name

Есть ли способ заставить первый запрос выполняться так же быстро, как и второй, не прибегая к ручному построению запроса Lucene из набора имен?

Другим вариантом было бы использование обхода, но я предпочитаю оставаться в стране шифров, если это возможно.


person Anvar    schedule 12.03.2013    source источник


Ответы (1)


Может быть, если вы не хотите строить запрос, попробуйте фильтровать раньше? Нравиться

START foo=node:foos('Name:*')
WHERE foo.Name IN ["name1", "name2"]
WITH foo
MATCH foo<-[:HasMember]-()<-[:PartOf]-()<-[:Connected]-bar
WHERE bar.Enabled = true
RETURN DISTINCT bar.Guid AS Guid, foo.Name AS Name
person Luanne    schedule 12.03.2013
comment
Я бы все же предпочел второй, который подталкивает поиск имени к lucene. Ведь для этого и существует. - person Michael Hunger; 14.03.2013