Neo4j пространственный - ошибка при выполнении запроса Cypher

Я использую Neo4j 2.0.1. вместе с пространственным плагином для 2.0.1. вместе с драйвером JDBC для 2.0.1. Я создал простой точечный слой и индекс для выполнения пространственного запроса. Если я наберу следующий запрос в браузере, будут возвращены соответствующие узлы:

START n=node:geom('withinDistance:[15.0,60.0, 200.0]') RETURN n

Я написал метод в моем сервлете, чтобы отправить этот запрос:

   //connect to database
   try {
            if(connection == null || connection.isClosed())
            {

                Class.forName("org.neo4j.jdbc.Driver"); // load jdbc driver
                connection = DriverManager.getConnection("jdbc:neo4j://localhost:7474"); 

            }
        } catch (SQLException e) {
            System.out.println("could not connect do DB: <br>" + e.getCause()
                    + "<br>" + e.getMessage());

        } catch (ClassNotFoundException e) {
            System.out.println("Could not load JDBC DRIVER");
            e.printStackTrace();
        }

Затем я пытаюсь отправить запрос на сервер:

    @Path("findRange")
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String findRange(@QueryParam("lat") double lat,
             @QueryParam("lon") double lon,
             @QueryParam("d") double distance)
    {
        connectToDbIfNecessary();
        try(PreparedStatement p = connection.prepareStatement(FIND_WITHIN_RANGE))
        {
            p.setObject(1, lat); 
            p.setObject(2, lon); 
            p.setObject(3, distance);
            ResultSet rs = p.executeQuery();
            return getServerResponse(rs);


        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return "failure during geospatial query:\n"+e.getErrorCode()+"<br>\n"+e.getMessage()+"<br>"+e.getCause();
        }

    }

Готовое заявление, которое я отправляю:

private static final String FIND_WITHIN_RANGE = "START n=node:geom('withinDistance:[{1},{2}, {3}]') RETURN n";

Когда я выполняю это на своем Tomcat 7.0.53, я получаю следующее исключение:

ошибка во время геопространственного запроса: 0 Ошибка при выполнении запроса START n= узел:geom('withinDistance:[{1},{2}, {3}]') RETURN n с параметрами {3=1.0E8, 2=60,5, 1=14.9} java.lang.RuntimeException: Ошибка при выполнении оператора (ов) шифра [{code=Neo.DatabaseError.Statement.ExecutionFailure, message=null, stackTrace=java.lang.NullPointerException в org.neo4j.gis.spatial.indexprovider.InayxNode.query(LayerNodeIndex.java:249) по адресу org.neo4j.gis.spatial.indexprovider.LayerNodeIndex.query(LayerNodeIndex.java:293) по адресу org.neo4j.cypher.internal.spi.v2_0.TactionactionBexexException.scala:166) в org.neo4j.cypher.internal.compiler.v2_0.spi.DelegatingOperations.indexQuery(DelegatingQueryContext.scala:113) в org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQuery $ $ Neo4j$ высчитывать $ внутренний $ компилятора $v2_0$ СПИ $ExceptionTranslatingQueryContext$ExceptionTranslatingOperations$$ супер $indexQuery(ExceptionTranslatingQueryContext.scala:142) по адресу org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext $ ExceptionTranslatingOperations $$ anonfun $ indexQuery $1.apply(Исключение TranslatingQueryConteternal.plash.jerg.jp.html.jp) v2_0.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations$$anonfun$indexQuery$1.apply(ExceptionTranslatingQueryContext.scala:142) в org.neo4j.cypher.internal.compiler.v2_0.spi.Ex0_export $spi$ExceptionTranslatingQueryContext$$translateException(ExceptionTranslatingQueryContext.scala:149) по адресу org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations.indexn.txt compiler.v2_0.spi.DelegatingOperations.indexQuery (DelegatingQueryContext.scala: 113) на org.neo4j.cypher.internal.compiler.v2_0.executionplan.builders.EntityProducerFactory$$anonfun$2$$anonfun$applyOrElse$2.apply(EntityProducerFactory.scala:66) по адресу org.neo4j.cypher.internal.compiler.v2_0.executionplan.builders.EntityProducerFactory $$ anonfun $ 2 $$ anonfun $ applyOrElse $ 2.appala) в org.neo4j.cypher.internal.compiler.v2_0.executionplan.builders.EntityProducerFactory$$anon$1.apply(EntityProducerFactory.scala:35) в org.neo4j.cypher.internal.compiler.v2_0.executionplanity.Producer.nt $$anon$1.apply(EntityProducerFactory.scala:34) в org.neo4j.cypher.internal.compiler.v2_0.pipes.StartPipe$$anonfun$internalCreateResults$1.apply(StartPipe.scala:34) в org.neo4j.cypher.internal.compiler.v2_0.pipes.StartPipe$$anonfun$internalCreateResults$1.apply(StartPipe.scala:33) в scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator$$anonfun$hasNext$1.apply$mcZ$sp(ClosingIterator.scala:38) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator $$ anonfun $ имеетСледующий $1.apply(rator.scala:37) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:37) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator.failIfThrows(ClosingIterator.scala:91) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator.hasNext(ClosingIterator.scala:37) в org.neo4j.cypher.internal.compiler.v2_0.PipeExecutionRult. Результат. scala: 166) в scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327) в scala.collection.convert.Wrappers$IteratorWrapper.hasNext(Wrappers.scala:29) в org.neo4j.cypher.internal.compiler.v2_0.PipeExecutionResult$$anon$1.hasNext(PipeExecutionResult.scala:74) в org.neo4j.server.rest.transactional.ExecutionResultSerializer.writeRows(ExecutionResultSerializer.java:291) at org.ne..ExecutionResultSerializer.statementResult(ExecutionResultSerializer.java:103) в org.neo4j.server.rest.transactional.TransactionHandle.executeStatements(TransactionHandle.java:251) в org.neo4j.server.rest.transactional.TransactionHandle.commit(TransactionHandle.java:189) в org.neo4j.server.rest.transactional.TransactionHandle.commit(TransactionHandle.java:109) в org.neo4j.server.rest.web.TransactionalService$2.write(TransactionalService.java:198) на com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider.writeTo(StreamingOutputProvider.java:71) на com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider.writeTo(StreamingOutputProvider.java:57) на com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306) на com.sun.jersey.server.impl.application.WebApplicationImpl. WebApplicationImpl.java:1339) на com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) на com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) в com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) в javax.servlet.http.HttpServlet HttpServlet.java:848) в org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698) в org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(Servlet:gjj)..server.rest.security.SecurityFilter.doFilter(SecurityFilter.java:112) в org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1477) в org.eclipse.jetty.letleSler.Shlet (ServletHandler.java:503) в org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:211) в org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:10) org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432) в org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175) в org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1030) в org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136) в org.eclipse.jetty.server.handler.HandlerList.hand (HandlerList.java:52) в org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) в org.eclipse.jetty.server.Server.handle(Server.java:445) в org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:268) в org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229) в org.eclipse.jetty.io.AbstractConnection.java:358) в org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601) в org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPol.lang.Thread.run(Thread.java:722) }]

Когда я выполняю запрос, отправляя http-запрос вручную по URL-адресу, указанному в документации, я не получаю исключения. Я понятия не имею, почему происходит это исключение. Кто-нибудь может указать мне правильное направление?

РЕДАКТИРОВАТЬ: кажется, что запросы индекса не могут быть параметризованы. Однако, если я сделаю это в соответствии с предложением Стефана Армбрустера, произойдет новое исключение (возможно, это еще одна проблема в пространственной реализации 0,12).

ошибка во время геопространственного запроса: 0 Ошибка выполнения запроса START n= узел:geom({1}) RETURN n с параметрами {1='WithinDistance:[14.9,60.5,1.0E8]'} java.lang.RuntimeException: Ошибка выполнения оператора шифрования (s) [{code=Neo.DatabaseError.Statement.ExecutionFailure, сообщение = только в пределах, в пределах Distance и bbox реализованы. на org.neo4j.gis.spatial.indexprovider.LayerNodeIndex.query(LayerNodeIndex.java:281) на org.neo4j.gis.spatial.indexprovider.LayerNodeIndex.query (LayerNodeIndex.java:29p). org.spi.v2_0.TransactionBoundExecutionContext$NodeOperations.indexQuery(TransactionBoundExecutionContext.scala:166) на org.neo4j.cypher.internal.compiler.v2_0.spi.DelegatingOperations.index.uer.compiler.v2_0.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations.org$neo4j$cypher$internal$compiler$v2_0$spi$ExceptionTranslatingQueryContext$ExceptionTranslatingOperations$$super$indexQuery (ExceptionTternal.player.jpg)..v2_0.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations$$anonfun$indexQuery$1.apply(ExceptionTranslatingQueryContext.scala:142) в org.neo4j.cypher.internal.compiler.v2_0.spi.QuenceException anonfun $ indexQuery $1.apply(ExceptionTranslatingQueryContext.scala: 142) в org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext.org $ neo4j$ cypher $ внутренняя $ исключениеВыражение.scala: 149) в org.neo4j.cypher.internal.compiler.v2_0.spi.ExceptionTranslatingQueryContext$ExceptionTranslatingOperations.indexQuery(ExceptionTranslatingQueryContext.scala:142) в org.neo4j.cypery. (DelegatingQueryContext.scala: 113) по адресу org.neo4j.cypher.internal.compiler.v2_0.executionplan.builders.EntityProducerFactory $$ anonfun $ 2 $$ anonfun $ applyOrElse $ 2.apply (EntityProducerFactory.scala: 66og или 66).internal.compiler.v2_0.executionplan.builders.EntityProducerFactory$$anonfun$2$$anonfun$applyOrElse$2.apply(EntityProducerFactory.scala:64) по адресу org.neo4j.cypher.internal.compiler.v2_0.exactionntityProdu $ $ $ Анон $ 1.Apply (EntityP roducerFactory.scala: 35) в org.neo4j.cypher.internal.compiler.v2_0.executionplan.builders.EntityProducerFactory$$anon$1.apply(EntityProducerFactory.scala:34) в org.neo4j.cypher.internal.compiler.v2_. pipe.StartPipe $$ anonfun $ internalCreateResults $1.apply(StartPipe.scala: 34) в org.neo4j.cypher.internal.compiler.v2_0.pipes.StartPipe $$ anonfun $ internalCreateResults $1.apply(StartPipe.scala: 33) в scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator $$ anonfun $ hasNext $ 1.apply $ mcZ $ sp (ClosingIterator.scala: 38) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator$$anonfun$hasNext$1.apply(ClosingIterator.scala:37) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator $$ anonfun $.apply (ClosingIterator.scala:37) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator.failIfThrows (ClosingIterator.scala: 91) в org.neo4j.cypher.internal.compiler.v2_0.ClosingIterator.has.scala: 37) в орг.нео4j.cypher.internal.compiler.v2_0.PipeExecutionResult.hasNext(PipeExecutionResult.scala:166) в scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327) в scala.collection.convert.Wrappers $ IteratorWrapper. hasNext (Wrappers.scala: 29) в org.neo4j.cypher.internal.compiler.v2_0.PipeExecutionResult$$anon$1.hasNext(PipeExecutionResult.scala:74) в org.neo4j.server.rest.transactional.ExecutionResowSerial ExecutionResultSerializer.java:291) в org.neo4j.server.rest.transactional.ExecutionResultSerializer.statementResult(ExecutionResultSerializer.java:103) в org.neo4j.server.rest.transactional.TransactionHandle.javaTexactionHandle.javaTextState.neo4j.server.rest.transactional.TransactionHandle.commit (TransactionHandle.java:189) в org.neo4j.server.rest.transactional.TransactionHandle.commit(TransactionHandle.java:109) в org.neo4j.server.rest.web.TransactionalService$2.write(TransactionalService.java:198) в com.sun.jersey.core.impl.provider.entity.Stream ingOutputProvider.writeTo (StreamingOutputProvider.java:71) на com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider.writeTo (StreamingOutputProvider.java:57) на com.sun.jersey.spi.conriteerseContainer.Container ContainerResponse.java:306) в com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1437) в com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest: WebApp 1349) на com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) на com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) на com.sun.jersey.spi.container.servlet.ServletContainer.service (ServletContainer.java:537) в com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) в javax.servlet.http.HttpServlet.service(HttpServlet.java:848) в org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698) в org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1506) в org.neo4j.server.rest.security.SecurityFilter.doFilter(SecurityFilter.java:112) в org.eclipse.jetty.servlet.SerdoFH ServletHandler.java:1477) в org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503) в org.eclipse.jetty.server.session.SessionHandler.doHandle (SessionHandler.javag::11).jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1096) в org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432) в org.eclipse.jetty.server.sessler.Session (SessionHandler.java:175) в org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java:1030) в org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136) org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52) в org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) в org.eclipse.jetty.server.Server.handle(Server.java:445) в org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:268) в org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:229) org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358) в org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601) в org.etlip thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532) в java.lang.Thread.run(Thread.java:722) }]

Эта проблема кажется похожей на эту проблему с середины 2013 года.

2 ответа

Решение

Как указывает Стефан Армбрустер, индексные запросы не кажутся параметризуемыми. Даже с одним параметром запрос не может быть выполнен. Так что есть 2 варианта

1) Старая школа. Отправьте HTTP-запрос POST по URL, указанному в пространственной документации.

2) Создайте строку, которая отправляется конечной точке транзакции вручную:

String pay = "START n=node:geom('withinDistance:["+lat+","+lon+","+distance+"]') RETURN n";

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

Не уверен на 100%, но я думаю, вы не можете параметризовать части индексного запроса. Поэтому замените ваш запрос, имеющий три параметра

START n=node:geom('withinDistance:[{1},{2}, {3}]') RETURN n

params 
1:15.0,
2:60.0, 
3:200.0

с одним параметром для поискового запроса индекса:

START n=node:geom({1}) RETURN n

params 
1: 'withinDistance:[15.0, 60.0, 200.0]'
Другие вопросы по тегам