Neo4j的空间只返回一个节点(Neo4j Spatial return only one node

2019-10-20 13:47发布

我创建了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 LAT,经度:63.3654,10.3578(相同的节点1)

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

任何想法?

UPDATE

我执行这些步骤,以使用空间(从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响应是OK和索引的所有节点包含:RTREE_REFERENCE关系。

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

Answer 1:

大流士

第一件事情,不要做第3步)。 步骤3)和4)是有些多余的,但步骤3)使得在该节点的几何信息的副本,并创建一个被存储到层的第二节点。 取而代之的是,做这个新步骤3)。

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

这暗号代码添加包含的Neo4j节点数量的节点上的“身份证”参数。 一旦你这样做,你可以使用Cypher支架空间索引查询。 请注意,第一行有不同的节点号各一次。 这个“身份证”属性是自我指涉。

另外,做你的第3步),但不要做第4步)。 但你不会得到,如果你做一个REST几何查询你所期望的。

看看你的成绩提高。

格雷斯与和平,

吉姆

PS。

迈克尔,

实际上,有与空间发挥两个相互竞争的办法现在。 如果您使用addNodeToLayer您添加节点层(第4步),该节点直接连接到RTREE图和Cypher支架查询不会找到节点。 如果您使用的是Java也是如此。 您可以通过使用findGeometriesWithinDistance和findGeometriesInBBox REST查询。

如果使用“节点添加到空间索引”的方法,以您的节点添加到一个层(如步骤3),它实际上不是节点添加到层。 一个新的节点由含有几何属性的原始节点和包含原始节点的节点的Neo4j数量的“id”属性上的副本,该副本节点被添加到RTREE曲线图。 在“空间索引”实际上并不包含节点列表。 它是空间扩展代码的接入点。 当你做一个暗号空间查询,空间扩展认定,满足查询,然后取消引用在每个“ID”属性建立原始节点返回目录拷贝节点。

这是缺乏“身份证”属性取消引用导致Cypher支架空间索引的查询,如果你只使用步骤4)添加一个节点到层失败的。 通过添加“身份证”属性,提领成功,你从你的查询结果。

shape文件进口商直接链接节点到RTREE,如果你希望能够做暗号空间索引的查询,你需要跟我描述的“身份证”属性添加到每个节点。 OSM的进口商建立相关的“域”和几何节点,但我不认为它使他们能够基于Cypher支架的查询访问。 如果添加了“身份证”属性的每个几何节点,那么他们将。

我可能已经错过了,但我还没有看到任何人指出,如果你使用“节点添加到空间索引”的方法,你原来的2倍,你有节点的数量,以及几何倍数的数存储在数据库中的属性。 由于没有原始节点和复制节点之间建立关系,有没有办法来访问复制节点的几何特性,所以你不能真正从原来的节点删除几何性质。

其结果是,我觉得它更希望我的节点直接通过Cypher支架空间索引通过增加自我指涉的“ID”属性添加到R​​TREE图形,使他们可查询(可查询的?)。

至于删除节点,就没有用于从层中除去节点REST SpatialPlugin方法。 如果您使用REST空间索引方法的节点添加到RTREE图,那么剩下的通话

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

将删除从RTREE节点,但有一个陷阱。 你必须得到复制节点的节点Neo4j的数量,以便为这个工作! 你不能以任何直接的方式。 如果你能得到复制节点的节点号,它将从RTREE删除它,但复制节点不会被删除。

有点讽刺的是,如果将节点添加到RTREE使用addNodeToLayer和不添加的“身份证”属性,调用删除节点从索引中删除从RTREE节点。 如果添加了自我指涉的“ID”属性,然后从索引中删除节点,该节点将被删除。 因此,每一种方法是有缺陷的。



Answer 2:

我使用的Neo4j 2.3,发现第3步)是无用的,但不是第4步),如果你还没有克隆的id属性从暗号查询不工作了(返回任何结果)



文章来源: Neo4j Spatial return only one node