我正在尝试开发一个能够返回包含给定gps位置的管理区域名称的Web服务。
我已经开发了一个java应用程序,它能够使用空间插件和Java API在neo4j中插入一些多边形(我国的行政区域)。然后,给出一个gps位置,我能够得到包含它的多边形的名称。
现在我正在尝试使用Neo4j的REST API(而不是java api)来做同样的事情,但我找不到任何示例。
所以我的问题是:
1)是否可以使用REST API在Neo4j中插入多边形(如果我可以理解使用WKT格式)?
2)是否可以执行一个空间查询来查找包含给定gps位置的所有多边形?
谢谢,恩里科
答案 0 :(得分: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与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查询包括:                 可用的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在其中。)