2015-11-10 2 views
0

Я создаю API в Flask, который говорит с neo4j db. Один особенно большой запрос (15 минут +) разрушает API. Разрушение означает контейнер Docker, в котором он работает, останавливается без регистрации запроса. Проблема в том, что я не могу воспроизвести ошибку при запуске API локально.API-интерфейс Flask при длинном запросе Cypher

Что мне кажется, это способ запуска запроса с использованием py2neo, а затем вернуть произвольный ответ без, ожидающий завершения запроса.

def post(self): 
    g.cypher.run("MATCH a-[r]-b SET r.cost = " 
    "CASE WHEN r.cost <1 THEN 0.01*exp(4.60517*(r.costx+0.01)) ELSE r.cost END " 
    "SET r.costx = " 
    "CASE WHEN r.costx < 1 THEN r.costx + 0.01 ELSE r.costx END " 
    "RETURN r") 
    return make_response(jsonify({'success': 'all relationship costs increased'}), 200) 

Я действительно не парень с опциями, поэтому любые более широкие идеи этой головоломки приветствуются.

+0

Http: // колба .pocoo.org/docs/0.10/patterns/celery/ – davidism

ответ

1

Сколько у вас данных в этой базе данных? Возможно, вам лучше начать запуск r = rel (*) ...

Почему вы возвращаете r в первую очередь?

Я бы партия запрос и добавить это условие:

START r=rel(*) 
WITH r 
WHERE r.cost < 1 OR r.costx < 1 
WITH r 
SKIP {batchSize} LIMIT 100000 
SET r.cost = CASE WHEN r.cost < 1 THEN 0.01*exp(4.60517*(r.costx+0.01)) ELSE r.cost END 
WITH r WHERE r.costx < 1 
SET r.costx = r.costx + 0.01 

или лучше запустить его в два прохода:

START r=rel(*) 
WITH r 
WHERE r.cost < 1 
WITH r 
SKIP {batchSize} LIMIT 100000 
SET r.cost = 0.01*exp(4.60517*(r.costx+0.01)) 

и то же самое для cost.x

+0

Просто не возвращаясь, решает проблему. Другое потенциальное решение заключается в том, что память кучи по умолчанию не подходит для больших запросов. Благодаря! –

+0

Я попробовал ваши предлагаемые запросы без доработки, и они работают намного лучше, чем мои. Почему «START r = rel (*)» намного быстрее, чем «MATCH a- [r] -b»? –