首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >neo4j空间容器搜索

neo4j空间容器搜索
EN

Stack Overflow用户
提问于 2014-07-03 16:36:24
回答 1查看 1.8K关注 0票数 3

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

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

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

所以我的问题是:

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

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

谢谢,Enrico

EN

回答 1

Stack Overflow用户

发布于 2014-07-15 01:01:14

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

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

代码语言:javascript
复制
POST http://localhost:7474/db/data/index/node {"name":"test", "config":{"provider":"spatial", "wkt":"wkt"}}

2)创建一个节点(Cypher)。您可以拥有标签和各种属性。Neo4j空间唯一关心的部分是“wkt”属性。(您可以使用REST完成此步骤。)

代码语言:javascript
复制
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:

代码语言:javascript
复制
POST http://localhost:7474/db/data/ext/SpatialPlugin/graphdb/addNodeToLayer { "layer":"test", "node":"http://localhost:7474/db/data/node/4" }

要使此节点可通过Cypher进行搜索,请将节点编号作为用户'id‘属性添加到节点。(您可以使用REST来完成此操作。)

代码语言:javascript
复制
START n = node(4) SET n.id = id(n)

方法2:当使用REST和Cypher进行查询时,使用此方法将使节点数加倍,WKT存储加倍,并产生不同的结果。

代码语言:javascript
复制
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调用,可以发出以下命令:

代码语言:javascript
复制
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查询是:(用实际值替换'<>‘之间的文本,包括'<>’)

代码语言:javascript
复制
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位于上方的右手坐标系。)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24548819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档