我希望有人可以提供一些关于向Spatial添加节点的更新说明.我能找到的最好的指示是:
当REST调用返回数据时,Neo4j Spatial"WithinDistance"Cypher查询返回空
然而它已经快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添加Spatial索引(通过cURL或REST),我可以使用LOAD CSV插入节点并能够通过REST和Cypher查询Spatial插件吗?
3)如果我使用REST来插入我的节点,我需要做什么调用(以什么顺序)以确保我可以通过REST和Cypher(Web浏览器)进行查询?
谢谢,我很期待这一切都得到解决!
Ste*_*ter 12
首先需要初始化一次图层并使用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"
}
Run Code Online (Sandbox Code Playgroud)
和:
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"
}
}
Run Code Online (Sandbox Code Playgroud)
通过事务端点使用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
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
并将其添加到空间索引中 - 确保采用具有上一个请求返回的节点的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>"
}
Run Code Online (Sandbox Code Playgroud)
为了使Cypher能够很好地实现空间播放,需要进行黑客攻击:每个地理索引节点都应该携带一个id使用节点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)" }
]
}
Run Code Online (Sandbox Code Playgroud)
有了这些,您可以使用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" : {}
}
]
}
Run Code Online (Sandbox Code Playgroud)
注:为withinDistance您必须指定lat,lon,distanceInKm.
如上所述,您需要单独的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调用以将节点添加到地理索引.
上面已经回答:-)
| 归档时间: |
|
| 查看次数: |
1264 次 |
| 最近记录: |