2014-07-03 96 views
2

我想开发一个web服务,能够让我回到包含给定GPS位置的行政区域的名称。neo4j空间包含搜索

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

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

所以我的问题是:

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

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

谢谢,恩里科

回答

5

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

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

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

2)创建一个节点(Cypher)。你可以有标签和各种属性。 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(如果你在一个新的空数据库上做这个例子,它会是这样的)。

方法1:

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查询VS暗号时,不同的结果。

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','WTTGeometry'和'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向上的右手坐标系。)