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