我在使用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信息添加到现有节点时才会显示此错误。
谢谢!