您的两个问题的答案是肯定的。以下是使用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查询VS暗号时,不同的结果。
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','WTTGeometry'和'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向上的右手坐标系。)