Neo4j Spatial只返回一个节点

时间:2014-07-29 14:02:42

标签: neo4j neo4j-spatial

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

我的查询是:

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

我在这个坐标的空间索引中有3个节点:

  • 节点1 lat,lon:63.3654,10.3578
  • 节点2 lat,lon:63.3654,10.3577
  • 节点3 lat,lon: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关系。

根据查询中的distance参数,这会返回不同的节点,但始终只有一个......

2 个答案:

答案 0 :(得分:3)

Darios,

首先,不要做第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”属性,然后从索引中删除该节点,则会删除该节点。所以每种方法都有缺陷。

答案 1 :(得分:0)

我正在使用neo4j 2.3并发现步骤3)没用但不是步骤4),如果你没有将id克隆为属性,则来自cypher的查询不再起作用(不返回结果)