2014-10-03 1 views
1

я получаю это исключение, когда я пытаюсь запустить длинный запрос:Neo4j высчитывать - Невозможно выполнить запрос [400], исключение 'StackOverflowError'

Невозможно выполнить запрос [400]: \ nHeaders: Array \ n (\ n [Content-Type] => application/json; charset = UTF-8; stream = true \ n [Access-Control-Allow-Origin] => * \ n [Transfer-Encoding] => chunked \ n [Server] => Jetty (9.0.5.v20130815) \ n) \ nBody: Array \ n (\ n [exception] => StackOverflowError \ n [fullname] => java.lang.StackOverflowError \ n [stacktrace] = > Array \ n (\ n [0] => org.neo4j.cypher.internal.compiler.v2_1.bottomUp $ BottomUpRewriter.apply (Rewritable.scala: 137) \ n [1] => org.neo4j.cypher.internal .compiler.v2_1.bottomUp $ BottomUpRewriter $$ anonfun $ 1.apply (Rewritable.scala: 137) \ n [2] => scala.collectio n.Iterator $$ anon $ 11.next (Iterator.scala: 328) \ n [3] => scala.collection.Iterator $ class.foreach (Iterator.scala: 727) \ n [4] => scala.collection. AbstractIterator.foreach (Iterator.scala: 1157) \ n [5] => scala.collection.generic.Growable $ class. $ Plus $ plus $ eq (Growable.scala: 48) \ n [6] => scala.collection .mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 176) \ n [7] => scala.collection.mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 45) \ n [8 ] => scala.collection.TraversableOnce $ class.to (TraversableOnce.scala: 273) \ n [9] => scala.collection.AbstractIterator.to (Iterator.scala: 1157) \ n [10] => scala.collection .TraversableOnce $ class.toList (TraversableOnce.scala: 257) \ n [11] => scala.collection.AbstractIterator.toList (Iterator.scala: 1157) \ n [12] => org.neo4j.cypher.internal.compiler .v2_1.bottomUp $ BottomUpRewriter.apply (Rewritable.scala: 137) \ n [13] => org.neo4j.cypher.internal.compiler.v2_1.bottomUp $ BottomUpRewriter $$ anonfun $ 1.apply (Rewritable.scala: 137) \ n [14] => scala.collection.I terator $$ anon $ 11.next (Iterator.scala: 328) \ n [15] => scala.collection.Iterator $ class.foreach (Iterator.scala: 727) \ n [16] => scala.collection.AbstractIterator. foreach (Iterator.scala: 1157) \ n [17] => scala.collection.generic.Growable $ class. $ plus $ plus $ eq (Growable.scala: 48) \ n [18] => scala.collection.mutable .ListBuffer. $ Plus $ plus $ eq (ListBuffer.scala: 176) \ n [19] => scala.collection.mutable.ListBuffer. $ Plus $ plus $ eq (ListBuffer.scala: 45) \ n [20] = > scala.collection.TraversableOnce $ class.to (TraversableOnce.scala: 273) \ n [21] => scala.collection.AbstractIterator.to (Iterator.scala: 1157) \ n [22] => scala.collection.TraversableOnce $ class.toList (TraversableOnce.scala: 257) \ n [23] => scala.collection.AbstractIterator.toList (Iterator.scala: 1157) \ n [24] => org.neo4j.cypher.internal.compiler.v2_1 .bottomUp $ BottomUpRewriter.apply (Rewritable.scala: 137) \ n [25] => org.neo4j.cypher.internal.compiler.v2_1.bottomUp $ BottomUpRewriter $$ anonfun $ 1.apply (Rewritable.scala: 137) \ n [26] => scala.collecti on.Iterator $$ anon $ 11.next (Iterator.scala: 328) \ n [27] => scala.collection.Iterator $ class.foreach (Iterator.scala: 727) \ n [28] => scala.collection. AbstractIterator.foreach (Iterator.scala: 1157) \ n [29] => scala.collection.generic.Growable $ class. $ Plus $ plus $ eq (Growable.scala: 48) \ n [30] => scala.collection .mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 176) \ n [31] => scala.collection.mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 45) \ n [32 ] => scala.collection.TraversableOnce $ class.to (TraversableOnce.scala: 273) \ n [33] => scala.collection.AbstractIterator.to (Iterator.scala: 1157) \ n [34] => scala.collection .TraversableOnce $ class.toList (TraversableOnce.scala: 257) \ n [35] => scala.collection.AbstractIterator.toList (Iterator.scala: 1157) \ n [36] => org.neo4j.cypher.internal.compiler .v2_1.bottomUp $ BottomUpRewriter.apply (Rewritable.scala: 137) \ n [37] => org.neo4j.cypher.internal.compiler.v2_1.bottomUp $ BottomUpRewriter $$ anonfun $ 1.apply (Rewritable.scala: 137) \ n [38] => scala.coll ection.Iterator $$ anon $ 11.next (Iterator.scala: 328) \ n [39] => scala.collection.Iterator $ class.foreach (Iterator.scala: 727) \ n [40] => scala.collection. AbstractIterator.foreach (Iterator.scala: 1157) \ n [41] => scala.collection.generic.Growable $ class. $ Plus $ plus $ eq (Growable.scala: 48) \ n [42] => scala.collection .mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 176) \ n [43] => scala.collection.mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 45) \ n [44 ] => scala.collection.TraversableOnce $ class.to (TraversableOnce.scala: 273) \ n [45] => scala.collection.AbstractIterator.to (Iterator.scala: 1157) \ n [46] => scala.collection .TraversableOnce $ class.toList (TraversableOnce.scala: 257) \ n [47] => scala.collection.AbstractIterator.toList (Iterator.scala: 1157) \ n [48] => org.neo4j.cypher.internal.compiler .v2_1.bottomUp $ BottomUpRewriter.apply (Rewritable.scala: 137) \ n [49] => org.neo4j.cypher.internal.compiler.v2_1.bottomUp $ BottomUpRewriter $$ anonfun $ 1.apply (Rewritable.scala: 137) \ n [50] => scala.collection.Iterator $$ anon $ 11.next (Iterator.scala: 328) \ n [51] => scala.collection.Iterator $ class.foreach (Iterator.scala: 727) \ n [52] => scala.collection. AbstractIterator.foreach (Iterator.scala: 1157) \ n [53] => scala.collection.generic.Growable $ class. $ Plus $ plus $ eq (Growable.scala: 48) \ n [54] => scala.collection .mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 176) \ n [55] => scala.collection.mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 45) \ n [56 ] => scala.collection.TraversableOnce $ class.to (TraversableOnce.scala: 273) \ n [57] => scala.collection.AbstractIterator.to (Iterator.scala: 1157) \ n [58] => scala.collection .TraversableOnce $ class.toList (TraversableOnce.scala: 257) \ n [59] => scala.collection.AbstractIterator.toList (Iterator.scala: 1157) \ n [60] => org.neo4j.cypher.internal.compiler .v2_1.bottomUp $ BottomUpRewriter.apply (Rewritable.scala: 137) \ n [61] => org.neo4j.cypher.internal.compiler.v2_1.bottomUp $ BottomUpRewriter $$ anonfun $ 1.apply (Rewritable.scala: 137) \ n [62] => sc ala.collection.Iterator $$ anon $ 11.next (Iterator.scala: 328) \ n [63] => scala.collection.Iterator $ class.foreach (Iterator.scala: 727) \ n [64] => scala. collection.AbstractIterator.foreach (Iterator.scala: 1157) \ n [65] => scala.collection.generic.Growable $ class. $ plus $ plus $ eq (Growable.scala: 48) \ n [66] => scala .collection.mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 176) \ n [67] => scala.collection.mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 45) \ n [68] => scala.collection.TraversableOnce $ class.to (TraversableOnce.scala: 273) \ n [69] => scala.collection.AbstractIterator.to (Iterator.scala: 1157) \ n [70] => scala .collection.TraversableOnce $ class.toList (TraversableOnce.scala: 257) \ n [71] => scala.collection.AbstractIterator.toList (Iterator.scala: 1157) \ n [72] => org.neo4j.cypher.internal .compiler.v2_1.bottomUp $ BottomUpRewriter.apply (Rewritable.scala: 137) \ n [73] => org.neo4j.cypher.internal.compiler.v2_1.bottomUp $ BottomUpRewriter $$ anonfun $ 1.apply (Rewritable.scala: 137) \ n [74] = > scala.collection.Iterator $$ anon $ 11.next (Iterator.scala: 328) \ n [75] => scala.collection.Iterator $ class.foreach (Iterator.scala: 727) \ n [76] => scala .collection.AbstractIterator.foreach (Iterator.scala: 1157) \ n [77] => scala.collection.generic.Growable $ class. $ plus $ plus $ eq (Growable.scala: 48) \ n [78] => scala.collection.mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 176) \ n [79] => scala.collection.mutable.ListBuffer. $ plus $ plus $ eq (ListBuffer.scala: 45) \ n [80] => scala.collection.TraversableOnce $ class.to (TraversableOnce.scala: 273) \ n [81] => scala.collection.AbstractIterator.to (Iterator.scala: 1157) \ n [82] => scala.collection.TraversableOnce $ class.toList (TraversableOnce.scala: 257) \ п [83] => SCAL

Запрос:

start k = node: node_auto_index ("title: abc *") где k.id в [123,456, ...] возвращает отдельный k.prop;

Вверху, где есть список из около 3000 идентификаторов. Я использую neo4j-community-2.1.2 и neo4jphp. Есть ли какая-нибудь работа вокруг этого?

+0

Можете ли вы опубликовать трассировку стека более разборчиво и можете ли вы отправить запрос? – JohnMark13

+0

Спасибо, добавил подробный журнал ошибок. Запрос является простым, но имеет очень длинный список в предложении WHERE. –

+0

Можете ли вы разместить запрос? – JohnMark13

ответ

1

Возможно, вы исправите проблему переполнения, если настроите параметры JVM на свои данные. This page в особенности имеет дело с этим, но вся настройка «Конфигурация и производительность» является критическим чтением для тех, кто использует Neo4j.

Но с учетом этого я постараюсь избежать подобных запросов. Тот факт, что этот тип индексации называется «наследием», должен быть предупреждением, и, в общем, я считаю, что лучше избегать его полностью, если есть лучшие варианты. Индексирование устаревших, насколько я могу судить по всему, что я читал, не позволяет вам использовать ярлыки, поэтому вам не хватает одного из самых полезных аспектов Neo4j 2.0+.

Наличие этой звездочки предполагает, что вы хотите полнотекстовый поиск по индексу. Унаследованное индексирование - единственный способ сделать это изначально, но компромисс - это массивный запрос, подобный этому. Игнорируйте индекс на мгновение, и вы увидите, как вы это сделаете, если не используете устаревшие индексы. Поскольку есть много узлов, у которых есть что-то общее, вы можете поместить на них ярлык, а затем выполнить поиск по метке.Это было бы так просто, как это:

MATCH (n:`MyLabel`) WHERE n.name =~ "abc*" return n 

Даже с индексом на MyLabel:name, поиск регулярных выражений будет пропустить и сделать это в Cypher, но это гораздо легче читать, управлять, и это современная способ поиска в базе данных.

Альтернатива, которую я использую всякий раз, когда мне нужен полнотекстовый поиск, является Elasticsearch. Он использует индексы lucene, такие же, как Neo4j. Плагин, который я связал в комментарии, https://github.com/sksamuel/elasticsearch-river-neo4j, проиндексирует свойства данных меток в вашей базе данных. Вы можете искать против этого, и он вернет узлы, которые соответствуют. Недостатком этого является то, что это дополнительная сантехника, и я не уверен, насколько она эффективна - она ​​говорит, что она обновляет все узлы на каждой царапине базы данных, что не кажется большим, но это начало, и я уверен он может быть улучшен - НО вы можете не прибегать к устаревшим функциям или неуклюжим запросам, чтобы получить нужную вам информацию. Я вижу, что вы используете PHP, поэтому вы можете написать скрипт, который более эффективно обрабатывает его на уровне приложения.

TL; DR: настройте сервер, чтобы устранить сбой; исправьте свой запрос и ваши индексы, чтобы упростить код.

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

  • Нет связанных вопросов^_^