Neo4j с изменяемой длиной паттерна - PullRequest
0 голосов
/ 04 сентября 2018

Запрос:

PROFILE
MATCH(node:Symptom) WHERE node.symptom =~ '.*adult male.*|.*151.*'
WITH node
MATCH (node)-[*1..2]-(result:Disease)
RETURN result

Профиль: введите описание изображения здесь

Проблемы: В базе данных более 40 тысяч узлов «Симптом», и запрос выполняется очень медленно из-за части - «[* 1..2]».

Потребовалось всего 4 секунды, когда длина равна 1, т. Е. «[* 1]», но это займет около 30 секунд, когда длина равна 2, т.е. «[* 1..2]».

Есть ли способ настроить этот запрос ???

1 Ответ

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

Во-первых, ваш запрос использует оператор regex, и он не может использовать индексы. Вместо этого вы должны использовать оператор CONTAINS:

MATCH (node:Symptom) 
WHERE node.symptom CONTAINS 'adult male' OR node.symptom CONTAINS '151'
RETURN node

И вы можете создать индекс: CREATE INDEX ON :Symptom(symptom)

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

Итак, чтобы иметь лучшие показатели, вы должны подумать:

  • поместите тип отношения в шаблон, чтобы уменьшить число возвращаемых путей: (node)-[*1..2:MY_REL_TYPE]-(result:Disease)
  • укажите направление на шаблоне, чтобы уменьшить число возвращаемых путей: (node)-[*1..2:MY_REL_TYPE]->(result:Disease)
  • найдите другой способ уменьшить эту сложность (отфильтруйте свойство отношения, просмотрите вашу модель и т. Д.)

Для вашей информации, вы можете напрямую написать запрос за один шаг (т. Е. Без WITH, но в вашем случае производительность должна быть такой же):

MATCH (node:Symptom)-[*1..2]-(result:Disease)
WHERE node.symptom CONTAINS 'adult male' OR node.symptom CONTAINS '151'
RETURN result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...