8

我有似乎是正确配置的空间层和索引,并且可以使用 findGeometriesWithinDistance REST API 调用成功查询节点。

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

但是,当使用密码查询时,我没有得到任何结果(我尝试颠倒 60.0 和 15.0 的顺序但没有运气):

START n=node:geom('withinDistance:[60.0, 15.0, 500.0]') return n;

赛珀回报:

==> +---+
==> | n |
==> +---+
==> +---+
==> 0 row
==> 
==> 13 ms

休息:

200 OK
==> [ {
==>   "paged_traverse" : "http://localhost:7474/db/data/node/14472/paged/traverse/{returnType}{?pageSize,leaseTime}",
==>   "outgoing_relationships" : "http://localhost:7474/db/data/node/14472/relationships/out",
==>   "data" : {
==>     "lon" : 15.2,
==>     "bbox" : [ 15.2, 60.1, 15.2, 60.1 ],
==>     "RaceName" : "Parador Es Muy Caliente",
==>     "lat" : 60.1,
==>     "gtype" : 1
==>   },
==>   "all_typed_relationships" : "http://localhost:7474/db/data/node/14472/relationships/all/{-list|&|types}",
==>   "traverse" : "http://localhost:7474/db/data/node/14472/traverse/{returnType}",
==>   "self" : "http://localhost:7474/db/data/node/14472",
==>   "all_relationships" : "http://localhost:7474/db/data/node/14472/relationships/all",
==>   "property" : "http://localhost:7474/db/data/node/14472/properties/{key}",
==>   "properties" : "http://localhost:7474/db/data/node/14472/properties",
==>   "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/14472/relationships/out/{-list|&|types}",
==>   "incoming_relationships" : "http://localhost:7474/db/data/node/14472/relationships/in",
==>   "incoming_typed_relationships" : "http://localhost:7474/db/data/node/14472/relationships/in/{-list|&|types}",
==>   "extensions" : {
==>   },
==>   "create_relationship" : "http://localhost:7474/db/data/node/14472/relationships"
==> } ]

REST 调用重现:创建层:

POST /db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer { "layer":"geom", "lat":"lat", "lon":"lon" }

创建索引:

POST /db/data/index/node/ {"name":"geom", "config":{"provider":"spatial", "geometry_type":"point","lat":"lat","lon":"lon"}}

创建节点:

POST /db/data/node {"lat":60.2,"lon":15.1,"RaceName":"Parador Es Muy Caliente"}

(作为回应,检查“self”并找到 nodeid)

索引节点:

POST /db/data/ext/SpatialPlugin/graphdb/addNodeToLayer {"layer":"geom", "node":"http://localhost:7474/db/data/node/###NEW_NODE_ID###"}

寻找:

POST /db/data/ext/SpatialPlugin/graphdb/findGeometriesWithinDistance {"layer":"geom","pointX":15.0,"pointY":60.0,"distanceInKm":100.0}
4

2 回答 2

7

我对此进行了调查,这与我们多次看到的问题有关。空间库的设计不一致之处在于,有两种方法可以将节点添加到空间索引中。一种是将其添加到层(使用 addNodeToLayer REST 调用),这使用底层 Java API 将节点直接连接到 RTree 作为同一图形的一部分。另一种是在索引图中创建一个代理节点,这样你的域图就不会连接到索引图上。第二种方法仅由 IndexProvider 接口采用(使用 /db/data/index/node/geom REST 调用)。

如果同时调用这两种方法,节点会被添加两次,一次是直接添加,一次是通过代理添加。问题是 Cypher withinDistance 索引查询仅访问 IndexProvider 接口,并且只会返回未连接到索引的节点。所以如果你以两种方式添加节点,它不会被返回。

因此,您只需添加两种方式中的一种即可。我在您的原始电子邮件中没有看到任何提及 addNodeToLayer,所以我怀疑 SDN 可能正在调用 addNodeToLayer(也许 Michael 可以评论),在这种情况下,您不能使用密码调用。

在我的测试过程中,我能够使用 Cypher 手动删除一个索引关系,如下所示:

开始 n=node(13065) 匹配 (n)<-[r:RTREE_REFERENCE]-() 删除 r

将数字 13065 替换为原始节点的节点 ID。

我在 neo4j 浏览器(在 2.1.2 中)中做了以下操作:

:POST /db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer { "layer":"geom", "lat":"lat", "lon":"lon" }
:POST /db/data/index/node/ {"name":"geom", "config":{"provider":"spatial", "geometry_type":"point","lat":"lat","lon":"lon"}}
:POST /db/data/node {"lat":60.2,"lon":15.1,"RaceName":"Parador Es Muy Caliente"}
:POST /db/data/index/node/geom {"value":"dummy","key":"dummy", "uri":"http://localhost:7474/db/data/node/13071"}

这创建了一个节点不直接连接到索引的图。在这种情况下,REST 调用“findGeometriesWithinDistance”不起作用(使用标准 Java API),而密码“withinDistance”起作用。我用这个命令测试过:

start n = node:geom("withinDistance:[60.2,15.1,100.0]") return n

请注意,不幸的是,此 API 将顺序设置为 lat,lon,而不是更标准的 lon,lat。

然后我也添加到层(即直接添加到索引图):

:POST /db/data/ext/SpatialPlugin/graphdb/addNodeToLayer {"layer":"geom", "node":"http://localhost:7474/db/data/node/13071"}

现在,当我使用 cypher 命令搜索时,我仍然得到相同的正确答案,但是当我使用 REST 命令搜索时:

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

我发现这会返回代理节点而不是原始节点。

于 2014-08-22T11:57:06.813 回答
4

这是一个错误,如果需要,请参阅https://github.com/neo4j/spatial/issues/106,随意调查,似乎是 SpatialRecordHits.java 中的迭代!

同时,确保在通过索引查询之前将节点添加到索引中,因为这会创建正确的节点结构。

于 2013-07-31T16:08:43.383 回答