NEO4J空间索引误差

NEO4J空间索引误差,neo4j,neo4j-spatial,Neo4j,Neo4j Spatial,我们最近从Neo4j 1.9升级到了2.1,现在在使用空间索引更新现有对象时收到一个错误 我们正在使用以下工具: 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" }

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

我们正在使用以下工具:

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"
}
弹簧数据NEO4J 3.1 带有spatial插件的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"
}
编辑

在做了一些额外的研究之后,我发现抛出错误是因为几何关系(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

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

我没有使用过旧版本的Neo4j Spatial,但在当前版本(0.13用于Neo4j 2.1.2)中,将节点添加到空间索引的命令描述为

POST http://localhost:7474/db/data/index/node/<index name> {"key":"dummy", "value":"dummy", "uri":"http://localhost:7474/db/data/node/113"}
POSThttp://localhost:7474/db/data/index/node/ {“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。如果要在不涉及复制节点的情况下同时执行这两项操作,请在原始节点上创建一个自引用用户“id”属性,该属性包含其Neo4j节点编号,然后再使用addNodeToLayer调用将其添加到层中。如果这样做,就根本不需要使用REST add to index调用,所有方法都可以工作

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


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

我标记了根节点,但仍然收到相同的错误。当我在webadmin控制台中运行START root=node(0)RETURN labels(root)返回[“ReferenceNode”]时,我可以看到标签就在那里。我已经不再使用Spring Data Neo4J,现在直接使用Java API Rest库。基于此,我假设我需要使用上面提到的API添加节点?