Есть ли способ оптимизировать этот запрос для оператора OR, где? - PullRequest
0 голосов
/ 17 мая 2018

Следующий запрос занимает 347 мс, что слишком много для моего приложения.Есть ли способ оптимизировать этот запрос?

profile
MATCH (s:product {id:'4554969'})-[r]->(o)
WHERE o:ExAttrs OR o:ProdAttrs
return s.item_sku_id, TYPE(r), o;

enter image description here

1 Ответ

0 голосов
/ 18 мая 2018

Это не время запроса, это время, когда все данные доступны (т.е. когда драйвер получил все данные).

Время запроса можно посмотреть на вкладке Таблица .

Пример:

Started streaming 10 records after 1 ms and completed after 2 ms

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

MATCH (s:product {id:$id})-[r]->(o)
WHERE o:ExAttrs OR o:ProdAttrs
return s.item_sku_id, TYPE(r), o

И посмотрите здесь , как использовать параметр с драйвером по вашему выбору.

EDIT:

public String query_partial_match(String skuid, String attrKey) {

        return "MATCH (s:product {id:'" + skuid + "'})-[r]->(o) " +
                "WHERE " +
                "(o:ExAttrs OR o:ProdAttrs) AND " +
                "any(key in keys(o) WHERE key =~'(?i).*(" + attrKey + ").*') " +
                "return s.item_sku_id, s.item_name, r, o";
    }

У меня около 50 таких функций Java для динамической генерации строк запроса шифрования, а затем отправки запроса в «execute» драйвера API для получения результата. В приведенном выше примере я уже использую способ «параметра» для генерации правильного запроса шифра. Тем не менее, эта параметризация имеет место только в моем коде генерации запроса, но в 'execute' нет параметризации. Мой коллега обернул собственный API-драйвер Neo4j в Neo4jSearchAPI, у которого есть метод execute для получения строки запроса шифрования в качестве параметра для запроса на графике. И мой код, как указано выше, генерирует такие зашифрованные строки запроса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...