首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NEO4J空间索引误差

NEO4J空间索引误差
EN

Stack Overflow用户
提问于 2014-07-10 15:22:46
回答 2查看 374关注 0票数 2

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

我们使用的方法如下:

使用空间插件的Spring NEO4J 3.1 Neo4j 2.1.2服务器

我把这个问题缩小到了以下几个方面:

代码语言:javascript
复制
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"
}

我收到以下答复:

代码语言:javascript
复制
{
  "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)的根节点。

下面是关联的几何节点和索引根的关系和节点属性:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2014-07-14 20:49:45

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

代码语言:javascript
复制
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的回答,以查看要进行的其他调用的详细示例。

票数 1
EN

Stack Overflow用户

发布于 2014-07-10 17:07:58

在Neo4j 2.x中,我们必须改变工作方式,因为不再存在默认根节点。您应该能够将根节点(节点0)标记为:ReferenceNode。那它应该又起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24680417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档