更新为:将节点添加到 Neo4j 空间索引

Update to: Adding node to Neo4j Spatial Index

我希望有人可以提供一些关于向 Spatial 添加节点的最新说明。我能找到的最佳说明是:

Neo4j Spatial 'WithinDistance' Cypher query returns empty while REST call returns data

然而,它已有将近 2 年的历史,并且有一些矛盾的信息和一个已确认的错误 (https://github.com/neo4j-contrib/spatial/issues/106),该错误似乎仍未解决。

我还找到了这个教程:

http://mattbanderson.com/setting-up-the-neo4j-spatial-extension/

也就是说我们应该将节点添加到图层并将 Neo4j ID# 作为 属性 插入到节点中,而不是将节点插入到 geom 索引中。

我的首要任务是能够通过 Cypher(在浏览器中)进行查询,但我们最终也希望能够通过 REST 进行查询。所以,理想情况下,我想以我们可以同时执行的方式插入节点。

所以,我的问题是:

1) 允许通过 REST 和 Cypher 进行查询的正确步骤是什么?

2) 如果我调用 /addSimplePointLayer 然后 /index/node 添加空间索引(通过 cURL 或 REST),我可以使用 LOAD CSV 插入节点并能够通过 REST 查询空间插件和 Cypher?

3) 如果我使用 REST 来插入我的节点,我需要进行哪些调用(以什么顺序)以确保我可以通过 REST 和 Cypher(网络浏览器)进行查询?

谢谢,我期待着一切顺利!!

问题 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>" 
}

为了让 Spatial 与 Cypher 一起玩得很好,需要一个 hack:每个地理索引节点都应该携带一个名为 id 的 属性 和节点 ID 的值。这可以通过一个简单的密码语句来完成(下面的示例对所有城市节点执行此操作):

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,您必须指定 latlondistanceInKm.

问题 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)和 returns 新节点的 id 列表。对于它们中的每一个发出 REST 调用以将节点添加到地理索引。

问题 3

上面已经回答了:-)