NEO4J空间索引错误

时间:2014-07-10 15:22:46

标签: neo4j neo4j-spatial

我们最近从Neo4j 1.9升级到2.1,现在使用空间索引更新现有对象时收到错误。

我们正在使用以下内容:

Spring Data NEO4J 3.1 具有空间插件的Neo4j 2.1.2服务器

我已将问题缩小到以下的REST调用:

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

2 个答案:

答案 0 :(得分:1)

我没有使用过旧版本的Neo4j Spatial,但在当前版本(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,请使用REST addNodeToLayer。如果您希望在不涉及复制节点的情况下执行这两项操作,请在包含其Neo4j节点编号的原始节点上创建自引用用户“id”属性,然后再使用addNodeToLayer调用将其添加到图层。如果这样做,根本不需要使用REST添加到索引调用,所有方法都可以。

顺便说一句,Neo4j空间索引(路径/ db / data / index / node /访问的索引)实际上并没有任何内容。它是空间插件的访问点存根。

在回答评论中的进一步问题时,请查看我对this other question的回答,以查看要进行的REST调用的详细示例。

答案 1 :(得分:0)

在Neo4j 2.x中我们不得不改变方式,因为没有默认的根节点了。您应该能够将根节点(节点0)标记为:ReferenceNode。然后它应该再次工作。