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

时间:2015-04-09 22:19:07

标签: neo4j cypher

我希望有人可以提供有关向Spatial添加节点的更新说明。我能找到的最好的指示是:<​​/ p>

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

然而,它差不多有两年了,并且有一些与公认的错误(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添加Spatial索引(通过cURL或REST),我可以使用LOAD CSV插入节点并能够通过REST和Cypher查询Spatial插件吗?

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

谢谢,我期待着这一切得到解决!!

1 个答案:

答案 0 :(得分:12)

问题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能够很好地实现空间播放,需要进行黑客攻击:每个地理索引节点都应携带一个名为id的属性,其值为node id。这可以通过简单的cypher语句来完成(下面的示例对所有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,您必须指定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)并返回新节点的id列表。对于它们中的每一个,都发出REST调用以将节点添加到地理索引。

问题3

上面已经回答: - )