9.7 Using

  1. 9.7.1 Запрос, использующий индексный хинт
  2. 9.7.2 Запрос, использующий несколько индексных хинтов
  3. 9.7.3 Использование хинта на сканирование метки

Если вы явно не указываете предложение START, Cypher необходима информация о том, откуда в графе начать выполнение запроса. Для этого просматривается предложение WHERE и предложение MATCH, и на основании этой информации подбирается подходящий индекс.

Однако этот индекс может оказаться не лучшим выбором – иногда может быть использовано несколько индексов, и Cypher выбрал неправильный (с точки зрения производительности).

Вы можете принудить Cypher использовать конкретную точку отсчета с помощью предложения USING. В этом случае говорят, что дали Cypher индексный хинт (совет).

Если ваш запрос сопоставляется большим частям индекса, возможно, более быстрым решением будет сканирование метки и фильтрация узлов, которым нет соответствия. Для этого вы можете использовать USING SCAN. Это принудит Cypher не использовать индекс, который мог быть использован вместо сканирования метки.

Замечание

Вы не можете использовать индексные хинты, если ваш запрос содержит предложение START.

9.7.1 Запрос, использующий индексный хинт

Для подобных запросов используйте USING INDEX.

Запрос

MATCH (n:Swedish)
USING INDEX n:Swedish(surname)
WHERE n.surname = 'Taylor'
RETURN n

Как и следовало ожидать, результатом будет:

Таблица 9.22 Результат

n
Node[3]{name:"Andres",age:36,awesome:true,surname:"Taylor"}

9.7.2 Запрос, использующий несколько индексных хинтов

Используйте USING INDEX для запросов с индексными хинтами.

Запрос

MATCH (m:German)-->(n:Swedish)
USING INDEX m:German(surname)
USING INDEX n:Swedish(surname)
WHERE m.surname = 'Plantikow' AND n.surname = 'Taylor'
RETURN m

Таблица 9.23 Результат

m
Node[1]{name:"Stefan",surname:"Plantikow"}

9.7.3 Использование хинта на сканирование метки

Если наилучшая производительность должна достигаться при сканировании всех узлов в метке с последующей фильтрацией полученного набора, используйте USING SCAN.

Запрос

MATCH (m:German)
USING SCAN m:German
WHERE m.surname = 'Plantikow'
RETURN m

Этот запрос выполняет поиск всех узлов, помеченных меткой :German и фильтрацией их по свойству surname.

Таблица 9.24 Результат

m
Node[1]{name:"Stefan",surname:"Plantikow"}

Предыдущая | Следующая