【问题标题】:Update to: Adding node to Neo4j Spatial Index更新到:将节点添加到 Neo4j 空间索引
【发布时间】:2015-06-15 12:01:03
【问题描述】:

我希望有人可以提供一些关于向 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(网络浏览器)进行查询?

谢谢,我期待这一切都能解决!

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    问题 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,您必须指定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

    上面已经回答了:-)

    【讨论】:

    • 您好 Stefan,感谢您提供的信息以及持续的帮助和支持!您在上面引用了“将节点添加到空间索引”,但您只引用了 addNodeToLayer 端点,而我在任何地方都看不到 /db/data/index/node/geom 端点。你能澄清一下吗?我只需要添加到图层而不是空间索引吗?还是索引而不是图层?或两者?如果两者都有,按什么顺序(如果顺序很重要)?
    • afaik addNodeToLayer 也将其隐式添加到索引中。我已经尝试了描述的操作序列和最后返回结果的密码查询
    • @StefanArmbruster Stefan,如何将所有节点添加到层?
    • 为您要添加的所有节点调用/db/data/ext/SpatialPlugin/graphdb/addNodeToLayer
    • 我使用了/db/data/transaction/commit,因为我想尽可能使用 Cypher。您也可以使用 /db/data/node 端点 - 您的选择。
    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多