Neo4j空间索引错误重复

时间:2015-01-30 00:52:21

标签: indexing neo4j spring-data spatial

我在使用Spring Data在Neo4j中插入空间对象时遇到错误:

Caused by: java.lang.RuntimeException: Error adding element 20 wkt POINT(-0.131483 51.513861) to index LocationIndex
at org.neo4j.rest.graphdb.ExecutingRestAPI.addToIndex(ExecutingRestAPI.java:470)
at org.neo4j.rest.graphdb.RestAPIFacade.addToIndex(RestAPIFacade.java:168)
at org.neo4j.rest.graphdb.index.RestIndex.add(RestIndex.java:60)

那基本上是因为之前有一个不同的条目(不再存在,具有相同的位置)。约束的唯一性意味着两个不同的对象不能具有相同的位置,但如果删除前一个,它似乎保留在索引中并发生碰撞。

有没有办法在neo4j中重新索引空间索引?这意味着,删除所有内容并仅重新索引现有数据。

这是我在Spring Data实体类中的类字段:

@Indexed(indexType = IndexType.POINT, indexName = "LocationIndex")
private String wkt;

删除对象时,是否应该从索引中添加要删除的内容?或者必须手动完成,怎么做?

修改

{
    "message": "GeometryNode not indexed with an RTree: 21",
    "exception": "RuntimeException",
    "fullname": "java.lang.RuntimeException",
    "stacktrace": [
        "org.neo4j.gis.spatial.rtree.RTreeIndex.findLeafContainingGeometryNode(RTreeIndex.java:794)",
        "org.neo4j.gis.spatial.rtree.RTreeIndex.remove(RTreeIndex.java:111)",
        "org.neo4j.gis.spatial.rtree.RTreeIndex.remove(RTreeIndex.java:100)",
        "org.neo4j.gis.spatial.EditableLayerImpl.update(EditableLayerImpl.java:56)",
        "org.neo4j.gis.spatial.indexprovider.LayerNodeIndex.add(LayerNodeIndex.java:143)",
        "org.neo4j.gis.spatial.indexprovider.LayerNodeIndex.add(LayerNodeIndex.java:41)",
        "org.neo4j.server.rest.web.DatabaseActions.addToNodeIndex(DatabaseActions.java:686)",
        "org.neo4j.server.rest.web.RestfulGraphDatabase.addToNodeIndex(RestfulGraphDatabase.java:1022)",
        "java.lang.reflect.Method.invoke(Method.java:606)",
        "org.neo4j.server.rest.transactional.TransactionalRequestDispatcher.dispatch(TransactionalRequestDispatcher.java:139)",
        "java.lang.Thread.run(Thread.java:745)"
    ]
}

发现他正试图从DB中获取Index节点来做某事。我在这种情况下尝试更新的节点的ID是20,看他正试图获得21

因为这个(在neo4j github中找到):

private long extractNodeId( String uri ) throws BadInputException
    {
        try
        {
            return Long.parseLong( uri.substring( uri.lastIndexOf( "/" ) + 1 ) );
        }
        catch ( NumberFormatException | NullPointerException ex )
        {
            throw new BadInputException( ex );
        }
    }

我不明白这是如何工作的,因为在我的数据库中,我看到ID与OriginalNode + 1不同的节点正确指向了OriginalNode的ID并且空间找到它们

这只是更新问题吗?如果我使用wkt创建OriginalNode,它会创建两个节点,但只有在我尝试将wkt信息添加到现有节点时才会显示此错误。

谢谢!

0 个答案:

没有答案