问题 1
您首先需要初始化一个图层并使用 REST 调用创建空间索引:
POST /db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer HTTP/1.1
Host: localhost:7474
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache
{
"layer" : "geom",
"lat" : "lat",
"lon" : "lon"
}
和:
POST /db/data/index/node/ HTTP/1.1
Host: localhost:7474
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache
{
"name" : "geom",
"config" : {
"provider" : "spatial",
"geometry_type" : "point",
"lat" : "lat",
"lon" : "lon"
}
}
使用 Cypher 通过事务端点创建具有 lon/lat 属性的节点:
POST /db/data/transaction/commit HTTP/1.1
Host: localhost:7474
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache
{
"statements" : [
{
"statement" : "create (city:City {data}) return id(city)",
"parameters" : {
"data" : {
"name" : "MyTown",
"lon": 15.2,
"lat": 60.1
}
}
}
]
}
并将其添加到空间索引中 - 确保采用节点 id 与上一个请求返回的节点的 id:
POST /db/data/ext/SpatialPlugin/graphdb/addNodeToLayer HTTP/1.1
Host: localhost:7474
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache
{
"layer": "geom",
"node": "http://localhost:7474/db/data/node/<my_nodeid_goes_here>"
}
为了使空间与 Cypher 玩得很好,需要一个 hack:每个地理索引节点都应该带有一个名为 id 的属性,其值是节点 ID。这可以通过一个简单的密码语句来完成(下面的示例对所有 City 节点执行此操作):
POST /db/data/transaction/commit HTTP/1.1
Host: localhost:7474
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache
{
"statements" : [
{ "statement" : "match (n:City) set n.id=id(n)" }
]
}
有了这些,您就可以使用 Cypher 进行地理查询,例如:
POST /db/data/transaction/commit HTTP/1.1
Host: localhost:7474
Accept: application/json
Content-Type: application/json
Cache-Control: no-cache
{
"statements" : [
{
"statement" : "start city = node:geom('withinDistance:[60.1,15.2, 100.0]') return city",
"parameters" : {}
}
]
}
注意:对于withinDistance,您必须指定lat、lon、distanceInKm。
问题 2
如上所述,您需要有一个单独的 REST 调用来将节点添加到空间索引。目前,Cypher 无法直接实现这一点。作为一种解决方法,使用 LOAD CSV 创建具有 lon/lat 属性的节点。在预处理步骤中运行类似MATCH (n:City) where not has(n.id) set n.id = id(n) return id(n) as id 的语句。这将设置 id 属性(上面描述的 hack)并返回新节点的 id 列表。对于它们中的每一个,发出 REST 调用以将节点添加到地理索引。
问题 3
上面已经回答了:-)