2013-11-26 2 views
0

Я использую версию neo4j 2.0-M5 сообщества Neo4j.Почему запросы cypher или может быть neo4j дает низкую производительность?

Я создал узлы с использованием драйвера JDBC от here, к сожалению, я не занимался автоматической индексацией, но создал наклейки. У меня 50 миллионов узлов, 160 миллионов свойств и 10 отношений. Я выполнить этот запрос с помощью Java API Neo4j внедренного

MATCH(names:DAR) 
with names limit 200000 
where names.name <> null 
and (names.name =~ ".* (?i)SHAIK$" or names.name =~ "(?i)SHAIK .*$" 
or names.name =~ ".* (?i)SHAIK .*$" or names.name =~ "(?i)SHAIK") 
AND NOT(names.name =~ '.(?i)shekar.$') 
AND NOT(names.name =~ '.(?i)shekhar.$') 
AND NOT(names.name =~ '.(?i)sheker.$') 
return names as names1 

Это займет 40 сек в шифровальщике консоли, 2 минут в Neo4j Java встроенного API.
ОК, хорошо, позже я обрабатывать их, используя следующий код

Iterator<Node> resultNode1 = result.columnAs("names1"); 
while (resultNode1.hasNext()) { 
    System.out.println("after ddd"+Calendar.getInstance().getTime()); 
} 

Для первой записи он занимает несколько секунд, но для последней записи он занимает 5 минут.

Я пробовал с различными входами, такими как SHAeK и sheek. Если в итераторе записано 100 записей, для первых 99 записей требуется 5 секунд и 5 минут для 100-й записи.

Я не могу увеличить производительность, пожалуйста, помогите мне?

+0

Просто чтобы быть ясно: 5 крор = 50 млн евро Итак, у вас есть 50 миллионов узлов, и вы выполняете до 7 проверок регулярных выражений против 200 000 узлов за раз? Просто догадаться, так как я не пробовал это, но я думаю, что это требует огромного количества CPU ... –

+0

Есть ли альтернатива этому? – AnilHoney

+0

, но мы применяем только 200000 узлов, – AnilHoney

ответ

1

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

Стоимость запуска сложного регулярного выражения, такого как тот, который вы предоставили, по 200 000 записей, которые вы соответствуете, является дорогостоящим вычислительным методом. Я предлагаю вам сначала ограничить количество записей, которые вы хотели бы сопоставить, а затем выполнить регулярное выражение. Управляемое количество записей будет под 100 для разумного времени выполнения.

Если это недопустимо для вашего приложения, я бы рассмотрел стратегию индексирования, которая позволяет вам использовать запрос Lucene для выполнения сопоставления вместо использования меток + RegEx.

Приветствия,

Kenny

+0

спасибо за ваш повтор, но импортер jdbc не поддерживает автоматическую индексацию – AnilHoney

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