Cypher Query в Neo4j возвращает undefined

Я построил граф с использованием Neo4j, который состоит из около 1000 узлов и около 270 000 отношений. Граф - это сеть полетов (аэропорты - это узлы, а полеты - это отношения), поэтому существует множество взаимосвязей от узла к узлу. Я уверен, что в определенных запросах тоже много циклов (не уверен, что это проблема). В любом случае, некоторые запросы работают нормально, например:

start a=node(1), b=node(2) match p=a-[:flys_to*..1]->b return p;
start a=node(1), b=node(2) match p=shortestPath(a-[:flys_to]->b) return p;

Но когда я пытаюсь выполнить другие более сложные запросы, сообщение об ошибке не появляется; он просто зависает примерно на 3 минуты (в зависимости от того, между какими двумя узлами я ищу) и возвращает «Не определено».

Один из зависших запросов выглядит так:

start a=node(1), b=node(2) match p=a-[:flys_to*..2]->b return p;

Кроме того, интересное примечание: когда я набираю следующий запрос, он сразу же возвращает «Не определено»:

start a=node(1), b=node(2) match p=a-[:flys_to]->b return p;

Есть ли в этом смысл или у кого-нибудь есть идеи относительно того, где я могу начать устранение неполадок?

Дополнительная информация об этой конкретной проблеме

Вот сжатый файл базы данных: http://www.opensourcebanking.org/neo4j/

Я запускаю это в виртуальной среде через VMware. Хост - OSX 10.8.2, а гость - Windows Server 2012. JRE - 1.6.0_38. Кроме того, у меня есть настройка автоматической индексации для свойства узла «iata» и свойства отношения «flys_to».

Вот несколько запросов Cypher и связанных с ними зарегистрированных сообщений:

Следующий запрос почти сразу возвращает undefined:

start a=node(353), b=node(295)
match p=a-->b
return p;

И вот что я записываю в журнал:

SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
org.neo4j.helpers.ThisShouldNotHappenError: Developer: Andres claims that: Unexpected traversal state encountered
    at org.neo4j.cypher.internal.pipes.matching.BidirectionalTraversalMatcher$StepCollisionDetector.includePath(BidirectionalTraversalMatcher.scala:101)
    at org.neo4j.kernel.StandardBranchCollisionDetector.evaluate(StandardBranchCollisionDetector.java:74)
    at org.neo4j.kernel.StandardBranchCollisionDetector.evaluate(StandardBranchCollisionDetector.java:37)
    at org.neo4j.kernel.impl.traversal.BidirectionalTraverserIterator.fetchNextOrNull(BidirectionalTraverserIterator.java:157)
    at org.neo4j.kernel.impl.traversal.BidirectionalTraverserIterator.fetchNextOrNull(BidirectionalTraverserIterator.java:41)
    at org.neo4j.helpers.collection.PrefetchingIterator.hasNext(PrefetchingIterator.java:55)
    at scala.collection.JavaConversions$JIteratorWrapper.hasNext(JavaConversions.scala:574)
    at scala.collection.Iterator$$anon$21.hasNext(Iterator.scala:371)
    at scala.collection.Iterator$$anon$21.hasNext(Iterator.scala:371)
    at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
    at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
    at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
    at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply$mcZ$sp(ClosingIterator.scala:36)
    at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:35)
    at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:35)
    at org.neo4j.cypher.internal.ClosingIterator.failIfThrows(ClosingIterator.scala:87)
    at org.neo4j.cypher.internal.ClosingIterator.hasNext(ClosingIterator.scala:35)
    at scala.collection.Iterator$class.foreach(Iterator.scala:660)
    at org.neo4j.cypher.internal.ClosingIterator.foreach(ClosingIterator.scala:31)
    at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48)
    at scala.collection.mutable.ListBuffer.$plus$plus$eq(ListBuffer.scala:128)
    at scala.collection.TraversableOnce$class.toList(TraversableOnce.scala:242)
    at org.neo4j.cypher.internal.ClosingIterator.toList(ClosingIterator.scala:31)
    at org.neo4j.cypher.PipeExecutionResult.createTimedResults(PipeExecutionResult.scala:73)
    at org.neo4j.cypher.PipeExecutionResult.dumpToString(PipeExecutionResult.scala:80)
    at org.neo4j.cypher.PipeExecutionResult.dumpToString(PipeExecutionResult.scala:125)
    at org.neo4j.cypher.javacompat.ExecutionResult.dumpToString(ExecutionResult.java:91)
    at org.neo4j.shell.kernel.apps.Start.exec(Start.java:71)
    at org.neo4j.shell.kernel.apps.ReadOnlyGraphDatabaseApp.execute(ReadOnlyGraphDatabaseApp.java:32)
    at org.neo4j.shell.impl.AbstractAppServer.interpretLine(AbstractAppServer.java:115)
    at org.neo4j.shell.kernel.GraphDatabaseShellServer.interpretLine(GraphDatabaseShellServer.java:92)
    at org.neo4j.shell.impl.AbstractClient.evaluate(AbstractClient.java:130)
    at org.neo4j.shell.impl.AbstractClient.evaluate(AbstractClient.java:114)
    at org.neo4j.server.webadmin.console.ShellSession.evaluate(ShellSession.java:101)
    at org.neo4j.server.webadmin.rest.console.ConsoleService.exec(ConsoleService.java:125)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

Следующий запрос работает нормально. Он возвращает 426 строк, и ничего не регистрируется.

start a=node(353), b=node(295)
match p=a-[:flys_to*..1]->b
return p;

Следующий запрос возвращает undefined примерно через 10-15 минут:

start a=node(353), b=node(295)
match p=a-[:flys_to*..2]->b
return p;

Бревно:

SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container
java.lang.OutOfMemoryError: Java heap space
    at org.neo4j.cypher.internal.pipes.matching.AddedHistory.toSeq(History.scala:87)
    at org.neo4j.cypher.internal.pipes.matching.AddedHistory.toMap(History.scala:75)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.isMatchSoFar(PatternMatcher.scala:166)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.org$neo4j$cypher$internal$pipes$matching$PatternMatcher$$traverseNextNodeFromRelationship(PatternMatcher.scala:98)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher$$anonfun$4.apply(PatternMatcher.scala:150)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher$$anonfun$4.apply(PatternMatcher.scala:150)
    at scala.collection.immutable.Stream$$anonfun$map$1.apply(Stream.scala:175)
    at scala.collection.immutable.Stream$$anonfun$map$1.apply(Stream.scala:175)
    at scala.collection.immutable.Stream$Cons.tail(Stream.scala:634)
    at scala.collection.immutable.Stream$Cons.tail(Stream.scala:626)
    at scala.collection.immutable.Stream.foldLeft(Stream.scala:302)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseRelationship(PatternMatcher.scala:150)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseNextSpecificNode(PatternMatcher.scala:61)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseNode(PatternMatcher.scala:72)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.foreach(PatternMatcher.scala:36)
    at scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:48)
    at scala.collection.mutable.ArrayBuffer.$plus$plus$eq(ArrayBuffer.scala:99)
    at scala.collection.TraversableOnce$class.toBuffer(TraversableOnce.scala:250)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.toBuffer(PatternMatcher.scala:28)
    at scala.collection.TraversableLike$class.toStream(TraversableLike.scala:571)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.toStream(PatternMatcher.scala:28)
    at scala.collection.TraversableLike$class.toIterator(TraversableLike.scala:570)
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.toIterator(PatternMatcher.scala:28)
    at scala.collection.Iterator$$anon$21.hasNext(Iterator.scala:371)
    at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
    at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
    at scala.collection.Iterator$$anon$19.hasNext(Iterator.scala:334)
    at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply$mcZ$sp(ClosingIterator.scala:36)
    at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:35)
    at org.neo4j.cypher.internal.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:35)
    at org.neo4j.cypher.internal.ClosingIterator.failIfThrows(ClosingIterator.scala:87)
    at org.neo4j.cypher.internal.ClosingIterator.hasNext(ClosingIterator.scala:35)

person Brent Barbata    schedule 15.01.2013    source источник
comment
Вы должны предоставить образец базы данных на console.neo4j.org, чтобы мы могли с ней поиграть.   -  person Werner Kvalem Vesterås    schedule 15.01.2013
comment
возможно, поможет простая очистка БД. просто сотрите папку с neo4j и снова распакуйте и снова создайте данные.   -  person ulkas    schedule 15.01.2013
comment
@ WernerVesterås Я не уверен, какую часть графика вы хотели, поэтому я просто попытался создать все это @ console.neo4j.org и почти уверен, что сломал его: / Он работал нормально, но после того, как я попытался создать мой график я получил следующую ошибку: в приложении произошла ошибка, и ваша страница не может быть обслужена. Пожалуйста, попробуйте снова через пару минут. Если вы являетесь владельцем приложения, проверьте свои журналы для получения подробной информации. Прошу прощения, если я причинил вред. Кажется, сейчас это резервное копирование, но я боюсь попробовать еще раз.   -  person Brent Barbata    schedule 16.01.2013
comment
@ulkas Спасибо за ответ. Сегодня я пытался воссоздать график как на 1.8.1, так и на 1.9.M03, но, к сожалению, у меня все еще есть та же проблема.   -  person Brent Barbata    schedule 16.01.2013
comment
Пожалуйста, посмотрите журналы в data / log / и data / graph.db / messages.log на предмет каких-либо исключений, которыми можно поделиться здесь. Можете ли вы поделиться где-нибудь заархивированной копией своей базы данных? Сколько памяти вы используете для своего сервера?   -  person Michael Hunger    schedule 16.01.2013
comment
@MichaelHunger Да, я определенно могу поделиться сжатой копией моей базы данных. Вот ссылка. Я также обновил исходный вопрос, добавив некоторые запросы и связанные с ними зарегистрированные сообщения (если есть). Я использовал эту машину с 2 ГБ оперативной памяти, но после того, как вы спросили меня об этом, я увеличил ее до 8 ГБ. Интересно то, что после увеличения объема памяти вместо зависания около 3 минут с последующим возвратом undefined, теперь он зависает около 10-15 минут и возвращает undefined. (Журнал также показывает нехватку памяти.)   -  person Brent Barbata    schedule 16.01.2013
comment
Я думаю, что проблема здесь в том, что существует так много связей между узлами и из них, что я нахожусь в МНОГО циклов. Под циклами я подразумеваю, что хотя путь / отношения от узла к узлу различаются, на пути появляется один и тот же узел. Вот пример с консолью: console.neo4j.org/?id=k34uet. Есть ли способ прервать путь, когда он встретит два одинаковых узла? Я видел пример с использованием WITH ALL ..., но я боюсь, что он не решит проблему нехватки памяти, поскольку MATCH выполняется до WITH. Это правильно?   -  person Brent Barbata    schedule 23.01.2013
comment
на самом деле match пытается задействовать как можно больше выражений, чтобы уменьшить совпадение.   -  person Michael Hunger    schedule 20.02.2013


Ответы (2)


Вы пытались использовать shortestPath или allShortestPaths для своих запросов?

 start a=node(1), b=node(2) match p=allShortestPaths(a-[:flys_to*..2]->b) return p;


+--------------------------------------------------------------------------------------------------------+
| p                                                                                                      |
+--------------------------------------------------------------------------------------------------------+
| [Node[1]{iata:"ABE"},:flys_to[224044] {},Node[546]{iata:"SFO"},:flys_to[24211] {},Node[2]{iata:"ABI"}] |
| [Node[1]{iata:"ABE"},:flys_to[224044] {},Node[546]{iata:"SFO"},:flys_to[24210] {},Node[2]{iata:"ABI"}] |
....
| [Node[1]{iata:"ABE"},:flys_to[66032] {},Node[146]{iata:"DFW"},:flys_to[1] {},Node[2]{iata:"ABI"}]      |
| [Node[1]{iata:"ABE"},:flys_to[66032] {},Node[146]{iata:"DFW"},:flys_to[0] {},Node[2]{iata:"ABI"}]      |
+--------------------------------------------------------------------------------------------------------+
28 rows
20 ms
 start a=node(1), b=node(2) match p=shortestPath(a-[:flys_to*..2]->b) return p;

+--------------------------------------------------------------------------------------------------------+
| p                                                                                                      |
+--------------------------------------------------------------------------------------------------------+
| [Node[1]{iata:"ABE"},:flys_to[224044] {},Node[546]{iata:"SFO"},:flys_to[24211] {},Node[2]{iata:"ABI"}] |
+--------------------------------------------------------------------------------------------------------+
1 row
1 ms
person Michael Hunger    schedule 20.02.2013
comment
да, я пробовал их (и они всегда работали очень быстро), но я надеялся, что смогу установить максимальное количество прыжков, а затем получить все пути ниже этого лимита. Например, если установлено не более 2 переходов, я бы хотел, чтобы он возвращал все пути с 1 переходом, а также с 2 переходами. - person Brent Barbata; 20.02.2013

Для меня это возвращает 426 строк:

start a=node(353), b=node(295)
match p=a-->b
return p;
person Michael Hunger    schedule 20.02.2013
comment
Это так странно. Каждый раз, когда я пытаюсь выполнить этот запрос, я получаю сообщение об ошибке, указанное выше. Как вы думаете, это может иметь какое-либо отношение к среде, в которой я его использую (Win 2012 Svr и Java 6)? - person Brent Barbata; 20.02.2013
comment
Итак, я обновился до Neo4j M04 и Java 7u17, и теперь этот запрос, похоже, работает нормально. Сейчас он возвращает 426 строк. Но для больших запросов, которые проходят через один и тот же узел несколько раз, я все еще сталкиваюсь с проблемой нехватки памяти. Я собираюсь попробовать добавить к отношениям дополнительные свойства (например, дни и время полета), чтобы уменьшить количество возможных путей. Посмотрим, как это работает. - person Brent Barbata; 05.03.2013