2016-07-14 2 views
1

Я работаю над CYPHER для разных запросов, а мой запрос Match занимает слишком много времени.Вопрос о совпадении занимает слишком много времени в CYPHER

Запрос:

MATCH (a:FacebookComment), (b:FacebookLike) 

WHERE a.post_id > 696 
AND 
a.post_id < 746 
AND 
a.id = toint(b.comment_id) 

CREATE (a) <-[fpl:FB_COMMENT_LIKE]-(b) 

Есть 20117 узлы в FacebookLike и 6054 узлов в FacebookComment.

Для выполнения требуется 8 минут.

Что может быть проблемой в запросе или в любой другой точке?

EDIT

Я бегу PROFILE в шифровальщика запросе

PROFILE 
Match (a:FacebookComment) WHERE a.post_id > 696 AND a.post_id < 746 with a 
Match (b:FacebookLike) WHERE a.id = toint(b.comment_id) with b, a 
MERGE (a)<-[fpl:FB_COMMENT_LIKE]-(b) 

Потребовалось 808676 мс.

Результат:

enter image description here

И Cypher запрос:

PROFILE 
Match (a:FacebookComment), (b:FacebookLike) WHERE a.id = toint(b.comment_id) AND a.post_id > 696 AND a.post_id < 746 
MERGE (a)<-[fpl:FB_COMMENT_LIKE]-(b) 

Потребовалось 800793 мс.

РЕЗУЛЬТАТ:

enter image description here

+1

Вы построения '' Ā' на b' декартово произведение. Вам нужны отношения между ними, а не использование предложения WHERE для соответствия идентификатору. –

+0

На самом деле, я делаю отношения между FacebookLike и FacebookComment на основе предложения WHERE. –

+0

Хорошо. У вас есть указатель на их идентификатор? –

ответ

2

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

Особенно проблематично это toInt(), которое вы должны делать: FacebookLike comment_id ... это означает, что вы не можете использовать здесь индекс. Вы можете видеть, что в вашем ПРОФИЛЕ операция фильтра после декартового продукта, которая производит 372 миллиона дБ; для того чтобы сделать это сравнение id, он должен перебирать все: FacebookLike, меняя идентификатор на int, затем выполняйте сравнение. Это самая дорогая часть вашего запроса.

Если: comment_id FacebookLike уже был int (то есть, если toInt() не требуется, и вы его оставили по ошибке), или если вы потратите некоторое время на изменение: FacebookLike comment_id для int заблаговременно, вы должны увидеть значительное улучшение в этом фильтре.

Это также предполагает, что вы создаете индексы для обоих: FacebookComment.post_id и: FacebookLike.comment_id. (также убедитесь, что вы работаете с правильными полями ... у вас есть сообщения post_ids, comment_ids и идентификаторы в вашем запросе, может быть легко смешать вещи).

Что касается других улучшений (ПОСЛЕ того, как вы решили использовать большой вариант выше), разбивка вашего запроса на несколько частей поможет вам избежать декартова продукта.

Полный запрос может выглядеть следующим образом:

MATCH (a:FacebookComment) 
WHERE a.post_id > 696 
AND a.post_id < 746 
WITH a 
MATCH (b:FacebookLike) 
WHERE b.comment_id = a.id 
WITH a, b 
CREATE (a)<-[fpl:FB_COMMENT_LIKE]-(b) 
+0

выше запрос по-прежнему не является ценным в случае большого объема данных. По-прежнему требуется слишком много времени для выполнения. –

+0

Можете ли вы запустить ПРОФИЛЬ с вышеуказанным запросом и добавить его в свое описание с временем выполнения? Наряду с другими факторами, связанными с набором данных, который вы хотите запустить? Планируется ли, наконец, выполнить запрос во всем наборе данных и создать все отношения? – InverseFalcon

+0

Я попытался сделать это, но он продолжится в течение длительного времени и в конце появляется сообщение об ошибке «Ошибка неопределенной ошибки Неопределенная ошибка». –

Смежные вопросы