具有空间的Neo4j:NotFoundException:不止一个关系

时间:2014-01-07 00:40:35

标签: neo4j spatial neo4j-spatial

原因是什么以及如何解决此异常:

org.neo4j.graphdb.NotFoundException: More than one relationship[RTREE_CHILD, INCOMING] found for NodeImpl#105
at org.neo4j.kernel.impl.core.NodeImpl.getSingleRelationship(NodeImpl.java:344)
at org.neo4j.kernel.impl.core.NodeProxy.getSingleRelationship(NodeProxy.java:191)
at org.neo4j.collections.rtree.RTreeIndex.getIndexNodeParent(RTreeIndex.java:768)
at org.neo4j.collections.rtree.RTreeIndex.adjustPathBoundingBox(RTreeIndex.java:672)
at org.neo4j.collections.rtree.RTreeIndex.add(RTreeIndex.java:90)
at org.neo4j.gis.spatial.EditableLayerImpl.add(EditableLayerImpl.java:44)
at org.neo4j.gis.spatial.ShapefileImporter.importFile(ShapefileImporter.java:209)
at org.neo4j.gis.spatial.ShapefileImporter.importFile(ShapefileImporter.java:122)

我正在使用2.0.0和来自已编译的github项目的空间jar。

当我尝试导入Shapefile时抛出异常(这是非托管扩展中的代码):

GraphDatabaseService spatialDb = new GraphDatabaseFactory().newEmbeddedDatabase("/home/db/data/spatial.db");
    Transaction tx = spatialDb.beginTx();
    try {
        ShapefileImporter importer = new ShapefileImporter(spatialDb, new NullListener());
        importer.importFile("/home/bla/realshp/users_location.shp", "users_location");
        tx.success();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        tx.close();
        return Response.status(200).entity("Done. ").build();
    }

形状文件是使用ogr2​​ogr从CSV文件生成的 - 它似乎是合法的,无需例外即可读取。在原始文件中有大约30000个点定义如下(ogr2ogr将拉经度和纬度):

id,longitude,latitude,gender,updated
3,-122.1171925,37.4343361,1,2013-11-20 05:03:22
304,-122.0919000,37.3094000,1,2013-11-03 00:42:01
311,-122.0919000,37.3094000,1,2013-11-03 00:42:01

如何绕过它?我需要为数据库加载数百万个点。 附带问题:现在我创建了新的图形空间数据存储 - 它是否正确?也许我应该将它加载到现有的图形数据库?

更新:

我尝试使用TestSimplePointLayer中的方法“手动”输入坐标。我在第450个坐标附近遇到了同样的异常。它们中的一组与您在示例中看到的相同,但它们是有效点。如何绕过它?

2 个答案:

答案 0 :(得分:0)

你正在这里跳过一步。您创建一个空间索引,然后将用户添加到索引。

因此,例如,如果您在美国拥有所有州或县或邮政编码的形状文件,则可以创建具有这些形状的空间图层并将用户添加到它们。

如果需要,您也可以使用简单的点图层,但它们必须是唯一的,但不一定要位于这些位置的用户节点。有关更好的主意,请参阅http://java.dzone.com/articles/running-along-graph-using-0http://www.markhneedham.com/blog/2013/03/10/neo4jcypher-finding-football-stadiums-near-a-city-using-spatial/

答案 1 :(得分:0)

当我尝试将具有相同lon / lat(0,0)的节点添加到图层时,我遇到了同样的错误。 当插入超过100个RTREE_CHILD ref节点时,将出现此异常。这是源代码的错误。

的src /主/ JAVA /组织/ Neo4j的/ GIS /空间/ RTREE / RTreeIndex.java

试试这个分叉插件:

https://github.com/linkedin-inc/spatial