Я работаю над приложением Grails поверх Neo4J, которое я также хотел бы экспортировать как базу данных ГИС.
Глядя на примеры использования neo4j в GeoServer/uDig, кажется, что пространственная интеграция осуществляется только через встроенные базы данных neo4j.
Кто-нибудь знает, можно ли настроить так, чтобы мой Neo4J был доступен через REST, чтобы я мог взаимодействовать с ним из разных мест?
На первый взгляд кажется, что это должно быть возможно:
// Works with this embedded database
//def graphDb = new GraphDatabaseFactory().newEmbeddedDatabase("/tmp/foo.db");
// Doesn't work with this REST database
graphDb = new RestGraphDatabase("http://localhost:7474/db/data");
Transaction tx = graphDb.beginTx()
SpatialDatabaseService spatialService = new SpatialDatabaseService(graphDb)
SimplePointLayer layer = spatialService.createSimplePointLayer("points")
Со встроенной базой данных пространственный индекс создается просто отлично. Однако с базой данных REST я просто получаю нулевой указатель:
Caused by NullPointerException: null
->> 149 | createCompiler in org.neo4j.cypher.ExecutionEngine
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 48 | <init> in ''
| 59 | createInnerEngine in org.neo4j.cypher.javacompat.ExecutionEngine
| 43 | <init> in ''
| 41 | getReferenceNode in org.neo4j.gis.spatial.utilities.ReferenceNodes
| 78 | getSpatialRoot in org.neo4j.gis.spatial.SpatialDatabaseService
| 114 | getLayer in ''
| 259 | containsLayer in ''
| 303 | createLayer in ''
| 287 | createSimplePointLayer in ''
| 267 | createSimplePointLayer in ''
| 37 | <init> in net.foo.db.neo4j.Neo4JService
SpatialDatabaseService принимает GraphDatabaseService, поэтому я не понимаю, почему он не работает с REST.
Это баг или фича (или недоразумение с моей стороны?)
Я могу, конечно, использовать create index
API для создания пространственного индекса:
graphDb.index().forNodes( "points", ["provider": "spatial", "geometry_type": "point", "lat": "lat", "lon":"lon"])
так что это работает, но я не могу создать новый слой таким образом.