1

我在 neo4j 中创建了一个空间索引,但是在搜索附近的地方时,我只得到一个结果。

我的查询是:

START n=node:geom('withinDistance:[63.36, 10.35, 50.0]') RETURN n

我在空间索引中有 3 个节点,这些节点具有以下坐标:

  • 节点 1 纬度、经度:63.3654、10.3578
  • 节点 2 纬度、经度:63.3654、10.3577
  • 节点 3 纬度、经度:63.3654、10.3578(同一节点 1)

理论上这三个节点在同一个区域。

任何想法?

更新

我执行了这些步骤来使用空间(全部从 neo4j 浏览器执行-> rest api)

1) 索引创建

:POST /db/data/index/node/
{
    "name" : "geom",
    "config" : {
       "provider" : "spatial",
       "geometry_type" : "point",
       "lat" : "lat",
       "lon" : "lon"
     }
}

2)节点创建(都以相同的方式)

:POST /db/data/node
{
    "name":"Franciscatos Pizza",
    "lat": 63.3654,
    "lon": 10.3578
}

3) 节点到空间索引

:POST /db/data/index/node/geom
{
    "value":"dummy",
    "key":"dummy"
    "uri":"http://localhost:7474/db/data/node/8"
}

4) 节点到层

:POST /db/data/ext/SpatialPlugin/graphdb/addNodeToLayer
{
    "layer":"geom",
    "node":"http://localhost:7474/db/data/node/8"
}

任何 API 响应都正常,所有索引节点都包含 :RTREE_REFERENCE 关系。

根据查询中的距离参数,这会返回不同的节点,但总是一个......

4

2 回答 2

4

达里奥斯,

首先,不要执行第 3 步)。步骤 3) 和 4) 有点多余,但步骤 3) 在节点中复制几何信息并创建存储到层中的第二个节点。相反,请执行此新步骤 3)。

START n = NODE(8)
SET n.id = ID(n)

此 Cypher 代码在包含 Neo4j 节点号的节点上添加了一个“id”参数。完成此操作后,您可以使用 Cypher 空间索引查询。请注意,第一行每次都会有不同的节点号。这个“id”属性是自引用的。

或者,执行步骤 3),但不要执行步骤 4)。但是,如果您执行 REST 几何查询,您将不会得到您期望的结果。

看看你的结果是否有所改善。

恩典与平安,

吉姆

PS。

迈克尔,

现在实际上有两种相互竞争的方法在使用空间。如果您使用 addNodeToLayer 将节点添加到层(如步骤 4 中所示),则该节点将直接链接到 RTree 图中,并且 Cypher 查询将找不到该节点。如果您使用 Java,这也是正确的。您可以使用 findGeometriesWithinDistance 和 findGeometriesInBBox 通过 REST 进行查询。

如果您使用“将节点添加到空间索引”方法将节点添加到图层(如步骤 3 中所示),它实际上不会将您的节点添加到图层。创建一个新节点,其中包含原始节点上的几何属性的副本和包含原始节点的 Neo4j 节点编号的“id”属性,并将此复制节点添加到 RTree 图中。“空间索引”实际上并不包含节点列表。它是空间扩展代码的访问点。当您执行 Cypher 空间查询时,空间扩展会找到满足查询的副本节点,然后取消引用每个节点的“id”属性以构建原始节点的返回列表。

如果仅使用步骤 4) 将节点添加到图层,则缺少取消引用的 'id' 属性会导致 Cypher 空间索引查询失败。通过添加“id”属性,取消引用成功,您可以从查询中获得结果。

shapefile 导入器将节点直接链接到 RTree,如果您希望能够执行 Cypher 空间索引查询,则需要按照我的描述将“id”属性添加到每个节点。OSM 导入器构建相关的“域”和几何节点,但我认为它不会使基于 Cypher 的查询可以访问它们。如果您将“id”属性添加到每个几何节点,那么它们将是。

我可能错过了,但我没有看到有人指出,如果您使用“将节点添加到空间索引”方法,您只会将您拥有的节点数量增加一倍,以及几何数量增加一倍存储在数据库中的属性。由于原始节点和复制节点之间没有建立关系,因此无法访问复制节点中的几何属性,因此您无法真正从原始节点中删除几何属性。

结果,我发现将我的节点直接添加到 RTree 图中并通过添加自引用“id”属性通过 Cypher 空间索引使它们可查询(可查询?)更可取。

至于删除节点,没有用于从层中删除节点的 REST SpatialPlugin 方法。如果使用 REST 空间索引方法将节点添加到 RTree 图中,则 REST 调用

:DELETE /db/data/index/node/geom/{ID}

将从 RTree 中删除节点,但有一个问题。您必须获取复制节点的 Neo4j 节点号才能使其正常工作!你不能以任何直接的方式。如果你设法获得了复制节点的节点号,它会将其从 RTree 中删除,但复制节点不会被删除。

有点讽刺的是,如果您使用 addNodeToLayer 将节点添加到 RTree 并且不添加“id”属性,则从索引中删除节点的调用会从 RTree 中删除节点。如果您添加自引用“id”属性,然后从索引中删除该节点,则该节点将被删除。所以每一种方法都是有缺陷的。

于 2014-07-29T21:13:44.817 回答
0

I am using neo4j 2.3 and found that step 3) is useless but not step 4), also if you do not clone the id as property the query from cypher do not work anymore ( return no results )

于 2016-01-17T22:36:27.367 回答