3

我正在使用 Neo4j 2.0 的空间服务器插件,并按照http://neo4j.github.io/spatial/上的指南添加了一个名为 Stockholm 的节点。

:POST http://localhost:7475/db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer
{
  "layer" : "geom",
  "lat" : "lat",
  "lon" : "lon"
}
:POST http://localhost:7475/db/data/index/node/
{
  "name" : "geom",
  "config" : {
    "provider" : "spatial",
    "geometry_type" : "point",
    "lat" : "lat",
    "lon" : "lon"
  }
}
:POST http://localhost:7475/db/data/node
{
  "lat" : 60.1,
  "lon" : 15.2,
  "name" : "Stockholm"
}
:POST http://localhost:7475/db/data/ext/SpatialPlugin/graphdb/addNodeToLayer
{
  "layer" : "geom",
  "node" : "http://localhost:7475/db/data/node/4"
}

我可以通过 REST 检索节点:

:POST http://localhost:7475/db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance
{
  "layer" : "geom",
  "pointX" : 15.0,
  "pointY" : 60.0,
  "distanceInKm" : 100
}

但不是下面的密码查询。这是为什么?我在这里做任何明显的错误吗?

START n=node:geom('withinDistance:[60.0,15.0, 100.0]') RETURN n;
4

2 回答 2

4

我刚刚发现您不必如上所述将节点添加到索引中,至少对于 Neo4j 2.1.2 和 Neo4j Spatial 0.13-neo4j-2.1.2 来说不是。

创建节点后,将设置为用户“id”属性的属性添加到 Neo4j 节点 id 值。密码空间查询现在可以工作了。所以,如果你添加 cypher 命令

start n=node(4) n.id = id(n)

查询将起作用。

显然还有其他方法可以形成 Cypher 语句。事实上,您可以通过几个批量步骤完成所有这些操作。您可以将所有节点添加到 RTree 图(使用 REST、Java、批量 shp 文件加载器等),在每个节点上创建自引用用户“id”属性,然后创建空间索引(问题中的第二个 REST 命令邮政)。

您看到的问题似乎来自 REST addNodeToLayer 进程和 Cypher“将节点添加到索引”进程之间的断开连接。Cypher 进程从原始节点创建仅包含几何属性(纬度/经度、wkt 等)的第二个节点,并将该节点添加到 RTree 图中。该节点有一个名为“id”的用户属性,其值为原始节点的 Neo4j 节点 ID。REST(或Java)addNodeToLayer 过程直接将原始节点添加到RTree 图中,不创建副本。它也不会在节点上设置名为“id”的用户属性。

如果您使用 Cypher 方法将节点添加到 RTree 图中,您会发现 REST 查询返回给您的节点是复制节点,而不是原始节点。当您使用 Cypher 方法执行相同的查询时,您将获得原始节点。Cypher 查询中的底层代码通过使用查询找到的复制节点上的用户“id”属性来返回原始节点以获取原始节点。当 Cypher 查询最初找到的节点不包含可以取消引用的 id 属性时,Cypher 查询会静默失败,您会得到 0 个结果。

通过向 RTree 图中的每个数据节点添加自引用 id 属性,Cypher 查询能够成功找到要返回的节点。

使用上一个答案中描述的 REST 方法是可行的,但它最终会使几何存储成本增加一倍,因为它会复制原始节点上保存的几何信息。使用该方法时,Cypher 和 REST 查询返回的结果也彼此不同。使用我描述的方法可以节省空间并统一 Cypher 和 REST 查询行为。

于 2014-07-11T15:06:16.807 回答
2

为了使用 Cypher 进行查询,您需要将每个节点添加到索引中:

    :POST http://localhost:7474/db/data/index/node/geom
    {
      'value': 'dummy', 
      'key': 'dummy', 
      'uri': 'http://localhost:7474/db/data/node/NODE_ID_HERE'
    }

我最近写了一篇关于开始使用 Neo4j Spatial 的博客文章,其中包括: http: //lyonwj.com/mapping-the-worlds-airports-with-neo4j-spatial-and-openflights-part-1/

于 2014-03-15T14:21:57.120 回答