我正在尝试开发一个web服务,它能够返回包含给定gps位置的行政区域的名称。
我已经开发了一个java应用程序,可以使用空间插件和Java API在neo4j中插入一些多边形(我国的行政区域)。然后,给出gps位置,我就能得到包含它的多边形的名称。
现在我正在尝试使用Neo4j的REST API (而不是java api)来做同样的事情,但我找不到任何示例。
所以我的问题是:
1)是否可以使用REST API在Neo4j中插入多边形(如果我很好地理解使用WKT格式是可能的)?
2)是否可以执行一个空间查询来查找包含给定gps位置的所有多边形?
谢谢,Enrico
发布于 2014-07-15 01:01:14
你的两个问题的答案都是肯定的。以下是使用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空间唯一关心的部分是“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)。
方法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:当使用REST和Cypher进行查询时,使用此方法将使节点数加倍,WKT存储加倍,并产生不同的结果。
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/findGeometriesInBBoxCypher查询是:(用实际值替换'<>‘之间的文本,包括'<>’)
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位于上方的右手坐标系。)
https://stackoverflow.com/questions/24548819
复制相似问题