gpt4 book ai didi

neo4j - 更新至: Adding node to Neo4j Spatial Index

转载 作者:行者123 更新时间:2023-12-02 04:22:31 27 4
gpt4 key购买 nike

我希望有人能够提供一些有关向 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# 作为属性插入到节点中,但不要将节点插入到几何索引中。

我的首要任务是能够通过 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 创建具有经/纬度属性的节点:

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 很好地配合,需要进行一些修改:每个地理 inode 都应该携带一个名为 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 创建具有经/纬度属性的节点。在预处理步骤中,运行类似 MATCH (n:City) where not has(n.id) set n.id = id(n) return id(n) as id 的语句。这将设置 id 属性(上面描述的 hack)并返回新节点的 id 列表。对于它们中的每一个,都会发出 REST 调用以将节点添加到地理索引。

问题 3

上面已经回答了:-)

关于neo4j - 更新至: Adding node to Neo4j Spatial Index,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29550050/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com