我们最近从Neo4j 1.9升级到2.1,现在当一个现有的对象被更新为一个空间索引时,我们收到了一个错误。
我们使用的方法如下:
使用空间插件的Spring NEO4J 3.1 Neo4j 2.1.2服务器
我把这个问题缩小到了以下几个方面:
http://localhost:7474/db/data/index/node/<index name>
JSON Post:
{
"value" : "POINT(-87.626451 41.870515)",
"uri" : "http://localhost:7474/db/data/node/113",
"key" : "wkt"
}我收到以下答复:
{
"message" : "GeometryNode not indexed in this RTree: 114",
"exception" : "RuntimeException",
"fullname" : "java.lang.RuntimeException",
"stacktrace" : [ "org.neo4j.gis.spatial.rtree.RTreeIndex.findLeafContainingGeometryNode(RTreeIndex.java:812)", "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(Unknown Source)", "org.neo4j.server.rest.transactional.TransactionalRequestDispatcher.dispatch(TransactionalRequestDispatcher.java:139)", "java.lang.Thread.run(Unknown Source)" ]
}编辑
在进行了一些额外的研究之后,我发现抛出错误是因为几何关系(952)的根节点不等于索引根(2308)的根节点。
下面是关联的几何节点和索引根的关系和节点属性:
114<-[RTREE_REFERENCE]-6<-[RTREE_CHILD]-952<-[RTREE_CHILD]-(null)
114
id 113
bbox [-87.626451,41.870515,-87.626451,41.870515]
wkt POINT (-87.626451 41.870515)
gtype 1
6
bbox [-88.459688,41.711991,-86.856991,42.153793]
952
bbox [-118.823745,0,0,44.591593]
2307-[RTREE_ROOT]->[2308]
2307
layer_class org.neo4j.gis.spatial.EditableLayerImpl
layer dib_location
geomencoder org.neo4j.gis.spatial.WKTGeometryEncoder
geomencoder_config wkt
ctime 1404877913340
2308
layer_class org.neo4j.gis.spatial.EditableLayerImpl
layer dib_location
geomencoder org.neo4j.gis.spatial.WKTGeometryEncoder
geomencoder_config wkt
ctime 1404877913340发布于 2014-07-14 20:49:45
我没有使用Neo4j空间的旧版本,但在当前版本( Neo4j 2.1.2的0.13)中,将节点添加到空间索引的命令描述为
POST http://localhost:7474/db/data/index/node/<index name> {"key":"dummy", "value":"dummy", "uri":"http://localhost:7474/db/data/node/113"}已经在节点本身上设置了wkt属性。如果您查看LayerNodeIndex.java源文件,您将看到键和值参数被忽略。因此,使用Cypher或REST将wkt属性添加到节点,然后将节点添加到空间索引中,对于Cypher查询,它应该工作得很好。
如果要执行REST查询,您将发现将节点添加到正在使用的空间索引的方法不会将节点添加到RTree图中。它创建一个新节点,将原始节点的几何属性或属性放在新节点上,将原始节点的节点编号放入用户'id‘属性,并将这个新节点放入RTree图中。因此,当您执行REST空间查询时,您将得到这个“复制”节点。要获取原始节点,必须使用存储在复制节点中的'id‘属性中的值,根据节点的节点编号获取该节点。如果您不使用Cypher,请使用其余的addNodeToLayer。如果希望在不涉及复制节点的情况下同时执行这两项操作,请在原始节点上创建一个包含其Neo4j节点号的自引用用户'id‘属性,然后使用addNodeToLayer调用将其添加到该层。如果这样做,则完全不需要使用其余的调用,而且所有方法都可以工作。
顺便说一下,Neo4j空间索引(路径/db/data/ index /node/)实际上没有任何内容。它是空间插件的访问点存根。
在回答您的评论中的进一步问题时,请查看我对this other question的回答,以查看要进行的其他调用的详细示例。
发布于 2014-07-10 17:07:58
在Neo4j 2.x中,我们必须改变工作方式,因为不再存在默认根节点。您应该能够将根节点(节点0)标记为:ReferenceNode。那它应该又起作用了。
https://stackoverflow.com/questions/24680417
复制相似问题