3

我正在尝试开发一个 Web 服务,它能够将包含给定 GPS 位置的行政区域的名称返回给我。

我已经开发了一个 java 应用程序,能够使用空间插件和 Java API 在 neo4j 中插入一些多边形(我国的行政区域)。然后,给出一个 gps 位置,我可以得到包含它的多边形的名称。

现在我正在尝试使用 Neo4j 的 REST API(而不是 java api)来做同样的事情,但我找不到任何示例。

所以我的问题是:

1)是否可以使用 REST API 在 Neo4j 中插入多边形(如果我很好理解可以使用 WKT 格式)?

2) 是否可以执行空间查询来查找包含给定 gps 位置的所有多边形?

谢谢,恩里科

4

1 回答 1

5

你的两个问题的答案都是肯定的。以下是使用 REST 和 Cypher 的示例步骤。

1) 创建您的空间层和索引 (REST)。在此示例中,我的索引名为“test”(将创建同名的图层和基本空间节点),并且节点上将包含 wkt 几何信息的属性名称为“wkt”。

POST http://localhost:7474/db/data/index/node {"name":"test", "config":{"provider":"spatial", "wkt":"wkt"}}

2)创建一个节点(密码)。您可以拥有标签和各种属性。Neo4j Spatial 唯一关心的部分是 'wkt' 属性。(您可以使用 REST 执行此步骤。)

CREATE (n { name : "Fooville", wkt : "POLYGON((11.0 11.0, 11.0 12.0, 12.0 12.0, 12.0 11.0, 11.0 11.0))" })

3)将节点添加到图层。您可以通过将节点添加到索引或图层来做到这一点,但有一个重要的区别。如果将其添加到索引中,将创建一个仅包含几何数据的复制节点,并将其添加到图层中。通过 Cypher 查询将返回您的原始节点,但通过 REST 或 Java 查询将返回副本节点。如果将节点直接添加到层,那么如果您希望以后能够使用 Cypher 进行查询,则必须采取额外的步骤。在这两种情况下,您都需要节点的 URI,其最后一个元素是 Neo4j 节点号。在下面的示例中,我假设节点号为 4(如果您在新的空数据库上执行此示例,则为 4)。

方法一:

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

要使该节点可通过 Cypher 搜索,请将节点编号作为用户“id”属性添加到节点。(你可以用 REST 做到这一点。)

START n = node(4) SET n.id = id(n)

方法 2:使用此方法将使您的节点数加倍,WKT 存储量加倍,并在通过 REST 与 Cypher 查询时产生不同的结果。

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

3) 运行您的查询。您可以在 REST 或 Cypher 中进行查询(假设您如上所述调整了节点)。可用的 Cypher 查询有:“withinDistance”、“withinWKTGeometry”和“bbox”。可用的 REST 查询是:“findGeometriesWithinDistance”、“findClosestGeometries”和“findGeometriesInBBox”。有趣的是,只有 Cypher 允许您查询 WKT 几何中的节点。findClosestGeometries 和 findGeometriesWithinDistance 之间的 REST 也存在差异,我还不明白,即使论点是相同的。要查看如何进行 REST 调用,您可以发出以下命令:

POST http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance
POST http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findClosestGeometries
POST http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/findGeometriesInBBox

Cypher 查询是:(用实际值替换“<>”之间的文本,包括“<>”)

START n = node:<layer>("withinDistance:[<y>, <x>, <max distance in km>]")
START n = node:<layer>("withinWKTGeometry:POLYGON((<x1> <y1>, ..., <xN> <yN>, <x1> <y1>))")
START n = node:<layer>("bbox:[<min x>, <max x>, <min y>, <max y>]")

我在所有这些中都假设您使用的是经度/纬度坐标参考系统 (CRS),因此 x 是经度,y 是纬度。(这保留了 z 向上的右手坐标系。)

于 2014-07-14T17:01:14.330 回答