neo4j空间包含搜索

 吴家南小南 发布于 2023-01-06 15:32

我正在尝试开发一个Web服务,能够返回包含给定gps位置的管理区域的名称.

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

现在我正在尝试使用Neo4j的REST API(而不是java api),但我找不到任何示例.

所以我的问题是:

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

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

谢谢,恩里科

1 个回答
  • 你的两个问题的答案都是肯定的.以下是使用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是向上的.)

    2023-01-06 15:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有