Neo4j Spatial 'WithinDistance' Cypher 查询返回空,而 REST 调用返回数据

标签 neo4j spatial

我有似乎是正确配置的空间层和索引,并且可以使用 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)

inode :
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}

最佳答案

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

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

因此,您只需添加两种方式中的一种即可。我在您的原始电子邮件中没有看到任何提及 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}

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

关于Neo4j Spatial 'WithinDistance' Cypher 查询返回空,而 REST 调用返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17966722/

相关文章:

java - Neo4J POJO 方法

neo4j - Neo4j 中的多行执行

c# - DbGeography.PointFromText 错误异常已被调用的目标抛出

r - 分区统计 R(栅格/多边形)

database - 存储简单空间数据的最佳方式是什么

sql-server - STintersects() 找到交点

r - 从 R 中的嵌套列表创建 sfc-column

Neo4j,匹配关系 WHERE AND

neo4j - 在 Neo4j 中为每个查询返回前 n 个结果

java - 为 Neo4j 节点实体生成分层数据